powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Subject:Целостность данных - проектирование БД
7 сообщений из 7, страница 1 из 1
Subject:Целостность данных - проектирование БД
    #32798823
Nerian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Чтот я до сих пор не могу понять одну важную вещь в реляционых моделях БД. Допустим есть две таблицы:
customs:
id - autoincrement int not null primary key
name - varchar(25)
state - int
states:
id - autoincrement int not null primary key
name - varchar(25)

customs - хранит название заказа, и ссылку на состояние.
Понятно чтобы получить какой заказ на каком состояние очень просто:
select customs.name as cname,states.name as sname where customs.state = states.id;
Но вот как быть если состояние было удалено?
То тогда в нашем примере мы потеряем заказы в этом состояние.
Как бы это обойти? Чтобы осталась возможность добовлять/удалять новыве состояния, и не было потери данных.
И ещё вопрос: например как в форумах с регистрацией сделано что после того как пользователь удалил свой аккаунт, письма не удаляються, а остаються с его ником? вот мнеб чтот на подобии надо. Плиз всем помогите.
...
Рейтинг: 0 / 0
Subject:Целостность данных - проектирование БД
    #32798858
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНо вот как быть если состояние было удалено?
Для связанных таблиц задается внешний ключ который просто не даст удалить состояние если на него есть ссылки.
Только это используется для ссылок на справочники (Например: заявка, в работе, готово и т.п.) которые не нужно постоянно менять.
А если у тебя состояние заносится произвольно, то это не справочник, а просто табличка для облегчения выбора из наиболее часто применяемых состояний.
В этом случае состояние хранится в самой заявке и state - int не нужно.
...
Рейтинг: 0 / 0
Subject:Целостность данных - проектирование БД
    #32798900
drptz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще добавить в таблицу states признак актуальности записи:
states:
id - autoincrement int not null primary key
name - varchar(25)
sign_actual - tinyint
(1 - запись актуальна, 0 - неактуальна)

"Удаляется" запись установкой sign_actual в 0.
Потом, при выводе в прикладнухе данного справочника(?) просто добавить условие на проверку актуальности.

Вобщем выбирай как тебе удобнее будет.
...
Рейтинг: 0 / 0
Subject:Целостность данных - проектирование БД
    #32799230
Nerian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем большое за ответы. Мой мозг потихоньку разгрузился :).

Цитата:
"...то это не справочник, а просто табличка для облегчения выбора из наиболее часто применяемых состояний."

У меня в ТЗ написано что нужно добавить возможность последующего добавления этих состояних. Тоесть они могут менять. И это всё будет в списке, мне кажеться глупо использовать Group By чтобы узнать какие состояния были (если они будут храниться в заявке). Как быть в этом случае?
...
Рейтинг: 0 / 0
Subject:Целостность данных - проектирование БД
    #32799490
olk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы в этом случае последовал совету drptz
т.е не давал бы реально удалять записи из states а выставлял флаг типа isdel,
тогда при просмотре и выборе было бы что то типа,
Код: plaintext
select name from states where isdel= 0 
а при посмотре custom можно как то помечать выводимые записи
с несуществующими уже сейчас состояниями.
так же полезно сделать административную функцию подчистки custom c isdrl==1 на которых нет ссылок из custom , что бы не засорять его совсем "умершими" записями
...
Рейтинг: 0 / 0
Subject:Целостность данных - проектирование БД
    #32799835
ASU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASU
Гость
NerianЗдравствуйте. Чтот я до сих пор не могу понять одну важную вещь в реляционых моделях БД. Допустим есть две таблицы:
customs:
id - autoincrement int not null primary key
name - varchar(25)
state - int
states:
id - autoincrement int not null primary key
name - varchar(25)

customs - хранит название заказа, и ссылку на состояние.
Понятно чтобы получить какой заказ на каком состояние очень просто:
select customs.name as cname,states.name as sname where customs.state = states.id;
Но вот как быть если состояние было удалено?
То тогда в нашем примере мы потеряем заказы в этом состояние.
Как бы это обойти? Чтобы осталась возможность добовлять/удалять новыве состояния, и не было потери данныхПонять реляционную модель можно... изучив ее (а заодно и предметную область). Попробую пояснить на Вашем примере. Вы не задумывались над тем, что такое состояние заказа? Как изменяется состояние? Задумывались. Теперь давайте задумаемся еще раз.
1. Состояние заказа выписан/заведен;
2. Состояние заказа оплачен (когда в системе есть документ, подтверждающий оплату заказа);
3. Состояние заказа получен/отгружен (когда в системе есть документ, подтверждающий получение/отгрузку заказа).
И т.д.
Смотрим стандарте SQL-92 раздел ссылочной целостности. Ставим на внешние ключи ссылочных таблиц ограничение NO ACTION для операции удаления. Теперь, если на заказ ссылаются документы оплаты/получения/выписки, то такой заказ СУБД удалить не даст.
Возможно, Вам уже не потребуется поле STATE, по той простой причине, что состояние заказа можно определять по сопутствующим документам, что правильнее.
...
Рейтинг: 0 / 0
Subject:Целостность данных - проектирование БД
    #32800668
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторselect ... where customs.state = states.id;
...возможность добавления этих состояний...
Если тебе нужны выборки по состоянию (например: 'в работе'), то тогда для всех заказов должен быть определен единый справочник всех возможных состояний, но только не надо туда забивать всякую дрянь...
(любые коментарии для заказа - в отдельное поле...)

Вот только как одним состоянием для выборки обойтись для 'закрытых' заказов? (а их будет все больше и больше...)
Однако нужно что-то типа даты...

А если состояние произвольное и выборка идет по датам запуска/окончания, то перечень состояний в этой выборке можно получить:
SELECT DISTINCT state FROM customs WHERE...

авторcustoms:
id - autoincrement int not null primary key
name - varchar(25)
state - int
автор...узнать какие состояния были ...
Твоя табличка хранит только одно текущее состояние и по ней нельзя узнать что было...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Subject:Целостность данных - проектирование БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]