|
|
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
Предположим, есть сущность Клиент и сущность Паспорт, удостоверяющая клиента. Схема БД для этого случая могла-бы выглядеть так: Код: plaintext 1. поле Паспорт.Владелец является FK на таблицу Клиент. Такая схема гарантирует, что каждый паспорт будет обязательно иметь владельца (из-за наличия ссылки на него). Однако как гарантировать, что каждый клиент будет обладать паспортом ? Что делать с такими циклическими зависимостями ? Просто в нашем проекте сейчас имеются множество сущностей, которые не обладают важным аттрибутом, хотя должны. Нужно что-то придумать, что-бы исключить такие ситуации в будущем ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2008, 10:06 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
Зависит от конкретной СУБД. Если она поддерживает, скажем, такую прикольную фишку как CHECK ON COMMIT, то можно создать встречный внешний ключ, объявить дочернее поле в клиентах обязательным и вставлять данные в обе таблицы строго в одной транзакции. Для полноты картины может потребоваться уникальное ограничение на Clients.PassportId - ну, чтобы паспорт не мог принадлежать более чем одному человеку одновременно. Если же отложенная проверка не поддерживается, то можно перевернуть схему с ног на голову, примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2008, 14:15 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
> как гарантировать, что каждый клиент будет обладать паспортом ? Никак. Паспорт - не единственное удостоверение личности. > Что делать с такими циклическими зависимостями ? Нанять нормального аналитика и хорошего архитектора. Это дорого. Но сильно дешевле перманентного рефакторинга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2008, 19:33 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
Ennor Tiegael Зависит от конкретной СУБД. Если она поддерживает, скажем, такую прикольную фишку как CHECK ON COMMIT, то можно создать встречный внешний ключ, объявить дочернее поле в клиентах обязательным и вставлять данные в обе таблицы строго в одной транзакции. Для полноты картины может потребоваться уникальное ограничение на Clients.PassportId - ну, чтобы паспорт не мог принадлежать более чем одному человеку одновременно. у нас mssql, такой фишки кажется нет Ennor Tiegael Если же отложенная проверка не поддерживается, то можно перевернуть схему с ног на голову, примерно так: так ведь тогда могут появляться паспорта, никому не принадлежащие :) Проблема просто переехала в другую таблицу guest_20040621 Никак. Паспорт - не единственное удостоверение личности. Это просто пример , который приведен для иллюстрации проблемы, что-бы не углубляться в нашу предметную область guest_20040621 Нанять нормального аналитика и хорошего архитектора. Это дорого. Но сильно дешевле перманентного рефакторинга. хочешь я подарю тебе медаль, как самому бесполезному участнику данного форума ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 07:54 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
mdl Ennor Tiegael Если же отложенная проверка не поддерживается, то можно перевернуть схему с ног на голову, примерно так: так ведь тогда могут появляться паспорта, никому не принадлежащие :) Проблема просто переехала в другую таблицуТак может просто совместить их в одной таблице, так как в примере паспорт является обязательным атрибутом клиента ? И вместо сущностей "Клиент", "Паспорт" ввести одну - "Клиент с паспортом". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 14:48 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
ChA Так может просто совместить их в одной таблице, так как в примере паспорт является обязательным атрибутом клиента ? И вместо сущностей "Клиент", "Паспорт" ввести одну - "Клиент с паспортом". вроде как рекомендуемым подходом к проектированию является выделение каждой сущности в отдельную таблицу, тут даже не так давно была ветка, где это обсуждали. Например, если человек сменил паспорт, то я просто добавлю новую запись в Паспорта, а старый паспорт останется для истории (можно ввести флаг Актуальный, что-бы различать, какой паспорт действующий). Кроме того, если сущностей несколько, то базовая таблица начнет приобретать ненормальные размеры (в смысле количества столбцов). Да и когда каждая сущность в отдельном месте - то это воспринимается легче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 16:01 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
mdl ChA Так может просто совместить их в одной таблице, так как в примере паспорт является обязательным атрибутом клиента ? И вместо сущностей "Клиент", "Паспорт" ввести одну - "Клиент с паспортом".вроде как рекомендуемым подходом к проектированию является выделение каждой сущности в отдельную таблицу, тут даже не так давно была ветка, где это обсуждали. Например, если человек сменил паспорт, то я просто добавлю новую запись в Паспорта, а старый паспорт останется для истории (можно ввести флаг Актуальный, что-бы различать, какой паспорт действующий).Сущность не является абсолютом, а всего лишь отражает взгляд аналитика на предметную область, которую он моделирует. В вашей ситуации, IMHO, обязательность паспорта для клиента подразумевает, что клиент вне паспорта попросту не существует. Поэтому вполне разумно не разделять их, а, наоборот, объединить. mdlНапример, если человек сменил паспорт, то я просто добавлю новую запись в Паспорта, а старый паспорт останется для истории (можно ввести флаг Актуальный, что-бы различать, какой паспорт действующий).В этом случае совсем не обязательно рассматривать паспорт как отдельную сущность, а просто добавить, например, таблицу содержащую предыдущие состояния атрибута., т.е., рассматривать как историю атрибута "Паспорт". mdlКроме того, если сущностей несколько, то базовая таблица начнет приобретать ненормальные размеры (в смысле количества столбцов). Да и когда каждая сущность в отдельном месте - то это воспринимается легче.Нет никаких теоретических ограничений на количество атрибутов сущности. Если пытаться свести проектирование к минимизации, то можно и вовсе придти к модели EAV, и считать его идеальным решением. Но такая модель уже будет относиться к чему угодно, но только не к моделированию вашей предметной области. Вы, IMHO, как раз можете сильно усложнить ситуацию, когда начнете разбрасывать обязательные атрибуты по разным таблицам, эмулируя однозначные связи. В практическом смысле иногда это можеть иметь смысл, но вольно идти от обратного. На те комбинации, которые используются чаще всего как выборки, сделать, например, "материализованные представления"(indexed views). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 18:19 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
mdl Ennor Tiegael Если же отложенная проверка не поддерживается, то можно перевернуть схему с ног на голову, примерно так: так ведь тогда могут появляться паспорта, никому не принадлежащие :) Проблема просто переехала в другую таблицуИ кому с этого стало хуже? Поставьте атрибут "Устаревший" для такой записи, и вся любовь. Иначе действительно объединять в одну таблицу, потому что все остальное будет являться стремлением не реализовать требования ТЗ, а избежать широких таблиц. Другой вопрос, что предложенная мной схема плохо работает в случае большого количества разных типов удостоверений личности. Добавлять форейны на водительские права, загранпаспорт и т.д. - это действительно глупо. Тут лучше будет сделать обычную М:М-развязку между таблицами Клиенты и Удостоверения Личности и контролировать целостность связей либо в процедурах вставки / обновления / удаления, либо в соотв. триггерах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2008, 19:53 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
а разве не должны быть данные в одной таблице? ведь по сути у тебя отношение один к одному, ну и нах его бить на две таблице? тем более что тебе нудно проверять целостность данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 10:50 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
xbzведь по сути у тебя отношение один к одному Откуда выдумали это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 11:13 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
есть понятие А и В. между ними есть отношения S(A,B). Определеяется минимальная мощность множества таких отношений |S(A,B)|min=1. Это означает, что для каждого экземпляра А должно существовать по крайне мере один экземпляр отношений. Ну и далее реализация заивисит от .. от много. мы делаем пост проверку в одних случаях (когда ен можем изменить код) или проверку при изменениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 11:21 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
Уж коли паспорт это всего лишь пример. То разделять сущности или нет зависит строго от предметной области. Согласен с мнением, что разделять не стоит, а при необходимости истории писать по триггеру на изменение атрибутов паспорта в другую табличку Если уж разделять, то как вариант, реализовать сущность "паспорт" с полями start_date и end_date. А удаление вставку и модификацию реализовать строго через хранимые процедуры, дабы на уровне БД реализовать ограничение на необходимость паспорта. Одному человеку соответствует только один паспорт с непроставленным end_date. Или вместо start_date и end_date задать только одно поле from_date (дата с которой паспорт актуален) тогда актуальными будут данные с максимальным from_date ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 12:38 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
L-bСогласен с мнением, что разделять не стоит, а при необходимости истории писать по триггеру на изменение атрибутов паспорта в другую табличку Обмусолено уже кучу раз, что нецелесообразность хранения паспорта в самом физике следует не из необходимости сохранения истории (то есть, перечня недействующих паспортов и ошибок), а из того, что может быть много одновременно действующих паспортов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 12:58 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
mdlОднако как гарантировать, что каждый клиент будет обладать паспортом? Никак. Исходя из предметной области, а не того, как это в БД наваять. Также рекомендую прислушаться к советам guest_20040621. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 13:00 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
mdlПросто в нашем проекте сейчас имеются множество сущностей, которые не обладают важным аттрибутом, хотя должны. Нужно что-то придумать, что-бы исключить такие ситуации в будущем ... Все крайне тривиально. На определенном этапе, где требуется наличие атрибута, проверяется его наличие. Если его нет - это ошибка. Например, не выдавать денег из кассы, если не указан паспорт - нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 13:02 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Все крайне тривиально. На определенном этапе, где требуется наличие атрибута, проверяется его наличие. Если его нет - это ошибка. Например, не выдавать денег из кассы, если не указан паспорт - нормально. есть такое понятие как инвариант класса. Это означает, что классу (сущности) назначается ряд правил, которым она обязана удовлетворять в любой момент времени, начиная созданием и кончая разрушением объекта (за исключением времени, когда выполняется какой-нибудь метод, тогда очевидно возможно нарушение инварианта, но для клиентов класса это невидно). Так вот если к примеру паспорт назначен таким обязательным атрибутом, то он должен быть сразу и навсегда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 13:10 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
mdlесть такое понятие как инвариант класса. Это означает, что классу (сущности) назначается ряд правил, которым она обязана удовлетворять в любой момент времени, начиная созданием и кончая разрушением объекта (за исключением времени, когда выполняется какой-нибудь метод, тогда очевидно возможно нарушение инварианта, но для клиентов класса это невидно). Так вот если к примеру паспорт назначен таким обязательным атрибутом, то он должен быть сразу и навсегда Есть такое понятие, как ошибка проектирования. Все остальное замечательно из него исходит и является вторичным. Попробуйте реализовать отложенные циклические зависимости на FK, на большинстве СУБД сервер Вас пошлет куда подальше. И будет во многом прав. Рассуждать о том, что все обязательные атрибуты сущности должны быть в той же таблице, что и сущность - фи, не интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2008, 13:17 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
mdl wrote: > Такая схема гарантирует, что каждый паспорт будет обязательно иметь > владельца (из-за наличия ссылки на него). Однако как гарантировать, что > каждый клиент будет обладать паспортом ? Что делать с такими > циклическими зависимостями ? 0) Каждый клиент НЕ ОБЯЗАН обладать паспортом, это во-первых. значит ссылка на паспорт из клиента должна быть NULL-able. 1) (фактически проблема уже решена) ссылка из паспорта на владельца будет обязательной, обратная ссылка - опциональной. Значит сначала в БД создается клиент, потом его паспорт, потом заполняется ссылка на паспорт в клиенте. Удаление производится в обратном порядке. 2) фактически у клиента паспортов может быть несколько, т.е. от нуля до бесконечности, так что там по идее должно быть три таблицы, но это безусловно зависит от постановки задачи и вам виднее. 3) некоторые СУБД делают отложенную проверку FK, во время коммита, там вообще просто всё. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 01:30 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
mdl wrote: > у нас mssql, такой фишки кажется нет > Это зависит от енжина. Но там только Инно сейчас FK поддерживает, а в нём отложенных FK вроде бы нет. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 01:31 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
MasterZiv> у нас mssql, такой фишки кажется нет Это зависит от енжина. Но там только Инно сейчас FK поддерживает, а в нём отложенных FK вроде бы нет.Не путаете MS sql и My sql ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 11:02 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
Bely wrote: > Это зависит от енжина. > Но там только Инно сейчас FK поддерживает, а в нём отложенных FK вроде > бы нет. > > Не путаете *MS*sql и *My*sql ? Да, пардон, напутал. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 14:15 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
MasterZiv 3) некоторые СУБД делают отложенную проверку FK, во время коммита, там вообще просто всё.Между прочим, это нарушение 2-го принципа ACID ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 16:11 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
Senya_LМежду прочим, это нарушение 2-го принципа ACID ;-) И Вы, конечно, сумеете это обосновать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 16:16 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
Если хочется остаться в более-менее классических реляционных рамках, то надо сделать связь клиент<-->паспорт в отдельной таблице и навесить на неё любых нужных проверок (unique, foreign key и т.д.) Тогда эта таблица будет основным источником данных, к ней будут джойниться остальные две. Заполнение этой таблицы будет одним действием, остальное -- подготовка, не влияющая на видимый набор данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 16:31 |
|
||
|
Как гарантировать наличие атрибута (циклическая зависимость)
|
|||
|---|---|---|---|
|
#18+
softwarer Senya_LМежду прочим, это нарушение 2-го принципа ACID ;-) И Вы, конечно, сумеете это обосновать. Нет, конечно. Прикалываюсь я, типа Просто недавно попалось несколько ссылок ( пример ), там про Consistency вобщем-то все правильно написано, только забыли про то, что непротиворечивость по стнадарту должна быть обеспечена по окончанию транзакции. Иногда пишут вообще глупости . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 16:35 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35480746&tid=1543656]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
180ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 479ms |

| 0 / 0 |
