|
|
|
Организация связей в ненормализованной БД
|
|||
|---|---|---|---|
|
#18+
Очень схематично: нужно вести список клиентов и выполненные по ним заказы. Клиенты представляются параметрами: код клиента, адрес (время от времени меняется, но нужно хранить в качестве шаблона для ввода). Заказы: код клиента, код заказа, код адреса, код услуги1, код услуги2. Естественно, создаются 2 справочника по адресам и услугам. Итого все предстает в виде четырех файлов: client (idClient, nAdres) zakaz (idZakaz, nClient, nAdres, nUsluga1, nUsluga2) adres (idAdres, tAdres) usluga(idUsluga, tUsluga) id-поля – автоинкрементные, VPF-8 . Вопрос: проще хранить отдельными таблицами или стоит объединить в БД? И как правильнее организовать отношения в ней? Ведь там получается отношение один-ко-многим, а также присутствует связь сразу двух файлов со справочником адресов. Реально ли установить integrity rules через builder, чтобы целостность базы не нарушалась? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2005, 19:52:47 |
|
||
|
Организация связей в ненормализованной БД
|
|||
|---|---|---|---|
|
#18+
men deaVPF-8 . Вопрос: проще хранить отдельными таблицами или стоит объединить в БД? Стоит объеденить в БД. men deaИ как правильнее организовать отношения в ней? Ведь там получается отношение один-ко-многим, а также присутствует связь сразу двух файлов со справочником адресов. Есть такая штука, называется "нормализация" Если прога пока на этапе разработки, то надо все это "нормализовать". Вкратце, суть нормализации сводиться к предотвращению повторов. Информация должна храниться только в одном месте. Из других таблиц только ссылки на эту информацию. В твоем случае, документ обычно состоит из 2 частей: шапка документа и список строк. Т.е. шапка заказа и список услуг заказа. zakaz(idZakaz, nClient, nAdres) zakazLine(idZakazLine,idZakaz,idUsluga) Во-первых, ты "развязываешся" с ограничением на количество услуг в одном заказе. Количество услуг одного заказа становиться неограниченным. Ну, или всегда можно явно задать нужное ограничение. Во-вторых, упрощается модификация и сопровождение такой базы. men deaРеально ли установить integrity rules через builder, чтобы целостность базы не нарушалась? Сначала тебе надо определиться с тем, что ты подразумеваешь под термином "целостность базы данных". Дело в том, что Referenty Integrity - это всего-лишь способ автоматической генерации определенного типа триггеров. Т.е. это накладывание неких "стандартных" ограничений на пару таблиц. Подробности здесь Триггер Связи и отношения между таблицами К слову, триггер - это процедура, автоматически выполняющаяся при наступлении некоторого события в таблице базы данных. Вне базы данных это придется делать вручную. Это к вопросу о том, что лучше: свободные таблицы или включенные в базу данных. Так вот, если в твоей задаче под "целостностью базы данных" понимается нечто, отличное от стандартных ограничений, которые накладываются в Referenty Integrity, то придется писать триггера самостоятельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2005, 19:21:55 |
|
||
|
Организация связей в ненормализованной БД
|
|||
|---|---|---|---|
|
#18+
Я привел очень схематично условие задачи: клиент был представлен только одним полем: АДРЕС. Но в оригинале все представляется сложнее. Словно при Большом Взрыве, первоатом “АДРЕС” развернется в кучу пунктов, которые тоже получат собственную жизнь. Клиент - это пол, дата рождения, страна, город, край, район, улица, социальный статус, национальность, льгота, страховка, документ, местонахождение на момент заказа и много-много пунктов “ДА-НЕТ”. Как видно, неизменным остается только пол и дата рождения. Бывает, это тоже меняется. :) ( Разумеется, все, что можно, кодируется и хранится в справочниках, - нормализация, однако! Но комбинаторика пунктов «ДА-НЕТ» для кодировки вариантов убийственна.) Причем, должна отслеживаться динамика их изменения во времени. При оформлении заказа, нужно вносить сразу все пункты. Они имеют значение на момент очередного заказа, как бы это ни было парадоксально! Собственно, заказ – мелочь по сравнению с обстоятельствами его осуществления. Следовательно, нужно где-то иметь шаблон. Брать за основу значения из последнего заказа нецелесообразно, т.к. часто бывает, что почти все меняется на момент 2-3-кратного заказа, а потом возвращается к прежнему шаблону. Клиентов-20 тысяч. В общей сложности 100 заказов в день. Один заказ - это около 100 байт. Значит, экономия на каких-то жалких байтах, обернется полнейшим неудобством в работе. Цель работы программы получение сводок в самых немыслимых разрезах и сочетаниях пунктов. ВОПРОС 1. Можно, конечно, отказаться от варианта хранения шаблона в справочнике по клиентам. Тогда в справочнике по клиентам будет храниться необновляемая информация. Остальная переносится либо в отдельный файл шаблонов, либо в файл заказов. Во втором случае придется пометить запись с шаблоном неким значком ”Ш”, чтобы не считалась, как заказ. Правда, придется всякий раз отыскивать эту запись и копировать значения ее полей во вновь введенный заказ. Вы находите это более удобным? Приведенная мною схема БД представляется мне оптимальной. Про нормализацию мне известно. Но не всегда есть смысл за нею гнаться? Судите сами. Что касается Вашего, Владимир М., предложения изменить структуру файла заказов, чтобы не ограничивать количество услуг, то нужды в том нет. Услуг, принципиально, не может быть больше 3. Обычно 2. Справочник услуг - сотня пунктов: 2 байта на код. Экономия на 4 лишних байтах, обернется бОльшими потерями. Как у купца, что зажег червонец, чтобы найти оброненный пятак. Все сводится к ВОПРОСУ: что предпочесть? 1) экономичный вариант: с 3 услугами в одной записи, датой-временем, кодом оператора, заказа и длинным сопровождающем перечнем «ДА-НЕТ», 2) нормализованный: разбить эту запись на 1-2 или 3, по одной услуге в каждой + одинаковый код заказа в каждую запись, 3) комбинированный: помимо указанного разбиения ввести доп. файл, в который перенести строку с «ДА-НЕТ»+ код заказа Под ЦЕЛОСТНОСТЬЮ БАЗЫ я понимал то, что машина сама будет сама удалять или запрещать удаление связанных записей, при удалении пункта из справочника. ВОПРОС 3. Если я все free tables объединяю единую БД, то я получаю возможность машине за меня проводить эти действия, вместо обработки вручную? Удалил клиента, а все его заказы и все, что с ним связано, автоматом удалились без моего участия (или не удалились). Но в моем 1-м варианте получается, что к каждой записи нужно трижды привязать один справочник, что нелепо. Стало быть, нужно организовать еще пару курсоров из него. Что делать тогда с этой Referenty Integrity, я совсем не представляю. Вот, и появляются мысли, а нужно ли все это загонять в БД, когда и так придется все самостоятельно выписывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 03:10:36 |
|
||
|
Организация связей в ненормализованной БД
|
|||
|---|---|---|---|
|
#18+
Как говорят в Одессе: "Я тебя умоляю!". Если ты и так знаешь, какая структура лучше, то в чем смысл вопроса? "Экономия объема" - это вопрос, ну, если не десятый, то, по крайней мере, далеко не первый. Обычно СНАЧАЛА разрабатывают корректную (нормализованную) структуру базы данных, а уже ПОТОМ начинают ее денормализовывать, если в этом есть смысл. Причем надо ОЧЕНЬ СЕРЬЕЗНО подойти к вопросу денормализации. Очень тщательно продумать, насколько "экономия места" важнее эффективности базы данных в целом. Денормализовать структуру легко, а вот обратный процесс чрезвычайно сложен. Крайне сложно поддерживать целостность денормализованной структуры. По поводу Referenty Integrity я тебе написал. Если в таблицы не включены в контейнер база данных, но написание для них триггеров (Referenty Integrity - это ЧАСТНЫЙ случай триггеров) становиться достаточно сложным делом. Вопрос в том, что тебе придется ВРУЧНУЮ отслеживать факт модификации таблиц. Т.е. это вовсе не вопрос написания собственно триггеров, а вопрос определения момента, когда эти самые триггера надо запускать. Например, если таблица включена в базу данных, то по команде INSERT-SQL автоматически сработает триггер (написанный тобой самостоятельно или через Referenty Integrity - не важно). А если таблица НЕ включена в базу данных, то тебе вручную придется запускать эти триггера каждый раз, как в программе будет встречаться команду на модификацию данных. Более того, еще надо будет опять же вручную организовывать откат модификаций, если эти модификации недопустимы. Т.е. ты себе добавляешь массу ручной работы. Все-таки, прочитай статьи по приведенным ссылкам. Похоже, ты просто не понимаешь, что такое триггер вообще и Referenti Integrity в частности. Еще раз, Referenty Integrity - это частный случай триггеров. "Шаблоны" Вслушайся в то, что ты сам же и говоришь: есть заказ и есть шаблон. Т.е. это явно две РАЗНЫЕ таблицы (наборы таблиц). Шаблон - это НЕ заказ. И не надо их пытаться объединить в одну таблицу. Пусть даже у них структуры одинаковые. Себе дороже выйдет. Тем более, вряд ли, организация шаблонов в отдельные наборы таблиц займет много места. Строго говоря, шаблон - это всего-лишь значения по умолчанию. Т.е. можно сделать вызов функций Default к соответствующим полям. Но это опять возможно только для таблиц включенных в контейнер базы данных. men deaУслуг, принципиально, не может быть больше 3. Обычно 2. Ну да, конечно. Только обычно, после того, как произноситься фраза "этого не может быть, потому что не может быть никогда" очень скоро выясняется, что как раз-таки может! И начинаются "страдания" как включить эту дополнительную услугу. Не надо "вылизывать" структуру базы данных под текущее ТЗ. Да, такая структура будет очень замечательно и быстро работать, но это тупик. Такую структуру будут практически невозможно развивать по мере усложнения задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 11:38:13 |
|
||
|
Организация связей в ненормализованной БД
|
|||
|---|---|---|---|
|
#18+
Hi men dea! > Вопрос: проще хранить отдельными таблицами или стоит объединить в БД? Если тебе нужны возможнсоти БД (в т.ч. триггера и "постоянные связи") то естетсвенно надо объединять. > И как правильнее организовать отношения в ней? Ведь там получается > отношение один-ко-многим, а также присутствует связь сразу двух файлов со > справочником адресов. Это без разницы - хоть 50 связей. Читай статью Владимира Максимова про связи на foxclub.ru > Реально ли установить integrity rules через builder, чтобы целостность > базы не нарушалась? Реально. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 16:11:34 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33363001&tid=1593123]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
168ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 440ms |

| 0 / 0 |
