|
Нормализация при рекурсивных связях?
|
|||
---|---|---|---|
#18+
Доброго времени суток, господа форумчане! На записи лекции преподаватель говорил, что при нормализации необходимо удалять рекурсивные связи (унарные). В курсовой попалось задание, где необходимо эти рекурсивные связи использовать. Нужно у одной сущности выразить родственные связи (непосредственные, не боковые типа брат и т.д.). Мой текущий вариант : Animal (сущность) PK id_animal FK id_father FK id_mother name Собственно ERD рисунок Вопрос следующий: действительно ли не получится третьей нормальной формы (и какой-либо вообще) без выделения новой сущности? А если её тут выделять, то как, собственно? За то, что будет NF, текущая схема правильная:
P.S. СУБД рекурсивные запросы поддерживает ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2021, 11:03 |
|
Нормализация при рекурсивных связях?
|
|||
---|---|---|---|
#18+
Lionel, основная проблема такой схемы не рекурсия, а цикличность. Никто не мешает вам задать пары PK id_animal / FK id_father как-то так: 1 / 3 2 / 1 3 / 2 при попытке построить дерево в данном случае - нужно будет явно пытаться отловить цикличность, либо предотвращать это на уровне схемы данных. К примеру, ввести понятие "Уровень" в рамках этой же сущности. При порождении дочерней записи увеличивать уровень на единицу относительно родительской (и запрет связи "против шерсти" по уровням). В этом случае вы закладываете связь 1-1 между каждым элементом и конкретным деревом связей. Т.е. использовать элемент в двух деревьях - будет невозможно. Более продвинутая модель будет заключаться в выделении отдельной сущности "Дерево связей", где для каждого отдельного дерева будет свой идентификатор, а дальше будет описываться стандартная связь parent-child с рекурсией и уровнями элемента для каждого дерева. Это позволит вам разорвать ограничение 1-1 для элемент <-> дерево. Но для принятие решения, необходимо детально анализировать вашу исходную задачу, дабы понимать природу связей между сущностями. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2021, 12:03 |
|
Нормализация при рекурсивных связях?
|
|||
---|---|---|---|
#18+
Lionel, Описанные Mikle83 возможные проблемы не имеют отношения к 3NF Как вы правильно написали у вас обычная 3NF Lionelпо определению 1-3 NF все нормально, зависимости только от ключа, ключи не составные, атрибуты простые Получается иерархия с двумя предками. По каждому предку сможете найти его потомков. По каждому потомку найдете его предков. Пусть ваш препод уточнит, что имел в виду. Может он оговорился или не знает, что такое 3NF или мы чего-то не знаем/не понимаем ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2021, 12:59 |
|
Нормализация при рекурсивных связях?
|
|||
---|---|---|---|
#18+
Lionel На записи лекции преподаватель говорил, что при нормализации необходимо удалять рекурсивные связи (унарные). Это слишком прямое утверждение, на самом деле каждую ситуацию нужно рассматривать отдельно, а не чесать всё одной гребенкой... Например вот ситуация: Сущность1 -> Сущность2 -> Сущность3 У всех сущностей примерно одинаковый набор атрибутов (например Армия->Дивизия->Полк) и цепь не прерывается, в этом случае кому как нравится : можно иметь и три сущности с подчинением, а можно засунуть всё одну таблицу и проставить ссылки у Дивизии на Армию, у Полка на Дивизию... В другой ситуации , например, у трех сущностей абсолютно разный набор атрибутов и пихать всё в одну таблицу уже не совсем айс... В третьей ситуации, например, у трех сущностей набор атрибутов одинаковый, но цепь иногда прерывается, например, некоторые Полки подчинены непосредственно Армии, в этом случае одна таблица предпочтительнее... Может быть я не совсем привел удачные примеры, но суть моего посыла должна быть понятна... Да и потом, для одного (и в зависимости от общего ТЗ) Армия Дивизия и Полк это три сущности, а для другого это может быть и одна сущность ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2021, 15:04 |
|
Нормализация при рекурсивных связях?
|
|||
---|---|---|---|
#18+
vmag Lionel На записи лекции преподаватель говорил, что при нормализации необходимо удалять рекурсивные связи (унарные). Это слишком прямое утверждение, на самом деле каждую ситуацию нужно рассматривать отдельно, а не чесать всё одной гребенкой... Для каждого случая смотреть отдельно и внимательно. Например, две связи между отделами и сотрудниками. Первая: сотрудник работает в отделе = отдел состоит из сотрудников. Вторая: сотрудник руководит отделом = отделом функционирует под руководством сотрудника. Вполне нормальная схема. См. картинку, сделанную в Oracle SQL Developer Data Modeler. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2021, 21:29 |
|
Нормализация при рекурсивных связях?
|
|||
---|---|---|---|
#18+
SQL*Plus Вполне нормальная схема. Тут такое. Схема не живет без "обвязки" на внешнем уровне. Начальник всегда является сотрудником отдела? Чем должность "начальник отдела" отличается от иных должностей? Начальник всегда должен быть указан? Один человек может возглавлять два и более отдела? ИМХО, развязать через связку Сотрудник / Должности / Отделы / Должности_в_отделах делают схему более логичной. Признак того, что должность "руководящая"/"ответственная"/"крайний за косяки" - может быть разнесена как раз на уровне "общего" справочника. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 17:52 |
|
Нормализация при рекурсивных связях?
|
|||
---|---|---|---|
#18+
SQL*Plus Lionel, Описанные Mikle83 возможные проблемы не имеют отношения к 3NF Тут же надо чуть шире посмотреть. Когда вы моделируете мир нужно смотреть не только на СВЯЗИ между объектами, но и на ОГРАНИЧЕНИЯ, которые накладывает бизнес область. 3НФ говорит о том, что все атрибуты должны зависеть от первичного ключа и только от него. Теперь спроецируйте это не только на явные атрибуты и связи, но и на ограничения, которые должна выражать схема данных. Описанная циклическая связь как раз не предотвращается указанной схемой данных. Существующее назовем "бизнес ограничение" (кого можно назначить предком) завязывается не только на праймари ключ, но и на иные атрибуты сущности (более комплексные и неявные, такие как "кто предок"). И вот тут как раз возникает противоречие с 3НФ. НО. Это совершенно не значит, что схема с рекурсиями не работоспособная. Любое решение это компромисс между техническим перфекционизмом и затратами на реализацию/поддержку и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 18:06 |
|
Нормализация при рекурсивных связях?
|
|||
---|---|---|---|
#18+
Lionel, Как только возникает упоминание связей в контексте нормализации, речь автоматически идет о нормальных формах выше третьей. Ни 3НФ ни БКНФ (обычно) недостаточно для разборки с нормализацией связей. Два родителя - это слишком, почти запредельно сложно, давайте сначала попробуем сначала разобраться с одним. Вот ваша исходное отношение, в котором пока оставлен только один родитель. Animal PK id_animal FK id_father ... name начнем добавлять в него строки, способом, не противоречащим определению отношения (таблицы) 1'Папа Бизон'21'Первый сын'31'Второй сын' В смысле 3НФ здесь все в порядке, а что с унарными связями? Каждый сын здесь видит своего единственного родителя, то есть на стороне родителя стоит 1. Но у родителя здесь оказывается два ребенка, т.е. на стороне ребенка стоит N, а унарность предполагает единственность с обеих сторон отношения. Технически в sql-таблице это можно было бы поддержать определением уникального индекса на id_father. Но в реляционной теории нет понятия об индексах, есть только отношения и их ключи, такие или сякие. Здесь у одной таблицы получается два ключа, значит в одну таблицу оказались замешаны два отношения. Вот и разделим их на два явным образом. В исходном останется: Animal PK id_animal ... name и появится новое, допустим такое: Parent1 PK id_father, FK Animal(id_animal) id_animal, FK Animal(id_animal) Такое разделение позволяет автоматически поддерживать связь 1:1 между родителем и потомком Ладно, а что со вторым родителем, как его появление взрывает мозг и ломает базу? ммм... it depends... В отсутствие дополнительной информации, естественным образом появляется, или может появиться вторая таблица-отношение: Parent2 PK id_mother FK Animal(id_animal) id_child FK Animal(id_animal) И для каких-то ситуаций это может и сгодиться. Однако... Однако, в каких-то других ситуациях предметная область может оказаться описанной с учетом, например, следующего дополнительных бизнес требования: - animal, однажды появившийся в Parent1, не может существовать Parent2 и наоборот. Возникновение такого требования к связям означает, что Parent1 и Parent2 дальше не могут быть независимыми друг от друга отношениями. У animal появляется роль, определяющая кем (в каком отношении) он должен оказаться - parent1 или parent2. Тогда два отношения Parent1 и Parent2 должны быть слиты в одно - parent и роль становится его атрибутом: Parent PK id_parent FK Animal(id_animal) role id_child FK Animal(id_animal) Так составленное отношение позволит поддержать связи вида 1:1 для родителей обоих типов, с усилением бизнес-требований до единственности роли родителя. Однако и это еще не все. В зависимости от того, какие еще дополнительные требования к связям, естественные или не очень, окажутся выявлены, может потребоваться новое перепроектирование, сопровождающееся как появлением новых полей, так и появлением новых, ранее не существовавших, отношений в БД. А поскольку понимание предметной области имеет право меняться, вместе с изменениями, происходящими в самой предметной области, эволюция схемы данных с учетом нормализации может приводить к достаточно болезненным изменениям в структуре БД. И с далеко не всегда очевидным выбором способа и направления дальнейшего развития схемы. Например, может оказаться необходимым поддерживать соответствие использованной в связи "родитель" роли полу животного. Такое невинное требование, выраженное на естественном языке, будучи неаккуратно понятым, может приводить к конфликтам с позднее дополнительно возникающими требованиями по поддержанию связи "родитель". И существо проблемы заключается в том, что изначально это требование сформулировано на недостаточно формальном языке для точного описания предметной области. Весьма нередко никаких точных описаний требований, адекватных предметной области, просто не существует. Для этого в конкретных случаях могут быть различные причины различного происхождения. Но некоторым предметным областям изначально присуща имманентная изменчивость, затрудняющая, или делающая невозможным надежное предсказание эволюции схемы. Это автоматически привносит риски в проектирование в процессе эволюции схемы. ... Как-то так, для начала, со унарными связями. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2021, 04:24 |
|
Нормализация при рекурсивных связях?
|
|||
---|---|---|---|
#18+
booby, талантище... не могу дочитать до конца, или теряю нить или засыпаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2021, 20:14 |
|
|
Start [/forum/topic.php?fid=32&msg=40098384&tid=1539781]: |
0ms |
get settings: |
17ms |
get forum list: |
15ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
1ms |
get page messages: |
299ms |
get tp. blocked users: |
1ms |
others: | 298ms |
total: | 692ms |
0 / 0 |