powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нормализация при рекурсивных связях?
10 сообщений из 10, страница 1 из 1
Нормализация при рекурсивных связях?
    #40097744
Lionel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, господа форумчане!

На записи лекции преподаватель говорил, что при нормализации необходимо удалять рекурсивные связи (унарные).

В курсовой попалось задание, где необходимо эти рекурсивные связи использовать. Нужно у одной сущности выразить родственные связи (непосредственные, не боковые типа брат и т.д.).

Мой текущий вариант :
Animal (сущность)
PK id_animal
FK id_father
FK id_mother
name

Собственно ERD рисунок


  • Вопрос следующий: действительно ли не получится третьей нормальной формы (и какой-либо вообще) без выделения новой сущности? А если её тут выделять, то как, собственно?

    За то, что будет NF, текущая схема правильная:

    • похожий вопрос был на stackoverflow (его удалили, через кэш яндекса посмотрел, картинки под спойлером)



    • по определению 1-3 NF все нормально, зависимости только от ключа, ключи не составные, атрибуты простые
    Против этого:
    • мое понимание слов преподавателя
    Хочу услышать ваше мнение, правильно ли я все понял, можно ли оставить текущую схему.
    P.S. СУБД рекурсивные запросы поддерживает
    ...
    Рейтинг: 0 / 0
    Нормализация при рекурсивных связях?
        #40097761
    Mikle83
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Lionel,
    основная проблема такой схемы не рекурсия, а цикличность.
    Никто не мешает вам задать пары PK id_animal / FK id_father как-то так:
    1 / 3
    2 / 1
    3 / 2

    при попытке построить дерево в данном случае - нужно будет явно пытаться отловить цикличность,
    либо предотвращать это на уровне схемы данных.

    К примеру, ввести понятие "Уровень" в рамках этой же сущности.
    При порождении дочерней записи увеличивать уровень на единицу относительно родительской (и запрет связи "против шерсти" по уровням).
    В этом случае вы закладываете связь 1-1 между каждым элементом и конкретным деревом связей.
    Т.е. использовать элемент в двух деревьях - будет невозможно.


    Более продвинутая модель будет заключаться в выделении отдельной сущности "Дерево связей",
    где для каждого отдельного дерева будет свой идентификатор, а дальше будет описываться стандартная связь parent-child с рекурсией и уровнями элемента для каждого дерева. Это позволит вам разорвать ограничение 1-1 для элемент <-> дерево.


    Но для принятие решения, необходимо детально анализировать вашу исходную задачу, дабы понимать природу связей между сущностями.
    ...
    Рейтинг: 0 / 0
    Нормализация при рекурсивных связях?
        #40097778
    SQL*Plus
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Lionel,

    Описанные Mikle83 возможные проблемы не имеют отношения к 3NF
    Как вы правильно написали у вас обычная 3NF
    Lionelпо определению 1-3 NF все нормально, зависимости только от ключа, ключи не составные, атрибуты простые
    Получается иерархия с двумя предками.
    По каждому предку сможете найти его потомков.
    По каждому потомку найдете его предков.

    Пусть ваш препод уточнит, что имел в виду.
    Может он оговорился
    или не знает, что такое 3NF
    или мы чего-то не знаем/не понимаем
    ...
    Рейтинг: 0 / 0
    Нормализация при рекурсивных связях?
        #40097818
    Фотография vmag
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Lionel
    На записи лекции преподаватель говорил, что при нормализации необходимо удалять рекурсивные связи (унарные).


    Это слишком прямое утверждение, на самом деле каждую ситуацию нужно рассматривать отдельно, а не чесать всё одной гребенкой...
    Например вот ситуация: Сущность1 -> Сущность2 -> Сущность3
    У всех сущностей примерно одинаковый набор атрибутов (например Армия->Дивизия->Полк) и цепь не прерывается,
    в этом случае кому как нравится : можно иметь и три сущности с подчинением, а можно засунуть всё одну таблицу и проставить
    ссылки у Дивизии на Армию, у Полка на Дивизию...
    В другой ситуации , например, у трех сущностей абсолютно разный набор атрибутов и пихать всё в одну таблицу уже не совсем айс...
    В третьей ситуации, например, у трех сущностей набор атрибутов одинаковый, но цепь иногда
    прерывается, например, некоторые Полки подчинены непосредственно Армии, в этом случае одна таблица предпочтительнее...
    Может быть я не совсем привел удачные примеры, но суть моего посыла должна быть понятна...
    Да и потом, для одного (и в зависимости от общего ТЗ) Армия Дивизия и Полк это три сущности, а для другого это может быть и одна сущность
    ...
    Рейтинг: 0 / 0
    Нормализация при рекурсивных связях?
        #40098156
    SQL*Plus
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    vmag
    Lionel
    На записи лекции преподаватель говорил, что при нормализации необходимо удалять рекурсивные связи (унарные).


    Это слишком прямое утверждение, на самом деле каждую ситуацию нужно рассматривать отдельно, а не чесать всё одной гребенкой...
    Это точно.
    Для каждого случая смотреть отдельно и внимательно.

    Например, две связи между отделами и сотрудниками.
    Первая: сотрудник работает в отделе = отдел состоит из сотрудников.
    Вторая: сотрудник руководит отделом = отделом функционирует под руководством сотрудника.

    Вполне нормальная схема.

    См. картинку, сделанную в Oracle SQL Developer Data Modeler.
    ...
    Рейтинг: 0 / 0
    Нормализация при рекурсивных связях?
        #40098384
    Mikle83
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    SQL*Plus

    Вполне нормальная схема.


    Тут такое. Схема не живет без "обвязки" на внешнем уровне.

    Начальник всегда является сотрудником отдела?
    Чем должность "начальник отдела" отличается от иных должностей?
    Начальник всегда должен быть указан?
    Один человек может возглавлять два и более отдела?

    ИМХО, развязать через связку Сотрудник / Должности / Отделы / Должности_в_отделах делают схему более логичной.
    Признак того, что должность "руководящая"/"ответственная"/"крайний за косяки" - может быть разнесена как раз на уровне "общего" справочника.
    ...
    Рейтинг: 0 / 0
    Нормализация при рекурсивных связях?
        #40098387
    Mikle83
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    SQL*Plus
    Lionel,

    Описанные Mikle83 возможные проблемы не имеют отношения к 3NF


    Тут же надо чуть шире посмотреть.

    Когда вы моделируете мир нужно смотреть не только на СВЯЗИ между объектами, но и на ОГРАНИЧЕНИЯ, которые накладывает бизнес область.

    3НФ говорит о том, что все атрибуты должны зависеть от первичного ключа и только от него.
    Теперь спроецируйте это не только на явные атрибуты и связи, но и на ограничения, которые должна выражать схема данных.

    Описанная циклическая связь как раз не предотвращается указанной схемой данных.
    Существующее назовем "бизнес ограничение" (кого можно назначить предком) завязывается не только на праймари ключ, но и на иные атрибуты сущности (более комплексные и неявные, такие как "кто предок").

    И вот тут как раз возникает противоречие с 3НФ.


    НО. Это совершенно не значит, что схема с рекурсиями не работоспособная.
    Любое решение это компромисс между техническим перфекционизмом и затратами на реализацию/поддержку и т.п.
    ...
    Рейтинг: 0 / 0
    Нормализация при рекурсивных связях?
        #40098423
    booby
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    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 для родителей обоих типов,
    с усилением бизнес-требований до единственности роли родителя.

    Однако и это еще не все.
    В зависимости от того, какие еще дополнительные требования к связям, естественные или не очень,
    окажутся выявлены, может потребоваться новое перепроектирование, сопровождающееся как появлением новых полей, так и появлением новых, ранее не существовавших, отношений в БД.

    А поскольку понимание предметной области имеет право меняться, вместе с изменениями,
    происходящими в самой предметной области, эволюция схемы данных с учетом нормализации может приводить к достаточно
    болезненным изменениям в структуре БД.
    И с далеко не всегда очевидным выбором способа и направления дальнейшего развития схемы.

    Например, может оказаться необходимым поддерживать соответствие использованной в связи "родитель" роли полу животного.
    Такое невинное требование, выраженное на естественном языке, будучи неаккуратно понятым, может приводить к конфликтам
    с позднее дополнительно возникающими требованиями по поддержанию связи "родитель".
    И существо проблемы заключается в том, что изначально это требование сформулировано на недостаточно формальном языке для точного описания предметной области.

    Весьма нередко никаких точных описаний требований, адекватных предметной области, просто не существует.
    Для этого в конкретных случаях могут быть различные причины различного происхождения.
    Но некоторым предметным областям изначально присуща имманентная изменчивость, затрудняющая, или делающая невозможным
    надежное предсказание эволюции схемы.
    Это автоматически привносит риски в проектирование в процессе эволюции схемы.
    ...
    Как-то так, для начала, со унарными связями.
    ...
    Рейтинг: 0 / 0
    Нормализация при рекурсивных связях?
        #40098465
    Фотография vmag
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    booby,

    талантище... не могу дочитать до конца, или теряю нить или засыпаю...
    ...
    Рейтинг: 0 / 0
    Нормализация при рекурсивных связях?
        #40098571
    SQL*Plus
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    vmag
    booby,

    талантище... не могу дочитать до конца, или теряю нить или засыпаю...

    Аналогично.

    Завтра ещё раз попробую.

    :-)
    ...
    Рейтинг: 0 / 0
    10 сообщений из 10, страница 1 из 1
    Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нормализация при рекурсивных связях?
    Целевая тема:
    Создать новую тему:
    Автор:
    Закрыть
    Цитировать
    Найденые пользователи ...
    Разблокировать пользователей ...
    Читали форум (0):
    Пользователи онлайн (0):
    x
    x
    Закрыть


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