Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Subject:Целостность данных - проектирование БД
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Чтот я до сих пор не могу понять одну важную вещь в реляционых моделях БД. Допустим есть две таблицы: 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; Но вот как быть если состояние было удалено? То тогда в нашем примере мы потеряем заказы в этом состояние. Как бы это обойти? Чтобы осталась возможность добовлять/удалять новыве состояния, и не было потери данных. И ещё вопрос: например как в форумах с регистрацией сделано что после того как пользователь удалил свой аккаунт, письма не удаляються, а остаються с его ником? вот мнеб чтот на подобии надо. Плиз всем помогите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2004, 00:11 |
|
||
|
Subject:Целостность данных - проектирование БД
|
|||
|---|---|---|---|
|
#18+
авторНо вот как быть если состояние было удалено? Для связанных таблиц задается внешний ключ который просто не даст удалить состояние если на него есть ссылки. Только это используется для ссылок на справочники (Например: заявка, в работе, готово и т.п.) которые не нужно постоянно менять. А если у тебя состояние заносится произвольно, то это не справочник, а просто табличка для облегчения выбора из наиболее часто применяемых состояний. В этом случае состояние хранится в самой заявке и state - int не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2004, 06:06 |
|
||
|
Subject:Целостность данных - проектирование БД
|
|||
|---|---|---|---|
|
#18+
Можно еще добавить в таблицу states признак актуальности записи: states: id - autoincrement int not null primary key name - varchar(25) sign_actual - tinyint (1 - запись актуальна, 0 - неактуальна) "Удаляется" запись установкой sign_actual в 0. Потом, при выводе в прикладнухе данного справочника(?) просто добавить условие на проверку актуальности. Вобщем выбирай как тебе удобнее будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2004, 08:04 |
|
||
|
Subject:Целостность данных - проектирование БД
|
|||
|---|---|---|---|
|
#18+
Спасибо всем большое за ответы. Мой мозг потихоньку разгрузился :). Цитата: "...то это не справочник, а просто табличка для облегчения выбора из наиболее часто применяемых состояний." У меня в ТЗ написано что нужно добавить возможность последующего добавления этих состояних. Тоесть они могут менять. И это всё будет в списке, мне кажеться глупо использовать Group By чтобы узнать какие состояния были (если они будут храниться в заявке). Как быть в этом случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2004, 11:20 |
|
||
|
Subject:Целостность данных - проектирование БД
|
|||
|---|---|---|---|
|
#18+
Я бы в этом случае последовал совету drptz т.е не давал бы реально удалять записи из states а выставлял флаг типа isdel, тогда при просмотре и выборе было бы что то типа, Код: plaintext с несуществующими уже сейчас состояниями. так же полезно сделать административную функцию подчистки custom c isdrl==1 на которых нет ссылок из custom , что бы не засорять его совсем "умершими" записями ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2004, 13:02 |
|
||
|
Subject:Целостность данных - проектирование БД
|
|||
|---|---|---|---|
|
#18+
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, по той простой причине, что состояние заказа можно определять по сопутствующим документам, что правильнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2004, 15:03 |
|
||
|
Subject:Целостность данных - проектирование БД
|
|||
|---|---|---|---|
|
#18+
автор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 автор...узнать какие состояния были ... Твоя табличка хранит только одно текущее состояние и по ней нельзя узнать что было... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2004, 07:28 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=161&tid=1546160]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 267ms |
| total: | 420ms |

| 0 / 0 |
