![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильный дроп таблицы [D7, MSSQL]
Незнакомец © (2006-01-25 08:59:00)Доброго времени суток!
Проблема : таблицы удаляются через раз, по непонматно причине...
Я вот думаю, мож ли явится причиной то, что например, один пользователь добаляет в таблицу, а другой пытается ее удалить?
Если так надо как-то определить что с таблицей никто не работает, а если и работает, то заблокировать таблицу и удалить ее...
Правильно ли я рассуждаю и как это сделать? :)
Sergey13 (2006-01-25 10:29:00) [21]2[21] Незнакомец (25.01.06 10:17)
> А что скажите по предложенным мной структурам БД?
Это которые в [12]? Это похоже вроде на "мой" вариант, только денормализовано (про нормализацию читать в книгах).
Незнакомец (2006-01-25 10:24:00) [22]Думаю коментарии лишними не будут :)
Ega23 (2006-01-25 10:19:00) [23]Приблизительно так. Это без дерева.
Расшифровывать надо? Или сам разберёшься?
Ega23 (2006-01-25 10:18:00) [24]
/*==============================================================*/
/* Database name: PhysicalDataModel_1 */
/* DBMS name: Microsoft SQL Server 2000 */
/* Created on: 25.01.2006 10:22:40 */
/*==============================================================*/
alter table Messages
drop constraint FK_MESSAGES_REFERENCE_TOPICS
go
alter table Messages
drop constraint FK_MESSAGES_REFERENCE_PERSONS
go
alter table Topics
drop constraint FK_TOPICS_REFERENCE_TOPICTYP
go
alter table Topics
drop constraint FK_TOPICS_REFERENCE_PERSONS
go
if exists (select 1
from sysobjects
where id = object_id('Messages')
and type = 'U')
drop table Messages
go
if exists (select 1
from sysobjects
where id = object_id('Persons')
and type = 'U')
drop table Persons
go
if exists (select 1
from sysobjects
where id = object_id('TopicTypes')
and type = 'U')
drop table TopicTypes
go
if exists (select 1
from sysobjects
where id = object_id('Topics')
and type = 'U')
drop table Topics
go
/*==============================================================*/
/* Table: Messages */
/*==============================================================*/
create table Messages (
MessID int Identity(0,1) not null,
TopID int Identity(0,1) null,
PersID int Identity(0,1) null,
MessText varchar(2000) not null,
constraint PK_MESSAGES primary key (MessID)
)
go
/*==============================================================*/
/* Table: Persons */
/*==============================================================*/
create table Persons (
PersID int Identity(0,1) not null,
PersNam1 varchar(32) not null,
PersNam2 varchar(32) not null,
PersNam3 varchar(32) not null,
PersImg image null,
constraint PK_PERSONS primary key (PersID)
)
go
/*==============================================================*/
/* Table: TopicTypes */
/*==============================================================*/
create table TopicTypes (
TopTypCod int not null,
TopTypNam varchar(64) not null,
TopTypLab varchar(32) not null,
TopTypImg image null,
constraint PK_TOPICTYPES primary key (TopTypCod)
)
go
/*==============================================================*/
/* Table: Topics */
/*==============================================================*/
create table Topics (
TopID int Identity(0,1) not null,
TopTypCod int null,
PersID int Identity(0,1) null,
TopNam varchar(64) not null,
TopDate datetime not null,
constraint PK_TOPICS primary key (TopID)
)
go
alter table Messages
add constraint FK_MESSAGES_REFERENCE_TOPICS foreign key (TopID)
references Topics (TopID)
go
alter table Messages
add constraint FK_MESSAGES_REFERENCE_PERSONS foreign key (PersID)
references Persons (PersID)
go
alter table Topics
add constraint FK_TOPICS_REFERENCE_TOPICTYP foreign key (TopTypCod)
references TopicTypes (TopTypCod)
go
alter table Topics
add constraint FK_TOPICS_REFERENCE_PERSONS foreign key (PersID)
references Persons (PersID)
go
Незнакомец (2006-01-25 10:17:00) [25]
> Sergey13 ©
С MSSQL хочу :)
А что скажите по предложенным мной структурам БД?
Sergey13 (2006-01-25 10:14:00) [26]2[19] Незнакомец (25.01.06 10:10)
> только на поисковики не пинайте :)
Лучше я тебя "пну" в книжный магазин. Любая книжка, где в названии присутствует "Базы Данных" - то что тебе надо. Это во всех отражено. Лучше конечно, если упор и примеры будут по той БД, с которой работать хочешь.
Незнакомец (2006-01-25 10:10:00) [27]
> Учись. Никто не умел в начале. Связи (реляции) - основа
> реляционных БД.
Не подкинете информации по данному вопросу? только на поисковики не пинайте :)
Sergey13 (2006-01-25 10:08:00) [28]2[14] Незнакомец (25.01.06 10:05)
> Я не умею работать со связанными таблицами :(
Учись. Никто не умел в начале. Связи (реляции) - основа реляционных БД.
Незнакомец (2006-01-25 10:07:00) [29]
> Потерпи минут 20, я сейча чуток занят, попозже накидаю тебе
> структуру.
Ждус :)
Незнакомец (2006-01-25 10:07:00) [30]Интересная, а какая структура БД у данного форума? :)
Ega23 (2006-01-25 10:06:00) [31]
> Я не умею работать со связанными таблицами :(
Потерпи минут 20, я сейча чуток занят, попозже накидаю тебе структуру.
Незнакомец (2006-01-25 10:05:00) [32]
> Угу. Неправильно. Если простенько, то можно и без "дерева"
> обойтись. Надо 4 таблицы - "Темы", "Топики", "Содержание
> топиков" и "Авторы". Связать их правильно как 1:много внешними
> ключами.
Я не умею работать со связанными таблицами :(
Ega23 (2006-01-25 10:04:00) [33]
> Если простенько, то можно и без "дерева" обойтись. Надо
> 4 таблицы - "Темы", "Топики", "Содержание топиков" и "Авторы".
> Связать их правильно как 1:много внешними ключами.
>
Кстати да. Так проще будет. С деревом намучаешься, если начинающий. Всякие рекурсивные обходы и т.п.
Наверное, Сергей прав. Начни с такой структуры.
Незнакомец (2006-01-25 10:03:00) [34]Еще вопросик:
Вообщем, у меня такая структура БД:
1) есть главная таблица из 2 колонок в которой хранятся имена всех форумов и имя самой таблицы форума, например,
| Форум | Имя таблицы|
| Обсуждение погоды | thread1 |
| Машины | thread2 |
2) Далее в каждой теме(thread1, thread2 и т.д.) имеется ряд колонок
| Тема | От кого | Имя таблицы |
| сегодня холодно | Вася | df4hkjsdjfkhjk34 |
| Жара | Сюзька | fkjgdfjg4jtwl90sf |
То есть каждая ветка форума это отдельная таблица...
3) Ну и в каждой конкретной таблице отдельной ветки форума храняться сообщения...
Вопрос: правильная ли является данная структура, если не то, что исправить? и вообще как надо правильно? :)
Я еще думал о другой структуре БД:
1) Создать таблицы всех постов, допустим со след столбцами:
| Тема | От кого | IDForumaPosts |
2) И создать таблицу форумов:
| Тема | От кого | IDForuma |
Принцып работы следующий, выводим на экран содержимое таблицы форумов, то есть по сути названия форумов. Далее делаем селективный SQL-запрос из таблицы постов WHERE (IDForumsPosts = IDForuma) тем самым отбирая собщения по конкретному форуму...
Какая структура правельнее или может они обе бредовые?
Sergey13 (2006-01-25 10:01:00) [35]2[5] Незнакомец (25.01.06 09:32)
> На сколько я понял я даже не правильно БД спроецировал? или что?
Угу. Неправильно. Если простенько, то можно и без "дерева" обойтись. Надо 4 таблицы - "Темы", "Топики", "Содержание топиков" и "Авторы". Связать их правильно как 1:много внешними ключами.
Ega23 (2006-01-25 09:59:00) [36]
> Удаляется кючевое поле, потом что-то проверяется и удаляется
> таблица? :)
Ну, это аккуратное удаление таблицы.
Сначала удаляется constraint (не ключевое поле, а именно связь между ParTopID и TopID). Потом проверяется наличие таблицы Topics в БД, и если таковая имеется, то она удаляетя.
Незнакомец (2006-01-25 09:56:00) [37]
> Ega23 ©
Хе... да я понял структуру таблицы :) я немного не понял вот:
alter table Topics
drop constraint FK_TOPICS_REFERENCE_TOPICS
go
if exists (select 1
from sysobjects
where id = object_id('Topics')
and type = 'U')
drop table Topics
go
Именно этот момент я не пойму, я работал с элементарными конструкциями SELECT FROM... INSER... DELERE... UPDATE, поэтом немного не понятно :)
Удаляется кючевое поле, потом что-то проверяется и удаляется таблица? :)
Ega23 (2006-01-25 09:53:00) [38]
> Не будете ли вы так любезны и объясните что это, я же говорил
> что я только начал изучать данную тему?
Обьясняю. Что такое "дерево" знаешь? Это подвид графа, где каждый элемент ссылается на своего родителя. У первого элемента "родителя" нет, он считается корнем.
Вот данная таблица и есть представление этого дерева.
TopID - уникальный идентификатор топика
ParTopID - ссылка на родительский топик
TopName - название топика
TopURL - адрес топика
TopType - тип топика (вторичный ключ на таблицу TopicTypes)
TopMsg - собственно сам текст сообщения.
Естественно, это навскидку. Как я сам бы такую вещь делал.
Незнакомец (2006-01-25 09:47:00) [39]
> Ega23 ©
Не будете ли вы так любезны и объясните что это, я же говорил что я только начал изучать данную тему?
Ega23 (2006-01-25 09:39:00) [40]
> На сколько я понял я даже не правильно БД спроецировал?
> или что?
>
Êîíå÷íî. Óäàëåíèå òàáëèöû - æåñòîêàÿ îïåðàöèÿ.
Ñäåëàé что-то типа
alter table Topics
drop constraint FK_TOPICS_REFERENCE_TOPICS
go
if exists (select 1
from sysobjects
where id = object_id('Topics')
and type = 'U')
drop table Topics
go
/*==============================================================*/
/* Table: Topics */
/*==============================================================*/
create table Topics (
TopID Int Identity(0,1) not null,
ParTopID int null,
TopName varchar(64) not null,
TopURL varchar(255) not null,
TopType int not null,
TopMsg varchar(2000) not null,
constraint PK_TOPICS primary key (TopID)
)
go
alter table Topics
add constraint FK_TOPICS_REFERENCE_TOPICS foreign key (ParTopID)
references Topics (TopID)
go