powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / IDEF1X: идентифицирующие отношения с практической точки зрения
25 сообщений из 34, страница 1 из 2
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35632368
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую участников форума!
Изучив модель IDEF1X и пробуя применять ее концепции, оказался в некотором недоумении относительно идентифицирующих отношений. В теории, вроде бы, все гладко, но, пытаясь применить на практике полученные знания...
Возьмем простой пример: имеются 3 таблицы - Клиент, Заказ, еще какая-то, например, Количество пунктов заказа. Очевидно, что Заказ не может существовать без Клиента, а Количество пунктов заказа не может существовать без Заказа. Следовательно, между таблицами идентифицирующие отношения.

Create Table "customer" (
"cust_id" Integer NOT NULL,
"fio" Char(50) NOT NULL,
Primary Key ("cust_id")
);

Create Table "order" (
"order_id" Integer NOT NULL,
"cust_id" Integer NOT NULL,
"name" Char(20) NOT NULL,
Primary Key ("order_id","cust_id")
);

Create Table "quantity" (
"quantity_id" Integer NOT NULL,
"order_id" Integer NOT NULL,
"cust_id" Integer NOT NULL,
"count" Char(20) NOT NULL,
Primary Key ("quantity_id","order_id","cust_id")
);

Alter Table "order" add Foreign Key ("cust_id") references "customer" ("cust_id") on update no action on delete no action ;
Alter Table "quantity" add Foreign Key ("order_id","cust_id") references "order" ("order_id","cust_id") on update no action on delete no action ;

Но, во первых, суррогатный ключ (id) уже является уникальным ненулевым идентификатором, который на практике однозначно идентифицирует запись, следовательно, достаточен для первичного ключа, им и является. Зачем в первичный ключ добавлять еще 2 внешних ключа, непонятно, если тех же результатов можно добиться, указав, что внешние ключи должны быть NOT NULL.
Во-вторых, насколько усложняются SQL-запросы, в частности, на добавление записи в последнюю таблицу, т.к. в JOIN-ах нужно перечислять все части первичного ключа, чтобы по правилам идентифицировать эту запись (хотя практически достаточно указать только ID). А в последней таблице, если она, например, пятая по счету, первичный ключ состоит из 5 (!) атрибутов, 4 из которых раньше в ней не было.
В третьих, попытавшись реализовать правильную модель, встретился с непониманием руководства ;), пришлось заменить абсолютно все идентифицирующие отношения неидентифицирующими.
Честно говоря, поразмыслив, не нашел ни одного довода, по которому я должен применять идентифицирующие отношения.

В связи с этим, вопрос к уважаемым специалистам, вы когда-нибудь применяете в своей практике идентифицирующие отношения и в каких случаях? (случай многие-ко-многим не в счет).
Каковы плюсы?
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35634261
svnvladВ связи с этим, вопрос к уважаемым специалистам, вы когда-нибудь применяете в своей практике идентифицирующие отношения и в каких случаях? (случай многие-ко-многим не в счет).А почему, собственно, не в счёт, если сущность "Заказ" реализует связь "многие-ко-многим" между сущностями "Клиент" и "Позиция заказа"?
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35634327
AK-74U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий А. Сидоровсущность "Заказ" реализует связь "многие-ко-многим" между сущностями "Клиент" и "Позиция заказа"?
Ну и что? Попрошу заметить, что здесь не обойдёшься составным Primary из двух Foreign.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35634347
AK-74U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мудрый Яндекс подсказывает нам:
ЯндексС позиции дочерней сущности можно выделить следующие виды отношений:

1. Идентифицирующее отношение. Если для того чтобы однозначно идентифицировать некоторый экземпляр дочерней сущности необходимо знать с каким экземпляром родительской сущности он связан в соответствующем отношении, то такое отношение называется идентифицирующим. Рассморим в качестве примера две сущности: первая обозначает множество проектов, а вторая - множество работ, которые должны выполняться в рамках этих проектов. Поскольку в различных проектах могут выполняться аналогичные работы, то для однозначного определения работы необходимо знать соответствующий ее проект. Пусть некоторые два экземпляра сущности ``проект'' представляют, например, сроительство здания $A$ и здания $B$. При этом и первый и второй проекты включают работу по подготовке фундамента. Для того чтобы решить о каком фундаменте идет речь необходимо указать для какого здания он возводится. В даннос случае отношение между сущностями ``проект'' и ``работа'' будет идентифицирующим.

Если отношение является идентифицирующим, то соответствующая дочерняя сущность является зависимой (родительская сущность может быть как зависимой так и независимой).
2. Неидентифицирующее отношение. Если экземпляр дочерней сущности может быть однозначно идентифицирован без указания соответствующего экземпляра родительской сущности, то такое отношение является неидентифицирующим. Примером такого отношения может служить неоднократно упоминавшийся пример с отделами и сотрудниками. Каждый экземпляр сущности ``сотрудник'' уникально идентифицируется тройкой < ``имя'', ``отчество'', ``фамилия''>. Для того чтобы найти конкретного сотрудника нет необходимости знать отдел, где этот сотрудник работает, достаточно знать его полное имя.

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

Ощущаете разницу?
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35634597
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AK-74U
1. Идентифицирующее отношение.
...
Поскольку в различных проектах могут выполняться аналогичные работы, то для однозначного определения работы необходимо знать соответствующий ее проект. Пусть некоторые два экземпляра сущности ``проект'' представляют, например, сроительство здания $A$ и здания $B$. При этом и первый и второй проекты включают работу по подготовке фундамента. Для того чтобы решить о каком фундаменте идет речь необходимо указать для какого здания он возводится. В даннос случае отношение между сущностями ``проект'' и ``работа'' будет идентифицирующим.



Вы говорите об этой схеме.
Схема рассмотрена с точки зрения проектировщика. Давайте теперь посмотрим с точки зрения программиста:
... для однозначного определения работы необходимо знать соответствующий ей проект... именно для этого и вводится Foreign Key id_project в таблице work. И ему для этого не обязательно располагаться в области первичного ключа. Первичный ключ - автоинкрементное поле id_work - с точки зрения базы однозначно идентифицирует экземпляр сущности ``работа''.

Вот запрос, определяющий строительство фундамента для здания $A$ (неидентифицирующее отношение):
Код: plaintext
1.
2.
3.
SELECT work_name FROM project
INNER JOIN work ON (work.id_project = project.id_project)
WHERE building='$A$';

Запрос для идентифицирующего отношения:
Код: plaintext
1.
2.
3.
SELECT work_name FROM work
INNER JOIN project ON (work.id_project = project.id_project)
WHERE building='$A$';

Как видите, никакой разницы.
Неприятности начинаются, когда у нас каскад из 3 или более зависимых сущностей. Тогда первичный ключ обязан целиком перекочевать в дочернюю сущность, т.е. в дочерней таблице появляются поля, которых в ней не было (id1, id2, id3, ...). И если для доступа к полю 3-ей таблицы в неидентифицирующем отношении мы обошлись бы двумя JOIN-ами
Код: plaintext
1.
2.
3.
4.
SELECT some_field_from_table3 FROM table1
INNER JOIN table2 ON (table1.id1 = table2.id1)
INNER JOIN table3 ON (table2.id2 = table3.id2)
WHERE ...
то в идентифицирующем по всем правилам необходимы 3 JOIN-а, т.к. атрибут id1 из первой перекочует в область первичного ключа 3-й таблицы!
Код: plaintext
1.
2.
3.
4.
5.
SELECT some_field_from_table3 FROM table1
INNER JOIN table2 ON (table1.id1 = table2.id1)
INNER JOIN table3 ON (table2.id2 = table3.id2)
INNER JOIN table3 ON (table2.id1 = table3.id1)
WHERE ...
(хотя реально для идентификации последний JOIN лишний).
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35634600
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35634605
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35634752
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladНеприятности начинаются, когда у нас каскад из 3 или более зависимых сущностей. Тогда первичный ключ обязан целиком перекочевать в дочернюю сущность, т.е. в дочерней таблице появляются поля, которых в ней не было (id1, id2, id3, ...). И если для доступа к полю 3-ей таблицы в неидентифицирующем отношении мы обошлись бы двумя JOIN-ами
Код: plaintext
1.
2.
3.
4.
SELECT some_field_from_table3 FROM table1
INNER JOIN table2 ON (table1.id1 = table2.id1)
INNER JOIN table3 ON (table2.id2 = table3.id2)
WHERE ...
то в идентифицирующем по всем правилам необходимы 3 JOIN-а, т.к. атрибут id1 из первой перекочует в область первичного ключа 3-й таблицы!
Код: plaintext
1.
2.
3.
4.
5.
SELECT some_field_from_table3 FROM table1
INNER JOIN table2 ON (table1.id1 = table2.id1)
INNER JOIN table3 ON (table2.id2 = table3.id2)
INNER JOIN table3 ON (table2.id1 = table3.id1)
WHERE ...
По каким таким правилам ? Транзитивность уже отменили ? Если A=B и B=C, то A=C.
А неприятность при отказе от идентифицирующих связей можно получить запросто, конкретно просадив производительность определенного типа запросов. Например, пусть мы имеем 3-уровневый каскад, T1->T2->T3. В случае агрегирующих запросов на самом нижнем уровне(T3) относительно самого верхнего(T1), надо будет в запрос обязательно включать в слияние промежуточный уровень(T2). В случае же идентифицирующих связей достаточно слияния между T1 и T3, а то и вовсе обойтись без слияния, если интересует агрегация по заранее известному T1.ID.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35634867
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA
По каким таким правилам ? Транзитивность уже отменили ? Если A=B и B=C, то A=C.
А неприятность при отказе от идентифицирующих связей можно получить запросто, конкретно просадив производительность определенного типа запросов. Например, пусть мы имеем 3-уровневый каскад, T1->T2->T3. В случае агрегирующих запросов на самом нижнем уровне(T3) относительно самого верхнего(T1), надо будет в запрос обязательно включать в слияние промежуточный уровень(T2). В случае же идентифицирующих связей достаточно слияния между T1 и T3, а то и вовсе обойтись без слияния, если интересует агрегация по заранее известному T1.ID.

Большое спасибо за пояснения, очень интересно.
То есть, вводим избыточность? А это не противоречит нормализации?
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35634934
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladТо есть, вводим избыточность? А это не противоречит нормализации?А где вы увидели избыточность?
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35634964
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelysvnvladТо есть, вводим избыточность? А это не противоречит нормализации?А где вы увидели избыточность?
1. К одной и той же цели можно дойти двумя разными путями: собрав все промежуточные JOIN-ы, либо взять готовые значения из внешних (они же первичные) ключей этой же таблицы.
2. В первичном ключе есть несколько полей, которые в совокупности с полем id составляют уникальность. Однако поле id - само по себе уже является уникальным и ненулевым, однозначно идентифицирующим запись.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635059
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelysvnvladТо есть, вводим избыточность? А это не противоречит нормализации?А где вы увидели избыточность?
Вот, накопал. :) В ту степь??

Код: plaintext
1.
2.
Определение. Отношение со схемой R находится в нормальной форме Бойса - Кодда относительно 
функциональных зависимостей, если оно находится в третьей нормальной форме 
и в схеме R нет ни одного атрибута, транзитивно зависящего от любого ключа.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635187
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad1. К одной и той же цели можно дойти двумя разными путями: собрав все промежуточные JOIN-ы, либо взять готовые значения из внешних (они же первичные) ключей этой же таблицы.Ну и что. Можно посчитать сумму SQL запросом, а можно в сводной таблице в Excel-е.
Да и один и тот же результат можно получать разными SQL запросами.

svnvlad2. В первичном ключе есть несколько полей, которые в совокупности с полем id составляют уникальность. Однако поле id - само по себе уже является уникальным и ненулевым, однозначно идентифицирующим запись.Если у вас есть естественный ключ, то зачем использовать в добавок к нему еще и суррогатный?
Если так делать - то будут проблемы с нормализацией.

А если просто выкинуть суррогатный ключ (ID) - то все будет нормально.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635191
AK-74U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, нормальная форма Бойса-Кодда - это не совсем из этой оперы.
Собственно, ChA уже всё сказал. Идентифицирующая связь добавляет признаки идентичности в дочернюю сущность. Идентичности, заметьте, а не просто связи.
При использовании идентифицирующих связей, как правило, искусственный идентификатор не требуется.

То есть здесь:

Код: plaintext
1.
2.
3.
4.
5.
6.
Create Table "quantity" (
"quantity_id" Integer NOT NULL,
"order_id" Integer NOT NULL,
"cust_id" Integer NOT NULL,
"count" Char( 20 ) NOT NULL,
Primary Key ("quantity_id","order_id","cust_id")
);

quantity_id - он искусственно привнесен. На самом деле, пример плохой, потому что таблица "Количество пунктов заказа" сама по себе еретического свойства :) Вот если вместо неё мы добавим:

Код: plaintext
1.
2.
3.
4.
5.
6.
Create Table "order_items" (
"order_id" Integer NOT NULL,
"cust_id" Integer NOT NULL,
"item_id" Integer NOT NULL,
"count" Char( 20 ) (откуда здесь чар, кстати?!) NOT NULL,
Primary Key ("order_id","cust_id", "item_id")
);
,
то получим вполне человеческую схему с таблицей "Пункты заказа", которой не требуется искусственный ключ. И из которой, заметьте, очень легко получить данные о том, сколько штук чего-то там заказал за историю покупок ваш клиент.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635209
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladChAТо есть, вводим избыточность? А это не противоречит нормализации?Нет тут никакой избыточности. Это явление обычно называют миграцией ключей. И само по себе оно никак нормализации не противоречит. Но есть одно "но". Идентифицирующая связь подразумевает вхождение ключа предка в основной ключ потомка. И, таким образом, идентификация потомка должна выполняться при обязательном участии атрибутов предка. В противном случае, смысл в идентифицирующей связи попросту исчезнет.
Вы сами нарушаете это правило, добавляя уникальный суррогатный атрибут, в результате чего отпадает необходимость атрибутов предка для идентификации записи. И этот атрибут, в принципе, и становится основным ключом данной таблицы. Но как только мы откажемся от условия уникальности этого атрибута в рамках таблицы, и остановимся на его уникальности в пределах мигрированных атрибутов предка, как все сразу станет на свои места. Обычно, подобная уникальность определяется предметной областью. Житейски говоря, надо понять, каким образом пользователь будет отличать одну строку от другой в рамках атрибутов предка.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635239
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAsvnvladChAТо есть, вводим избыточность? А это не противоречит нормализации?Нет тут никакой избыточности. Это явление обычно называют миграцией ключей. И само по себе оно никак нормализации не противоречит. Но есть одно "но". Идентифицирующая связь подразумевает вхождение ключа предка в основной ключ потомка. И, таким образом, идентификация потомка должна выполняться при обязательном участии атрибутов предка. В противном случае, смысл в идентифицирующей связи попросту исчезнет.
Вы сами нарушаете это правило, добавляя уникальный суррогатный атрибут, в результате чего отпадает необходимость атрибутов предка для идентификации записи. И этот атрибут, в принципе, и становится основным ключом данной таблицы. Но как только мы откажемся от условия уникальности этого атрибута в рамках таблицы, и остановимся на его уникальности в пределах мигрированных атрибутов предка, как все сразу станет на свои места. Обычно, подобная уникальность определяется предметной областью. Житейски говоря, надо понять, каким образом пользователь будет отличать одну строку от другой в рамках атрибутов предка.
Спасибо :) Это уже становится осмысленным.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635253
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AK-74UНет, нормальная форма Бойса-Кодда - это не совсем из этой оперы.
Собственно, ChA уже всё сказал. Идентифицирующая связь добавляет признаки идентичности в дочернюю сущность. Идентичности, заметьте, а не просто связи.
При использовании идентифицирующих связей, как правило, искусственный идентификатор не требуется.

То есть здесь:

Код: plaintext
1.
2.
3.
4.
5.
6.
Create Table "quantity" (
"quantity_id" Integer NOT NULL,
"order_id" Integer NOT NULL,
"cust_id" Integer NOT NULL,
"count" Char( 20 ) NOT NULL,
Primary Key ("quantity_id","order_id","cust_id")
);

quantity_id - он искусственно привнесен. На самом деле, пример плохой, потому что таблица "Количество пунктов заказа" сама по себе еретического свойства :) Вот если вместо неё мы добавим:

Код: plaintext
1.
2.
3.
4.
Create Table "order_items" (
"order_id" Integer NOT NULL,
"cust_id" Integer NOT NULL,
"item_id" Integer NOT NULL,
"count" Char( 20 ) (откуда здесь чар, кстати?!) NOT NULL,

Забыл поменять :)
AK-74U
Код: plaintext
1.
Primary Key ("order_id","cust_id", "item_id")
);
,
то получим вполне человеческую схему с таблицей "Пункты заказа", которой не требуется искусственный ключ. И из которой, заметьте, очень легко получить данные о том, сколько штук чего-то там заказал за историю покупок ваш клиент.
Здесь item_id - не является Autoincrement, надо понимать, что-то типа артикула?
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635365
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне не нравится одна вещь.

Предположим, мы выписали заказ, но ошиблись - не на того клиента. Нужно перекинуть заказ со всеми позициями на другого клиента.

В случае с суррогатными идентификаторами и неидентифицирующими связями достаточно поменять внешний ключ cust_id в таблице order. Позиции заказа трогать не надо - они ссылаются на тот же order_id.

В случае же идентифицирующих отношений и миграции ключей нам потребуется не только изменение cust_id в order, но и каскадное изменение cust_id в order_items. Причем, заметьте, в обоих таблицах меняется часть первичного ключа, что само по себе нехорошо во многих случаях. И еще здесь можно усмотреть нарушение нормализации - зависимость между атрибутами. А именно, в таблице order_items поле cust_id однозначно определяется полем order_id. Все равно что поле X^2 рядом с полем X.

А довод о повышении производительности агрегирующих запросов, и что "очень легко получить данные о том, сколько штук чего-то там заказал за историю покупок ваш клиент" (отсутствие необходимости JOIN-ов) с одной стороны верны, но с другой стороны - не совсем. С теми же доводами поля любого справочника, по полям которого нужна агрегация, можно продублировать в главной таблице. Допускаю, что иногда это оправдано (денормализация для увеличения производительности), но как общий аргумент (что это хорошо и правильно всегда) - вряд ли.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635371
AK-74U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очевидно, ссылка на внешнюю таблицу
Код: plaintext
1.
2.
3.
4.
Create Table "items" (
"item_id" Integer NOT NULL,
"description" Char( 20 ) NOT NULL,
Primary Key ("item_id")
);
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635401
AK-74U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat FisherИ еще здесь можно усмотреть нарушение нормализации - зависимость между атрибутами. А именно, в таблице order_items поле cust_id однозначно определяется полем order_id.

Как уже сказали до меня выше, миграция первичных ключей не может рассматриваться в качестве избыточности. Потому что это первичный ключ. Он един и неделим в своём качестве.

Cane Cat FisherВ случае же идентифицирующих отношений и миграции ключей нам потребуется не только изменение cust_id в order, но и каскадное изменение cust_id в order_items. Причем, заметьте, в обоих таблицах меняется часть первичного ключа, что само по себе нехорошо во многих случаях.

Возможно, у нас пример с заказами не особо удачный. Как я понимаю, дело в том, что если вы подразумеваете возможности перекидки заказа от одного клиента к другому, это уже по умолчанию означает что заказ не идентифицируется клиентом, а существует как не зависимая, в принципе, от клиента сущность, хотя и NULLS NOT ALLOWED :) То есть, собственно, никакой идентифицирующей связи изначально.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635601
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AK-74U
Cane Cat FisherВ случае же идентифицирующих отношений и миграции ключей нам потребуется не только изменение cust_id в order, но и каскадное изменение cust_id в order_items. Причем, заметьте, в обоих таблицах меняется часть первичного ключа, что само по себе нехорошо во многих случаях.

Возможно, у нас пример с заказами не особо удачный. Как я понимаю, дело в том, что если вы подразумеваете возможности перекидки заказа от одного клиента к другому, это уже по умолчанию означает что заказ не идентифицируется клиентом, а существует как не зависимая, в принципе, от клиента сущность, хотя и NULLS NOT ALLOWED :) То есть, собственно, никакой идентифицирующей связи изначально.
Заметьте, Вы сейчас сказали, что связь "многие-ко-многим" не является редактируемой.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635718
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AK-74UКак уже сказали до меня выше, миграция первичных ключей не может рассматриваться в качестве избыточности. Потому что это первичный ключ. Он един и неделим в своём качестве.

Я вовсе не пытаюсь уличить в безграмотности все учебники :-) Действительно, миграция ключей не является формальным нарушением нормальных форм, во всяком случае упоминавшихся 3NF и NFBK - там четко сказано о зависимостях неключевых атрибутов. Я лишь обратил внимание, что при миграции ключей может возникнуть ситуация "подправил здесь - не забудь подправить и там", что сходно с поведением денормализованных таблиц, и само по себе неприятно.

AK-74UКак я понимаю, дело в том, что если вы подразумеваете возможности перекидки заказа от одного клиента к другому, это уже по умолчанию означает что заказ не идентифицируется клиентом, а существует как не зависимая, в принципе, от клиента сущность, хотя и NULLS NOT ALLOWED :) То есть, собственно, никакой идентифицирующей связи изначально.

Здесь я не совсем согласен. IMHO, идентифицирующая связь между заказом и клиентом совсем не означает, что заказ нельзя перекинуть между клиентами. Перекинуть в наше время можно абсолютно все, даже области бывшего СССР между странами, хотя раньше за одну мысль об этом полагались крупные неприятности.

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

Например, если главная сущность - страна, а подчиненная - область, в справочнике областей не получится установить альтернативный ключ UNIQUE (Название), так как в разных странах могут быть области с одинаковыми названиями. Правильным будет (Страна_ИД, Название). Поэтому сущность "Ивановская обл." в мировом масштабе без указания страны бессмысленна - вот мы говорим, что область идентифируется не только названием, но и страной.

А как же суррогатные ключи? Здесь нужно помнить, что введение суррогатного ключа - это "механическая операция, которая никак не нарушает инфологической модели и целостности данных. С точки зрения инфологической модели эти две базы данных эквивалентны." (c) А. Тенцер. То есть введение суррогатного ключа, и обеспечение уникальности таким образом вовсе не снимает идентифицируемости связи. Просто рассуждения об уникальности и идентификации переносятся с первичного ключа на альтернативные, подобно тому, как при введении суррогатного ключа старый PRIMARY KEY заменяется на UNIQUE CONSTRAINT.

Выполнять ли миграцию ключей в идентифицирующих связях - вопрос скорее технический, и подобен спору о естественных ключах против искусственных. Подобие это в том, что обе модели остаются эквивалентными в инфологическом смысле, и отличаются простотой и производительностью некоторых видов запросов, необходимостью JOIN, необходимостью каскадных модификаций.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635758
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bely
svnvlad2. В первичном ключе есть несколько полей, которые в совокупности с полем id составляют уникальность. Однако поле id - само по себе уже является уникальным и ненулевым, однозначно идентифицирующим запись.Если у вас есть естественный ключ,

Это какой??
(familia, imja, otchestvo, datarojd, pas_ser, pas_no) ?

Bely
то зачем использовать в добавок к нему еще и суррогатный?
Если так делать - то будут проблемы с нормализацией.

А если просто выкинуть суррогатный ключ (ID) - то все будет нормально.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635779
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladBely
svnvlad2. В первичном ключе есть несколько полей, которые в совокупности с полем id составляют уникальность. Однако поле id - само по себе уже является уникальным и ненулевым, однозначно идентифицирующим запись.Если у вас есть естественный ключ,

Это какой??
(familia, imja, otchestvo, datarojd, pas_ser, pas_no) ?
Код: plaintext
Primary Key ("order_id","cust_id", "item_id")
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35635794
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat FisherМне не нравится одна вещь.IMHO, одна из главных заблуждений многих проектировщиков заключается в уверенности, что нормализация каким-либо боком имеет отношение к оптимизации хранения и/или получения данных. Это не совсем так, я бы даже сказал, совсем не так. Её главная задача состоит в стремлении избежать аномалий данных, что может привести, если не к потере, то к недостоверности хранимой информации.
Сам процесс нормализации должен начинаться, по большому счету, не с выделения сущностей и установки между ними связей. А, скорее, наоборот, берется некий массив данных предметной области, представимый в табличной форме, а далее, опираясь на понятие нормальных форм, он анализируется на предмет возможного появления аномалий. Если анализ не обнаружил угрозы их появления, то фактически на этом нормализация и закончена. В противном случае, принимаются меры, чтобы устранить шансы их(аномалий) проявления. Как правило, это ведет к разбиению исходной таблицы на некоторое подмножество таблиц, взаимосвязанных друг с другом какими-то наборами атрибутов, и в каждой из которых, по возможности, проявление аномалий невозможно. Если какая-либо дочерняя таблица по прежнему имеет опасность появления аномалий, то процесс повторяется, но уже в применении к дочерней таблице. И так рекурсивно, до тех пор, пока нас не удовлетворит результат, в виде множества таблиц и связей между ними.
Таким образом, можно сказать, что связи являются следствием подобного разбиения, но не наоборот. И тогда "идентифицируемость" диктуется самим процессом нормализации, а не подгонкой типа потенциально возможных связей под существующий набор произвольно выбранных сущностей, как это, чаще всего, происходит на практике.

IMHO:
Насколько я понимаю, практический подход в значительной степени определяется популярностью объектно-ориентированного подхода(ООП), который никоим образом не является синонимом реляционной модели данных(РМД), который, по большому счету, идет от данных, а не от сущностей. И сущность в ООП, в общем случае, совсем не обязательно равна таблице в РМД, так как выбирается программистом-проектировщик исходя из своих, зачастую, искаженных понятий о предметной области, вплоть до полной абстракции оных. Тогда как РМД, отталкиваясь от понятия "данных", представимых в табличной форме, опирается на формализованный математический подход и выражает его(понятие) через понятийный аппарат теории множеств.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / IDEF1X: идентифицирующие отношения с практической точки зрения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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