|
|
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
Приветствую участников форума! Изучив модель 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 из которых раньше в ней не было. В третьих, попытавшись реализовать правильную модель, встретился с непониманием руководства ;), пришлось заменить абсолютно все идентифицирующие отношения неидентифицирующими. Честно говоря, поразмыслив, не нашел ни одного довода, по которому я должен применять идентифицирующие отношения. В связи с этим, вопрос к уважаемым специалистам, вы когда-нибудь применяете в своей практике идентифицирующие отношения и в каких случаях? (случай многие-ко-многим не в счет). Каковы плюсы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2008, 15:08:25 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
svnvladВ связи с этим, вопрос к уважаемым специалистам, вы когда-нибудь применяете в своей практике идентифицирующие отношения и в каких случаях? (случай многие-ко-многим не в счет).А почему, собственно, не в счёт, если сущность "Заказ" реализует связь "многие-ко-многим" между сущностями "Клиент" и "Позиция заказа"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 10:02:04 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
Василий А. Сидоровсущность "Заказ" реализует связь "многие-ко-многим" между сущностями "Клиент" и "Позиция заказа"? Ну и что? Попрошу заметить, что здесь не обойдёшься составным Primary из двух Foreign. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 10:28:45 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
Мудрый Яндекс подсказывает нам: ЯндексС позиции дочерней сущности можно выделить следующие виды отношений: 1. Идентифицирующее отношение. Если для того чтобы однозначно идентифицировать некоторый экземпляр дочерней сущности необходимо знать с каким экземпляром родительской сущности он связан в соответствующем отношении, то такое отношение называется идентифицирующим. Рассморим в качестве примера две сущности: первая обозначает множество проектов, а вторая - множество работ, которые должны выполняться в рамках этих проектов. Поскольку в различных проектах могут выполняться аналогичные работы, то для однозначного определения работы необходимо знать соответствующий ее проект. Пусть некоторые два экземпляра сущности ``проект'' представляют, например, сроительство здания $A$ и здания $B$. При этом и первый и второй проекты включают работу по подготовке фундамента. Для того чтобы решить о каком фундаменте идет речь необходимо указать для какого здания он возводится. В даннос случае отношение между сущностями ``проект'' и ``работа'' будет идентифицирующим. Если отношение является идентифицирующим, то соответствующая дочерняя сущность является зависимой (родительская сущность может быть как зависимой так и независимой). 2. Неидентифицирующее отношение. Если экземпляр дочерней сущности может быть однозначно идентифицирован без указания соответствующего экземпляра родительской сущности, то такое отношение является неидентифицирующим. Примером такого отношения может служить неоднократно упоминавшийся пример с отделами и сотрудниками. Каждый экземпляр сущности ``сотрудник'' уникально идентифицируется тройкой < ``имя'', ``отчество'', ``фамилия''>. Для того чтобы найти конкретного сотрудника нет необходимости знать отдел, где этот сотрудник работает, достаточно знать его полное имя. Если отношение не является идентифицирующим, то дочерняя сущность не обязательно должна быть независимой, поскольку может существовать другое идентифицирующее отношение, где эта сущность является дочерней. Ощущаете разницу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 10:33:58 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
AK-74U 1. Идентифицирующее отношение. ... Поскольку в различных проектах могут выполняться аналогичные работы, то для однозначного определения работы необходимо знать соответствующий ее проект. Пусть некоторые два экземпляра сущности ``проект'' представляют, например, сроительство здания $A$ и здания $B$. При этом и первый и второй проекты включают работу по подготовке фундамента. Для того чтобы решить о каком фундаменте идет речь необходимо указать для какого здания он возводится. В даннос случае отношение между сущностями ``проект'' и ``работа'' будет идентифицирующим. Вы говорите об этой схеме. Схема рассмотрена с точки зрения проектировщика. Давайте теперь посмотрим с точки зрения программиста: ... для однозначного определения работы необходимо знать соответствующий ей проект... именно для этого и вводится Foreign Key id_project в таблице work. И ему для этого не обязательно располагаться в области первичного ключа. Первичный ключ - автоинкрементное поле id_work - с точки зрения базы однозначно идентифицирует экземпляр сущности ``работа''. Вот запрос, определяющий строительство фундамента для здания $A$ (неидентифицирующее отношение): Код: plaintext 1. 2. 3. Запрос для идентифицирующего отношения: Код: plaintext 1. 2. 3. Как видите, никакой разницы. Неприятности начинаются, когда у нас каскад из 3 или более зависимых сущностей. Тогда первичный ключ обязан целиком перекочевать в дочернюю сущность, т.е. в дочерней таблице появляются поля, которых в ней не было (id1, id2, id3, ...). И если для доступа к полю 3-ей таблицы в неидентифицирующем отношении мы обошлись бы двумя JOIN-ами Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 11:59:50 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 12:00:38 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 12:01:18 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
svnvladНеприятности начинаются, когда у нас каскад из 3 или более зависимых сущностей. Тогда первичный ключ обязан целиком перекочевать в дочернюю сущность, т.е. в дочерней таблице появляются поля, которых в ней не было (id1, id2, id3, ...). И если для доступа к полю 3-ей таблицы в неидентифицирующем отношении мы обошлись бы двумя JOIN-ами Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. А неприятность при отказе от идентифицирующих связей можно получить запросто, конкретно просадив производительность определенного типа запросов. Например, пусть мы имеем 3-уровневый каскад, T1->T2->T3. В случае агрегирующих запросов на самом нижнем уровне(T3) относительно самого верхнего(T1), надо будет в запрос обязательно включать в слияние промежуточный уровень(T2). В случае же идентифицирующих связей достаточно слияния между T1 и T3, а то и вовсе обойтись без слияния, если интересует агрегация по заранее известному T1.ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 12:40:59 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
ChA По каким таким правилам ? Транзитивность уже отменили ? Если A=B и B=C, то A=C. А неприятность при отказе от идентифицирующих связей можно получить запросто, конкретно просадив производительность определенного типа запросов. Например, пусть мы имеем 3-уровневый каскад, T1->T2->T3. В случае агрегирующих запросов на самом нижнем уровне(T3) относительно самого верхнего(T1), надо будет в запрос обязательно включать в слияние промежуточный уровень(T2). В случае же идентифицирующих связей достаточно слияния между T1 и T3, а то и вовсе обойтись без слияния, если интересует агрегация по заранее известному T1.ID. Большое спасибо за пояснения, очень интересно. То есть, вводим избыточность? А это не противоречит нормализации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 13:21:54 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
svnvladТо есть, вводим избыточность? А это не противоречит нормализации?А где вы увидели избыточность? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 13:40:20 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
BelysvnvladТо есть, вводим избыточность? А это не противоречит нормализации?А где вы увидели избыточность? 1. К одной и той же цели можно дойти двумя разными путями: собрав все промежуточные JOIN-ы, либо взять готовые значения из внешних (они же первичные) ключей этой же таблицы. 2. В первичном ключе есть несколько полей, которые в совокупности с полем id составляют уникальность. Однако поле id - само по себе уже является уникальным и ненулевым, однозначно идентифицирующим запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 13:51:39 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
BelysvnvladТо есть, вводим избыточность? А это не противоречит нормализации?А где вы увидели избыточность? Вот, накопал. :) В ту степь?? Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 14:17:35 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
svnvlad1. К одной и той же цели можно дойти двумя разными путями: собрав все промежуточные JOIN-ы, либо взять готовые значения из внешних (они же первичные) ключей этой же таблицы.Ну и что. Можно посчитать сумму SQL запросом, а можно в сводной таблице в Excel-е. Да и один и тот же результат можно получать разными SQL запросами. svnvlad2. В первичном ключе есть несколько полей, которые в совокупности с полем id составляют уникальность. Однако поле id - само по себе уже является уникальным и ненулевым, однозначно идентифицирующим запись.Если у вас есть естественный ключ, то зачем использовать в добавок к нему еще и суррогатный? Если так делать - то будут проблемы с нормализацией. А если просто выкинуть суррогатный ключ (ID) - то все будет нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 14:47:50 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
Нет, нормальная форма Бойса-Кодда - это не совсем из этой оперы. Собственно, ChA уже всё сказал. Идентифицирующая связь добавляет признаки идентичности в дочернюю сущность. Идентичности, заметьте, а не просто связи. При использовании идентифицирующих связей, как правило, искусственный идентификатор не требуется. То есть здесь: Код: plaintext 1. 2. 3. 4. 5. 6. quantity_id - он искусственно привнесен. На самом деле, пример плохой, потому что таблица "Количество пунктов заказа" сама по себе еретического свойства :) Вот если вместо неё мы добавим: Код: plaintext 1. 2. 3. 4. 5. 6. то получим вполне человеческую схему с таблицей "Пункты заказа", которой не требуется искусственный ключ. И из которой, заметьте, очень легко получить данные о том, сколько штук чего-то там заказал за историю покупок ваш клиент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 14:48:16 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
svnvladChAТо есть, вводим избыточность? А это не противоречит нормализации?Нет тут никакой избыточности. Это явление обычно называют миграцией ключей. И само по себе оно никак нормализации не противоречит. Но есть одно "но". Идентифицирующая связь подразумевает вхождение ключа предка в основной ключ потомка. И, таким образом, идентификация потомка должна выполняться при обязательном участии атрибутов предка. В противном случае, смысл в идентифицирующей связи попросту исчезнет. Вы сами нарушаете это правило, добавляя уникальный суррогатный атрибут, в результате чего отпадает необходимость атрибутов предка для идентификации записи. И этот атрибут, в принципе, и становится основным ключом данной таблицы. Но как только мы откажемся от условия уникальности этого атрибута в рамках таблицы, и остановимся на его уникальности в пределах мигрированных атрибутов предка, как все сразу станет на свои места. Обычно, подобная уникальность определяется предметной областью. Житейски говоря, надо понять, каким образом пользователь будет отличать одну строку от другой в рамках атрибутов предка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 14:53:43 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
ChAsvnvladChAТо есть, вводим избыточность? А это не противоречит нормализации?Нет тут никакой избыточности. Это явление обычно называют миграцией ключей. И само по себе оно никак нормализации не противоречит. Но есть одно "но". Идентифицирующая связь подразумевает вхождение ключа предка в основной ключ потомка. И, таким образом, идентификация потомка должна выполняться при обязательном участии атрибутов предка. В противном случае, смысл в идентифицирующей связи попросту исчезнет. Вы сами нарушаете это правило, добавляя уникальный суррогатный атрибут, в результате чего отпадает необходимость атрибутов предка для идентификации записи. И этот атрибут, в принципе, и становится основным ключом данной таблицы. Но как только мы откажемся от условия уникальности этого атрибута в рамках таблицы, и остановимся на его уникальности в пределах мигрированных атрибутов предка, как все сразу станет на свои места. Обычно, подобная уникальность определяется предметной областью. Житейски говоря, надо понять, каким образом пользователь будет отличать одну строку от другой в рамках атрибутов предка. Спасибо :) Это уже становится осмысленным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 15:05:50 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
AK-74UНет, нормальная форма Бойса-Кодда - это не совсем из этой оперы. Собственно, ChA уже всё сказал. Идентифицирующая связь добавляет признаки идентичности в дочернюю сущность. Идентичности, заметьте, а не просто связи. При использовании идентифицирующих связей, как правило, искусственный идентификатор не требуется. То есть здесь: Код: plaintext 1. 2. 3. 4. 5. 6. quantity_id - он искусственно привнесен. На самом деле, пример плохой, потому что таблица "Количество пунктов заказа" сама по себе еретического свойства :) Вот если вместо неё мы добавим: Код: plaintext 1. 2. 3. 4. Забыл поменять :) AK-74U Код: plaintext 1. то получим вполне человеческую схему с таблицей "Пункты заказа", которой не требуется искусственный ключ. И из которой, заметьте, очень легко получить данные о том, сколько штук чего-то там заказал за историю покупок ваш клиент. Здесь item_id - не является Autoincrement, надо понимать, что-то типа артикула? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 15:10:47 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
Мне не нравится одна вещь. Предположим, мы выписали заказ, но ошиблись - не на того клиента. Нужно перекинуть заказ со всеми позициями на другого клиента. В случае с суррогатными идентификаторами и неидентифицирующими связями достаточно поменять внешний ключ cust_id в таблице order. Позиции заказа трогать не надо - они ссылаются на тот же order_id. В случае же идентифицирующих отношений и миграции ключей нам потребуется не только изменение cust_id в order, но и каскадное изменение cust_id в order_items. Причем, заметьте, в обоих таблицах меняется часть первичного ключа, что само по себе нехорошо во многих случаях. И еще здесь можно усмотреть нарушение нормализации - зависимость между атрибутами. А именно, в таблице order_items поле cust_id однозначно определяется полем order_id. Все равно что поле X^2 рядом с полем X. А довод о повышении производительности агрегирующих запросов, и что "очень легко получить данные о том, сколько штук чего-то там заказал за историю покупок ваш клиент" (отсутствие необходимости JOIN-ов) с одной стороны верны, но с другой стороны - не совсем. С теми же доводами поля любого справочника, по полям которого нужна агрегация, можно продублировать в главной таблице. Допускаю, что иногда это оправдано (денормализация для увеличения производительности), но как общий аргумент (что это хорошо и правильно всегда) - вряд ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 15:48:03 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
Очевидно, ссылка на внешнюю таблицу Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 15:49:33 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherИ еще здесь можно усмотреть нарушение нормализации - зависимость между атрибутами. А именно, в таблице order_items поле cust_id однозначно определяется полем order_id. Как уже сказали до меня выше, миграция первичных ключей не может рассматриваться в качестве избыточности. Потому что это первичный ключ. Он един и неделим в своём качестве. Cane Cat FisherВ случае же идентифицирующих отношений и миграции ключей нам потребуется не только изменение cust_id в order, но и каскадное изменение cust_id в order_items. Причем, заметьте, в обоих таблицах меняется часть первичного ключа, что само по себе нехорошо во многих случаях. Возможно, у нас пример с заказами не особо удачный. Как я понимаю, дело в том, что если вы подразумеваете возможности перекидки заказа от одного клиента к другому, это уже по умолчанию означает что заказ не идентифицируется клиентом, а существует как не зависимая, в принципе, от клиента сущность, хотя и NULLS NOT ALLOWED :) То есть, собственно, никакой идентифицирующей связи изначально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 16:00:01 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
AK-74U Cane Cat FisherВ случае же идентифицирующих отношений и миграции ключей нам потребуется не только изменение cust_id в order, но и каскадное изменение cust_id в order_items. Причем, заметьте, в обоих таблицах меняется часть первичного ключа, что само по себе нехорошо во многих случаях. Возможно, у нас пример с заказами не особо удачный. Как я понимаю, дело в том, что если вы подразумеваете возможности перекидки заказа от одного клиента к другому, это уже по умолчанию означает что заказ не идентифицируется клиентом, а существует как не зависимая, в принципе, от клиента сущность, хотя и NULLS NOT ALLOWED :) То есть, собственно, никакой идентифицирующей связи изначально. Заметьте, Вы сейчас сказали, что связь "многие-ко-многим" не является редактируемой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 17:02:36 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
AK-74UКак уже сказали до меня выше, миграция первичных ключей не может рассматриваться в качестве избыточности. Потому что это первичный ключ. Он един и неделим в своём качестве. Я вовсе не пытаюсь уличить в безграмотности все учебники :-) Действительно, миграция ключей не является формальным нарушением нормальных форм, во всяком случае упоминавшихся 3NF и NFBK - там четко сказано о зависимостях неключевых атрибутов. Я лишь обратил внимание, что при миграции ключей может возникнуть ситуация "подправил здесь - не забудь подправить и там", что сходно с поведением денормализованных таблиц, и само по себе неприятно. AK-74UКак я понимаю, дело в том, что если вы подразумеваете возможности перекидки заказа от одного клиента к другому, это уже по умолчанию означает что заказ не идентифицируется клиентом, а существует как не зависимая, в принципе, от клиента сущность, хотя и NULLS NOT ALLOWED :) То есть, собственно, никакой идентифицирующей связи изначально. Здесь я не совсем согласен. IMHO, идентифицирующая связь между заказом и клиентом совсем не означает, что заказ нельзя перекинуть между клиентами. Перекинуть в наше время можно абсолютно все, даже области бывшего СССР между странами, хотя раньше за одну мысль об этом полагались крупные неприятности. Идентифицирующая связь скорее означает, что подчиненная сущность не только не может существовать без главной, но и всех атрибутов подчиненной сущности (без идентификатора главной) будет недостаточно, чтобы идентифицировать ее в реальном мире. Другими словами, невозможно построить никакой альтернативный ключ без участия идентификатора главной сущности. Например, если главная сущность - страна, а подчиненная - область, в справочнике областей не получится установить альтернативный ключ UNIQUE (Название), так как в разных странах могут быть области с одинаковыми названиями. Правильным будет (Страна_ИД, Название). Поэтому сущность "Ивановская обл." в мировом масштабе без указания страны бессмысленна - вот мы говорим, что область идентифируется не только названием, но и страной. А как же суррогатные ключи? Здесь нужно помнить, что введение суррогатного ключа - это "механическая операция, которая никак не нарушает инфологической модели и целостности данных. С точки зрения инфологической модели эти две базы данных эквивалентны." (c) А. Тенцер. То есть введение суррогатного ключа, и обеспечение уникальности таким образом вовсе не снимает идентифицируемости связи. Просто рассуждения об уникальности и идентификации переносятся с первичного ключа на альтернативные, подобно тому, как при введении суррогатного ключа старый PRIMARY KEY заменяется на UNIQUE CONSTRAINT. Выполнять ли миграцию ключей в идентифицирующих связях - вопрос скорее технический, и подобен спору о естественных ключах против искусственных. Подобие это в том, что обе модели остаются эквивалентными в инфологическом смысле, и отличаются простотой и производительностью некоторых видов запросов, необходимостью JOIN, необходимостью каскадных модификаций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 17:33:21 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
Bely svnvlad2. В первичном ключе есть несколько полей, которые в совокупности с полем id составляют уникальность. Однако поле id - само по себе уже является уникальным и ненулевым, однозначно идентифицирующим запись.Если у вас есть естественный ключ, Это какой?? (familia, imja, otchestvo, datarojd, pas_ser, pas_no) ? Bely то зачем использовать в добавок к нему еще и суррогатный? Если так делать - то будут проблемы с нормализацией. А если просто выкинуть суррогатный ключ (ID) - то все будет нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 17:42:44 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
svnvladBely svnvlad2. В первичном ключе есть несколько полей, которые в совокупности с полем id составляют уникальность. Однако поле id - само по себе уже является уникальным и ненулевым, однозначно идентифицирующим запись.Если у вас есть естественный ключ, Это какой?? (familia, imja, otchestvo, datarojd, pas_ser, pas_no) ? Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 17:48:47 |
|
||
|
IDEF1X: идентифицирующие отношения с практической точки зрения
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherМне не нравится одна вещь.IMHO, одна из главных заблуждений многих проектировщиков заключается в уверенности, что нормализация каким-либо боком имеет отношение к оптимизации хранения и/или получения данных. Это не совсем так, я бы даже сказал, совсем не так. Её главная задача состоит в стремлении избежать аномалий данных, что может привести, если не к потере, то к недостоверности хранимой информации. Сам процесс нормализации должен начинаться, по большому счету, не с выделения сущностей и установки между ними связей. А, скорее, наоборот, берется некий массив данных предметной области, представимый в табличной форме, а далее, опираясь на понятие нормальных форм, он анализируется на предмет возможного появления аномалий. Если анализ не обнаружил угрозы их появления, то фактически на этом нормализация и закончена. В противном случае, принимаются меры, чтобы устранить шансы их(аномалий) проявления. Как правило, это ведет к разбиению исходной таблицы на некоторое подмножество таблиц, взаимосвязанных друг с другом какими-то наборами атрибутов, и в каждой из которых, по возможности, проявление аномалий невозможно. Если какая-либо дочерняя таблица по прежнему имеет опасность появления аномалий, то процесс повторяется, но уже в применении к дочерней таблице. И так рекурсивно, до тех пор, пока нас не удовлетворит результат, в виде множества таблиц и связей между ними. Таким образом, можно сказать, что связи являются следствием подобного разбиения, но не наоборот. И тогда "идентифицируемость" диктуется самим процессом нормализации, а не подгонкой типа потенциально возможных связей под существующий набор произвольно выбранных сущностей, как это, чаще всего, происходит на практике. IMHO: Насколько я понимаю, практический подход в значительной степени определяется популярностью объектно-ориентированного подхода(ООП), который никоим образом не является синонимом реляционной модели данных(РМД), который, по большому счету, идет от данных, а не от сущностей. И сущность в ООП, в общем случае, совсем не обязательно равна таблице в РМД, так как выбирается программистом-проектировщик исходя из своих, зачастую, искаженных понятий о предметной области, вплоть до полной абстракции оных. Тогда как РМД, отталкиваясь от понятия "данных", представимых в табличной форме, опирается на формализованный математический подход и выражает его(понятие) через понятийный аппарат теории множеств. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2008, 17:56:53 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35635253&tid=1543587]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
198ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 530ms |

| 0 / 0 |
