powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / IDEF1X: идентифицирующие отношения с практической точки зрения
34 сообщений из 34, показаны все 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
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35636017
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA пишет:

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

Это - да, но всё же говорить, что "нормализация (не) имеет отношения к
оптимизации хранения и/или получения данных" ни в коем случае нельзя.
Она имеет непосредственное отношение и к тому, и к другому.

При нормализации за счёт устранения дублирования данных (аномалий,
о которых уже шла речь) УМЕНЬШАЕТСЯ суммарный объём, занимаемый данными.
(бывают случаи, когда этого не происходит, или наоборот происходит увеличение,
но они -- скорее исключение). Это влияет непосредственно и на получение
данных :
поскольку снижается их объём, в каких-то случаях получение данных
ускоряется.

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35636098
AK-74U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat FisherИдентифицирующая связь скорее означает, что подчиненная сущность не только не может существовать без главной, но и всех атрибутов подчиненной сущности (без идентификатора главной) будет недостаточно, чтобы идентифицировать ее в реальном мире. Другими словами, невозможно построить никакой альтернативный ключ без участия идентификатора главной сущности.
Я, вероятно, не очень хорошо излагаю свои мысли 0:) Вы, безусловно, правы. Однако я и не утверждаю, что заказ нельзя перекинуть. Я как раз подразумеваю, что заказ возможно идентифицировать и без участия клиентской сущности.
ChAНасколько я понимаю, практический подход в значительной степени определяется популярностью объектно-ориентированного подхода(ООП), который никоим образом не является синонимом реляционной модели данных(РМД), который, по большому счету, идет от данных, а не от сущностей. И сущность в ООП, в общем случае, совсем не обязательно равна таблице в РМД, так как выбирается программистом-проектировщик исходя из своих, зачастую, искаженных понятий о предметной области, вплоть до полной абстракции оных. Тогда как РМД, отталкиваясь от понятия "данных", представимых в табличной форме, опирается на формализованный математический подход и выражает его(понятие) через понятийный аппарат теории множеств.
Вы не могли бы более развернуто изложить вашу точку зрения о влиянии ООП на практику работы с реляционными моделями? Очень интересно.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35637134
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AK-74U Я как раз подразумеваю, что заказ возможно идентифицировать и без участия клиентской сущности.

Верно, заказ - неудачная штука для иллюстрации идентифицирующей связи. У него совершенно отсутствует естественный ключ, поскольку много заказов могут быть совершенно одинаковы даже у одного и того же клиента. Поэтому мы вынуждены прицепить к нему номер, а с ним - и самодостаточность в идентификации. В принципе, сформированный заказ с номером, как кучка подготовленной продукции на складе, вообще может какое-то время пожить без клиента - хозяин отказался, налетай, кто хочет. Какая же это идентифицирующая связь?
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35638338
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто - да, но всё же говорить, что "нормализация (не) имеет отношения к
оптимизации хранения и/или получения данных" ни в коем случае нельзя.
Она имеет непосредственное отношение и к тому, и к другому.Можно, ибо отношение не только косвенное, но и неоднозначное. То, что в процессе нормализации может происходить уменьшение объема хранимых данных, можно считать дополнительным бонусом. Но может и не происходить, а может, для некоторых видов оптимизации, понадобится денормализация. Поэтому настаиваю, что нормализация в буквальном смысле не имеет никакого отношения к оптимизации, а предназначена только для устранения возможных противоречий(аномалий) в модели данных.
Некоторые виды аномалий действительно имеют отношение к дублированию данных, и, естественно, при их устранении естественным образом будет происходить "уплотнение" данных. Идеалом считается БД, в которой каждый факт предметной области будет хранится в одном-единственном месте. Но это будет следствием нормализации, а не оптимизации. Более того, сама по себе, нормализация имеет отношение к логическому проектированию, и в ходе его выполнения проектировщики не должны заниматься оптимизацией, впадая в грех так называемой "преждевременной оптимизации". Сначала надо сделать "правильную" БД, а потом уже думать об оптимизации в рамках физической реализации. И вот тогда-то все и начинается, выбор типов данных, добавление суррогатных ключей, конструирование индексов и т.д. и т.п.

AK-74UВы не могли бы более развернуто изложить вашу точку зрения о влиянии ООП на практику работы с реляционными моделями? Очень интересно.Ничего интересного. Достаточно посмотреть, как проектируют программисты, грубо говоря, "от сохи", т.е., те, кто никогда серьезно не занимался до этого проектированием БД и не читал литературу на эту тему. Они обычно пытаются мыслить в том же духе классов, свойств, агрегации, etc. А до этого точно так же мыслили записями. Т.е., их путь идет не от той информации, которую они будут обрабатывать, а от того, какие сущности(классы) они "увидели", не зная, да и не пытаясь охватить взглядом целостную модель.
Нормальное проектирование подразумевает предварительный этап плотного знакомства с предметной областью, выделения информационных потоков, включая их взаимодействие и преобразование. И только после такого анализа можно садиться за "конструирование реальности", выделяя информационные единицы и тестируя их на аномальность. Это очень грубое, схематичное, описание процесса, более внятно это описано во всякого рода книгах на тему проектирования БД. Несмотря на отдельные разногласия, в целом они говорят об одном - прежде чем проектировать, изучите ту предметную область, для которой собираетесь строить модель. И тогда не придется каждый раз перестраивать БД и переписывать код клиента, когда всплывут новые, неозвученные ранее, пожелания заказчика.
Обратный путь, характерный для практиков, ведет к итерационному процессу, когда после очередной итерации выясняется, что "классификация" выполнена неполно, так как не учитывает тех или иных нюансов предметной области, типичный вариант "из-за деревьев не увидели леса". И по новой, "на колу висит мочало - начинаем все сначала". Самое плохое, что переделка обычно задевает все уровни системы. От БД, до клиентского интерфейса.

P.S. А, вообще, в данной теме это уже злостный офтоп.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35639501
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAПоэтому настаиваю, что нормализация в буквальном смысле не имеет никакого отношения к оптимизации

"Ой, не пойму я, чего вы спорите..." (с) д.Федор.

Нормализация - она одна. Движение от первой к пятой НФ, и точка.

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

О процессе нормализации можно лишь сказать, что при нем происходит оптимизация по критерию устранения аномалий обновления. Об остальных критериях однозначно сказать нельзя: быстродействие - скорее улучшается, кроме некоторых типов запросов. Объем данных - скорее уменьшается, хотя можно придумать случаи, когда это не так. Число таблиц (если кто-то вздумает "оптимизировать" по этому критерию - ухудшается :-) Простота некоторых видов запросов - ухудшается.

Так что оптимизировать можно и после нормализации, отдельно. А лучше, конечно, помнить о ключевых критериях необходимой оптимизации и в ходе проектирования.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35640150
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat Fisher"Ой, не пойму я, чего вы спорите..."Действительно, о чем ?Cane Cat FisherНормализация - она одна. Движение от первой к пятой НФ, и точка.Как это одна ? Каждая нормальная форма борется с каким-либо конкретным недостатком представления данных. И, надеюсь, не сильно Вас удивлю, если упомяну о 6NF , вдобавок к наиболее известным шести ? Не удивлюсь, если со временем будут введены и более высокие, в полном соответствии с лозунгом "нет предела совершенству". Хотя на практике, как правило, все ограничивается 3НФ, или БКНФ. Впрочем, вынужден признать свою неправоту. Как утверждают апологеты, приведение к БКНФ достаточно, чтобы избежать всех известных аномалий. Более высокие НФ решают несколько иные задачи.

Cane Cat FisherА оптимизаций может быть много. Не бывает "оптимизации" вообще - бывают разные оптимизации по разным критериям, зачастую противоречащие друг другу. Иногда для достижения одной цели приходится "проваливать" оптимальность по большинству остальных параметров.Безусловно. Но какое отношение эти, извиняюсь, банальные рассуждения имеют к нормализации ? Или ведете к тому, что всё, что ни делается, к лучшему ? Ну, тогда любой процесс можно рассматривать как оптимизацию. "Баба с воза, кобыле легче". Но хотелось бы этого избежать, так как слишком вольная трактовка терминов не способствует взаимопониманию.

Cane Cat FisherО процессе нормализации можно лишь сказать, что при нем происходит оптимизация по критерию устранения аномалий обновления .Вот, вот, в полном соответствии с предыдущим абзацем. Не возникает ощущения неестественности выделенного словосочетания ?

Cane Cat FisherОб остальных критериях однозначно сказать нельзя: быстродействие - скорее улучшается, кроме некоторых типов запросов. Объем данных - скорее уменьшается, хотя можно придумать случаи, когда это не так. Число таблиц (если кто-то вздумает "оптимизировать" по этому критерию - ухудшается :-) Простота некоторых видов запросов - ухудшается.Какое-такое быстродействие ? Какие-такие запросы ? Мне кажется, что Вы тоже смешиваете процесс логического проектирования, на котором формально происходит нормализация, и физического. Готов согласится, что в повседневной практике часто они происходят одновременно, хотя не готов считать такую ситуацию нормой. Но именно об этом я и писал, упоминая преждевременную оптимизацию, которая вполне способна запутать ситуацию, порождая совершенно невообразимые формы, которые удовлетворяют понятию оптимальности конкретного проектировщика. Почему-то при этом нередко всплывает нарушение 1НФ, насмотрелся.
Еще раз повторюсь, сделай "правильную" БД, а потом хоть заоптимизируйся, по любому критерию, который больше нравится.
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35640286
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChACane Cat FisherНормализация - она одна. Как это одна ?

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

А вот если потом заставить их оптимизировать это по одному и томе же критерию, скажем, быстродействию - от результат может быть разным, и это нормально.

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

Я хочу лишь сказать, что вот Вы рассуждали о связи нормализации и оптимизации, или отсутствии таковой, и ни разу рядом с оптимизацией не упомянули о ее критериях. А без этого в слове "оптимизация" не больше смысла, чем в известных словах "перестройка" и "ускорение" :-)
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35640528
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat FisherChACane Cat FisherНормализация - она одна. Как это одна ?

Так, что это достаточно жестко заданный процесс. Если нескольким специалистам поставить одну и ту же задачу, например привести к НФБК набор таблиц, то результат у всех будет одинаков.Принимается. Но только при условии, если таковые "специалисты" имеют не только четкое понимание хотя бы первых трёх НФ, но и придерживаются их на практике. Что, увы, совсем необязательно. Я ведь не зря упомянул нарушение 1НФ в предпоследней фразе предыдущего поста. Вот вроде и основной ключ наличествует, и явных функциональной зависимостей между атрибутами, помимо ОК не наблюдается. Но нет, нет, да наткнешся на список значений в поле. Оно бы и ладно, если бы какой-нибудь вектор значений, который только клиент и разбирает, так ведь и запросы к таблице соответствующие, фултесктоподобные. Формально, при соблюдении 1НФ значения полей должны рассматриваться только как атомарные, каковые должны сравниваться только на равенство или неравенство в целом, а не какой-то их части. Это не считая проверки на NULL, который сам по себе вещь весьма неоднозначная, чему Дейт в своей классической книге уделил немало внимания.

Cane Cat FisherЯ хочу лишь сказать, что вот Вы рассуждали о связи нормализации и оптимизации, или отсутствии таковой, и ни разу рядом с оптимизацией не упомянули о ее критериях.Кхм. Начинаем прямо с первой фразы отсюда . Просто Вы потеряли контекст, явно зацепившись за фразу из моего ответа MasterZiv, который, в свою очередь, комментировал мою.

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

P.P.S. Я вот вчера в словаре с удивлением обнаружил, что "амбициозный" - это "высокомерный" :) Хотя вполне можно наткнуться на формулировку типа "амбициозный проект" или "план". "Высокомерный" проект - неплохо звучит ? ;)
...
Рейтинг: 0 / 0
IDEF1X: идентифицирующие отношения с практической точки зрения
    #35640812
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAесли таковые "специалисты" имеют не только четкое понимание хотя бы первых трёх НФ, но и придерживаются их на практике. Что, увы, совсем необязательно. Я ведь не зря упомянул нарушение 1НФ в предпоследней фразе предыдущего поста

Ой, как я Вас понимаю! А мой навязчивый кошмар - отстуствие первичных ключей в старых системах. Началось еще в 94 году, когда одна светлая голова кодом товара сделала сокращение - по две буквы от каждого слова. И все работало несколько лет, пока не купили Ко леса Та врии и Ко лер Та мбовский :)

ChAP.P.S. Я вот вчера в словаре с удивлением обнаружил, что "амбициозный" - это "высокомерный" :)

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


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