Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизПравильный дроп таблицы Найти похожие ветки
← →
Незнакомец (2006-01-25 08:59) [0]Доброго времени суток!
Проблема : таблицы удаляются через раз, по непонматно причине...
Я вот думаю, мож ли явится причиной то, что например, один пользователь добаляет в таблицу, а другой пытается ее удалить?
Если так надо как-то определить что с таблицей никто не работает, а если и работает, то заблокировать таблицу и удалить ее...
Правильно ли я рассуждаю и как это сделать? :)
← →
ANB © (2006-01-25 09:16) [1]Неправильно активно дропать на ходу таблицы. Если они тебе потом не нужны - так создавай временные.
← →
Незнакомец (2006-01-25 09:23) [2]Почему? дело в том что одна таблица это одна ветка форума, и соответственно чтобы удалить ветку форума мне надо и таблицу дропнуть...
← →
Ega23 © (2006-01-25 09:28) [3]
> Почему? дело в том что одна таблица это одна ветка форума,
> и соответственно чтобы удалить ветку форума мне надо и
> таблицу дропнуть...
>
Ужос. Почему не "деревянная" таблица?
← →
Незнакомец (2006-01-25 09:32) [4]
> Ужос. Почему не "деревянная" таблица?
Я в этом не силен, будьте добры объяснить в чем моя ошибка? Я только начал работать с БД и решил учится на создании простенького форума, резные темы простое добавление сообщений и все. На сколько я понял я даже не правильно БД спроецировал? или что?
← →
Незнакомец (2006-01-25 09:32) [5]
> Ужос. Почему не "деревянная" таблица?
Я в этом не силен, будьте добры объяснить в чем моя ошибка? Я только начал работать с БД и решил учится на создании простенького форума, резные темы простое добавление сообщений и все. На сколько я понял я даже не правильно БД спроецировал? или что?
← →
Ega23 © (2006-01-25 09:39) [6]
> На сколько я понял я даже не правильно БД спроецировал?
> или что?
>
Êîíå÷íî. Óäàëåíèå òàáëèöû - æåñòîêàÿ îïåðàöèÿ.
Ñäåëàé что-то типа
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
← →
Незнакомец (2006-01-25 09:47) [7]
> Ega23 ©
Не будете ли вы так любезны и объясните что это, я же говорил что я только начал изучать данную тему?
← →
Ega23 © (2006-01-25 09:53) [8]
> Не будете ли вы так любезны и объясните что это, я же говорил
> что я только начал изучать данную тему?
Обьясняю. Что такое "дерево" знаешь? Это подвид графа, где каждый элемент ссылается на своего родителя. У первого элемента "родителя" нет, он считается корнем.
Вот данная таблица и есть представление этого дерева.
TopID - уникальный идентификатор топика
ParTopID - ссылка на родительский топик
TopName - название топика
TopURL - адрес топика
TopType - тип топика (вторичный ключ на таблицу TopicTypes)
TopMsg - собственно сам текст сообщения.
Естественно, это навскидку. Как я сам бы такую вещь делал.
← →
Незнакомец (2006-01-25 09:56) [9]
> 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:59) [10]
> Удаляется кючевое поле, потом что-то проверяется и удаляется
> таблица? :)
Ну, это аккуратное удаление таблицы.
Сначала удаляется constraint (не ключевое поле, а именно связь между ParTopID и TopID). Потом проверяется наличие таблицы Topics в БД, и если таковая имеется, то она удаляетя.
← →
Sergey13 © (2006-01-25 10:01) [11]2[5] Незнакомец (25.01.06 09:32)
> На сколько я понял я даже не правильно БД спроецировал? или что?
Угу. Неправильно. Если простенько, то можно и без "дерева" обойтись. Надо 4 таблицы - "Темы", "Топики", "Содержание топиков" и "Авторы". Связать их правильно как 1:много внешними ключами.
← →
Незнакомец (2006-01-25 10:03) [12]Еще вопросик:
Вообщем, у меня такая структура БД:
1) есть главная таблица из 2 колонок в которой хранятся имена всех форумов и имя самой таблицы форума, например,
| Форум | Имя таблицы|
| Обсуждение погоды | thread1 |
| Машины | thread2 |
2) Далее в каждой теме(thread1, thread2 и т.д.) имеется ряд колонок
| Тема | От кого | Имя таблицы |
| сегодня холодно | Вася | df4hkjsdjfkhjk34 |
| Жара | Сюзька | fkjgdfjg4jtwl90sf |
То есть каждая ветка форума это отдельная таблица...
3) Ну и в каждой конкретной таблице отдельной ветки форума храняться сообщения...
Вопрос: правильная ли является данная структура, если не то, что исправить? и вообще как надо правильно? :)
Я еще думал о другой структуре БД:
1) Создать таблицы всех постов, допустим со след столбцами:
| Тема | От кого | IDForumaPosts |
2) И создать таблицу форумов:
| Тема | От кого | IDForuma |
Принцып работы следующий, выводим на экран содержимое таблицы форумов, то есть по сути названия форумов. Далее делаем селективный SQL-запрос из таблицы постов WHERE (IDForumsPosts = IDForuma) тем самым отбирая собщения по конкретному форуму...
Какая структура правельнее или может они обе бредовые?
← →
Ega23 © (2006-01-25 10:04) [13]
> Если простенько, то можно и без "дерева" обойтись. Надо
> 4 таблицы - "Темы", "Топики", "Содержание топиков" и "Авторы".
> Связать их правильно как 1:много внешними ключами.
>
Кстати да. Так проще будет. С деревом намучаешься, если начинающий. Всякие рекурсивные обходы и т.п.
Наверное, Сергей прав. Начни с такой структуры.
← →
Незнакомец (2006-01-25 10:05) [14]
> Угу. Неправильно. Если простенько, то можно и без "дерева"
> обойтись. Надо 4 таблицы - "Темы", "Топики", "Содержание
> топиков" и "Авторы". Связать их правильно как 1:много внешними
> ключами.
Я не умею работать со связанными таблицами :(
← →
Ega23 © (2006-01-25 10:06) [15]
> Я не умею работать со связанными таблицами :(
Потерпи минут 20, я сейча чуток занят, попозже накидаю тебе структуру.
← →
Незнакомец (2006-01-25 10:07) [16]Интересная, а какая структура БД у данного форума? :)
← →
Незнакомец (2006-01-25 10:07) [17]
> Потерпи минут 20, я сейча чуток занят, попозже накидаю тебе
> структуру.
Ждус :)
← →
Sergey13 © (2006-01-25 10:08) [18]2[14] Незнакомец (25.01.06 10:05)
> Я не умею работать со связанными таблицами :(
Учись. Никто не умел в начале. Связи (реляции) - основа реляционных БД.
← →
Незнакомец (2006-01-25 10:10) [19]
> Учись. Никто не умел в начале. Связи (реляции) - основа
> реляционных БД.
Не подкинете информации по данному вопросу? только на поисковики не пинайте :)
← →
Sergey13 © (2006-01-25 10:14) [20]2[19] Незнакомец (25.01.06 10:10)
> только на поисковики не пинайте :)
Лучше я тебя "пну" в книжный магазин. Любая книжка, где в названии присутствует "Базы Данных" - то что тебе надо. Это во всех отражено. Лучше конечно, если упор и примеры будут по той БД, с которой работать хочешь.
← →
Незнакомец (2006-01-25 10:17) [21]
> Sergey13 ©
С MSSQL хочу :)
А что скажите по предложенным мной структурам БД?
← →
Ega23 © (2006-01-25 10:18) [22]
/*==============================================================*/
/* 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
← →
Ega23 © (2006-01-25 10:19) [23]Приблизительно так. Это без дерева.
Расшифровывать надо? Или сам разберёшься?
← →
Незнакомец (2006-01-25 10:24) [24]Думаю коментарии лишними не будут :)
← →
Sergey13 © (2006-01-25 10:29) [25]2[21] Незнакомец (25.01.06 10:17)
> А что скажите по предложенным мной структурам БД?
Это которые в [12]? Это похоже вроде на "мой" вариант, только денормализовано (про нормализацию читать в книгах).
← →
Незнакомец (2006-01-25 10:33) [26]
> только денормализовано
В общих чертах что это значит?
← →
Ega23 © (2006-01-25 10:41) [27]Загони мой скрипт на базу, посмотри визуально, что получится.
Многое понятно станет.
← →
Незнакомец (2006-01-25 10:49) [28]Server: Msg 4902, Level 16, State 1, Line 7
Cannot alter table "Messages" because this table does not exist in database "master".
Server: Msg 4902, Level 16, State 1, Line 2
Cannot alter table "Messages" because this table does not exist in database "master".
Server: Msg 4902, Level 16, State 1, Line 2
Cannot alter table "Topics" because this table does not exist in database "master".
Server: Msg 4902, Level 16, State 1, Line 2
Cannot alter table "Topics" because this table does not exist in database "master".
Server: Msg 8147, Level 16, State 1, Line 5
Could not create IDENTITY attribute on nullable column "TopID", table "Messages".
Server: Msg 8147, Level 16, State 1, Line 5
Could not create IDENTITY attribute on nullable column "PersID", table "Messages".
Server: Msg 2744, Level 16, State 1, Line 5
Multiple identity columns specified for table "Messages". Only one identity column per table is allowed.
Server: Msg 8147, Level 16, State 1, Line 5
Could not create IDENTITY attribute on nullable column "PersID", table "Topics".
Server: Msg 2744, Level 16, State 1, Line 5
Multiple identity columns specified for table "Topics". Only one identity column per table is allowed.
Server: Msg 4902, Level 16, State 1, Line 2
Cannot alter table "Messages" because this table does not exist in database "master".
Server: Msg 4902, Level 16, State 1, Line 2
Cannot alter table "Messages" because this table does not exist in database "master".
Server: Msg 4902, Level 16, State 1, Line 2
Cannot alter table "Topics" because this table does not exist in database "master".
Server: Msg 4902, Level 16, State 1, Line 2
Cannot alter table "Topics" because this table does not exist in database "master".
← →
Sergey13 © (2006-01-25 10:53) [29]2 [26] Незнакомец (25.01.06 10:33)
> В общих чертах что это значит?
Это значит, что вместо
| Тема | От кого | IDForumaPosts |
должно быть
| ИД_Темы | ИД_От кого | IDForumaPosts |
← →
Ega23 © (2006-01-25 10:55) [30]
> Незнакомец (25.01.06 10:49) [28]
Ты чё, обалдел???? Нафига на master-то накатил????
Хочешь сервер порушить?
← →
Ega23 © (2006-01-25 10:59) [31]Messages - во вторичных ключах (PersID и TopID) Identity убери.
Это у меня PowerDesigner глюкнул, а я внимания не обратил.
В Topics на PersID - тоже.
← →
Незнакомец (2006-01-25 10:59) [32]Хрен редьки не слаще, пробовал в отдельной мною созданной БД, тоже самое...
← →
Незнакомец (2006-01-25 11:09) [33]Все... понял что ты имел ввиду :) забавно...
← →
Ega23 © (2006-01-25 11:09) [34]
> Все... понял что ты имел ввиду :) забавно...
Разобрался?
← →
Незнакомец (2006-01-25 11:11) [35]Только не пойму зачем TopicTypes ? и какие поля за что отвечают?
← →
Ega23 © (2006-01-25 11:19) [36]
> Только не пойму зачем TopicTypes ? и какие поля за что отвечают?
Если аналогию с данным форумом профодить, то
TopicTypes - аналог конференций (Основная, Базы, и т.п.)
Topics - ветки сообщения
Messages - собственно сами сообщения.
Persons - посетители сайта.
Ссылка на Persons из Topics - определяет человека, создавшего ветку.
Ссылка на Persons из Messages - определяет человека, ответившего.
Всё просто.
← →
Sergey13 © (2006-01-25 11:22) [37]2Ega23 ©
ИМХО, зря ты ему скрипт дал. Мне не жалко, просто мне кажется такие вещи надо учится делать самому. А подобные скрипты способствуют желанию использовать их как болванку для всего последующего.
Все сугубо ИМХО и не в качестве какого либо наезда.
← →
Ega23 © (2006-01-25 11:26) [38]
> ИМХО, зря ты ему скрипт дал. Мне не жалко, просто мне кажется
> такие вещи надо учится делать самому.
В идеале, я бы скрин-шот из PowerDesigner дал.Но такой возможности нету.
← →
Незнакомец (2006-01-25 11:26) [39]Понятно :)
TopTypCod int not null,
TopTypNam varchar(64) not null,
TopTypLab varchar(32) not null,
TopTypImg image null,
Тут TopTypCod и TopTypNam это понятно ID и описание форума, а на кой TopTypLab и TopTypImg?
← →
Ega23 © (2006-01-25 11:29) [40]Lab - это сокращённое название. Img - картинка.
Не нужно - выкини.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.012 c