powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как гарантировать наличие атрибута (циклическая зависимость)
25 сообщений из 32, страница 1 из 2
Как гарантировать наличие атрибута (циклическая зависимость)
    #35479634
mdl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mdl
Гость
Предположим, есть сущность Клиент и сущность Паспорт, удостоверяющая клиента. Схема БД для этого случая могла-бы выглядеть так:

Код: plaintext
1.
Клиент (ID int, Фамилия varchar( 100 ), Имя varchar( 100 ), Отчество varchar( 100 ))
Паспорт (ID int, Владелец int, Номер int, Серия int, Кем выдан varchar( 100 ))

поле Паспорт.Владелец является FK на таблицу Клиент.

Такая схема гарантирует, что каждый паспорт будет обязательно иметь владельца (из-за наличия ссылки на него). Однако как гарантировать, что каждый клиент будет обладать паспортом ? Что делать с такими циклическими зависимостями ?

Просто в нашем проекте сейчас имеются множество сущностей, которые не обладают важным аттрибутом, хотя должны. Нужно что-то придумать, что-бы исключить такие ситуации в будущем ...
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35479711
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от конкретной СУБД. Если она поддерживает, скажем, такую прикольную фишку как CHECK ON COMMIT, то можно создать встречный внешний ключ, объявить дочернее поле в клиентах обязательным и вставлять данные в обе таблицы строго в одной транзакции. Для полноты картины может потребоваться уникальное ограничение на Clients.PassportId - ну, чтобы паспорт не мог принадлежать более чем одному человеку одновременно.

Если же отложенная проверка не поддерживается, то можно перевернуть схему с ног на голову, примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create table Passports (Id int primary key);

create table Clients(
Id int primary key,
PassportId int not null unique
);

alter table Clients add constraint FK_Clients_PassportId foreign key (PassportId) references Passports (Id);
Схема, может, и не совсем соответствующая реальному миру, но зато полностью выполняющая поставленные задачи.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35479883
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> как гарантировать, что каждый клиент будет обладать паспортом ?

Никак. Паспорт - не единственное удостоверение личности.

> Что делать с такими циклическими зависимостями ?

Нанять нормального аналитика и хорошего архитектора. Это дорого. Но сильно дешевле перманентного рефакторинга.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35480049
mdl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mdl
Гость
Ennor Tiegael
Зависит от конкретной СУБД. Если она поддерживает, скажем, такую прикольную фишку как CHECK ON COMMIT, то можно создать встречный внешний ключ, объявить дочернее поле в клиентах обязательным и вставлять данные в обе таблицы строго в одной транзакции. Для полноты картины может потребоваться уникальное ограничение на Clients.PassportId - ну, чтобы паспорт не мог принадлежать более чем одному человеку одновременно.

у нас mssql, такой фишки кажется нет

Ennor Tiegael
Если же отложенная проверка не поддерживается, то можно перевернуть схему с ног на голову, примерно так:

так ведь тогда могут появляться паспорта, никому не принадлежащие :) Проблема просто переехала в другую таблицу

guest_20040621
Никак. Паспорт - не единственное удостоверение личности.

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

guest_20040621
Нанять нормального аналитика и хорошего архитектора. Это дорого. Но сильно дешевле перманентного рефакторинга.

хочешь я подарю тебе медаль, как самому бесполезному участнику данного форума ?
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35480178
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdl Ennor Tiegael
Если же отложенная проверка не поддерживается, то можно перевернуть схему с ног на голову, примерно так:

так ведь тогда могут появляться паспорта, никому не принадлежащие :) Проблема просто переехала в другую таблицуТак может просто совместить их в одной таблице, так как в примере паспорт является обязательным атрибутом клиента ? И вместо сущностей "Клиент", "Паспорт" ввести одну - "Клиент с паспортом".
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35480208
mdl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mdl
Гость
ChA
Так может просто совместить их в одной таблице, так как в примере паспорт является обязательным атрибутом клиента ? И вместо сущностей "Клиент", "Паспорт" ввести одну - "Клиент с паспортом".

вроде как рекомендуемым подходом к проектированию является выделение каждой сущности в отдельную таблицу, тут даже не так давно была ветка, где это обсуждали. Например, если человек сменил паспорт, то я просто добавлю новую запись в Паспорта, а старый паспорт останется для истории (можно ввести флаг Актуальный, что-бы различать, какой паспорт действующий).
Кроме того, если сущностей несколько, то базовая таблица начнет приобретать ненормальные размеры (в смысле количества столбцов). Да и когда каждая сущность в отдельном месте - то это воспринимается легче.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35480260
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdl ChA
Так может просто совместить их в одной таблице, так как в примере паспорт является обязательным атрибутом клиента ? И вместо сущностей "Клиент", "Паспорт" ввести одну - "Клиент с паспортом".вроде как рекомендуемым подходом к проектированию является выделение каждой сущности в отдельную таблицу, тут даже не так давно была ветка, где это обсуждали. Например, если человек сменил паспорт, то я просто добавлю новую запись в Паспорта, а старый паспорт останется для истории (можно ввести флаг Актуальный, что-бы различать, какой паспорт действующий).Сущность не является абсолютом, а всего лишь отражает взгляд аналитика на предметную область, которую он моделирует. В вашей ситуации, IMHO, обязательность паспорта для клиента подразумевает, что клиент вне паспорта попросту не существует. Поэтому вполне разумно не разделять их, а, наоборот, объединить. mdlНапример, если человек сменил паспорт, то я просто добавлю новую запись в Паспорта, а старый паспорт останется для истории (можно ввести флаг Актуальный, что-бы различать, какой паспорт действующий).В этом случае совсем не обязательно рассматривать паспорт как отдельную сущность, а просто добавить, например, таблицу содержащую предыдущие состояния атрибута., т.е., рассматривать как историю атрибута "Паспорт". mdlКроме того, если сущностей несколько, то базовая таблица начнет приобретать ненормальные размеры (в смысле количества столбцов). Да и когда каждая сущность в отдельном месте - то это воспринимается легче.Нет никаких теоретических ограничений на количество атрибутов сущности. Если пытаться свести проектирование к минимизации, то можно и вовсе придти к модели EAV, и считать его идеальным решением. Но такая модель уже будет относиться к чему угодно, но только не к моделированию вашей предметной области.
Вы, IMHO, как раз можете сильно усложнить ситуацию, когда начнете разбрасывать обязательные атрибуты по разным таблицам, эмулируя однозначные связи. В практическом смысле иногда это можеть иметь смысл, но вольно идти от обратного. На те комбинации, которые используются чаще всего как выборки, сделать, например, "материализованные представления"(indexed views).
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35480283
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdl Ennor Tiegael
Если же отложенная проверка не поддерживается, то можно перевернуть схему с ног на голову, примерно так:
так ведь тогда могут появляться паспорта, никому не принадлежащие :) Проблема просто переехала в другую таблицуИ кому с этого стало хуже? Поставьте атрибут "Устаревший" для такой записи, и вся любовь. Иначе действительно объединять в одну таблицу, потому что все остальное будет являться стремлением не реализовать требования ТЗ, а избежать широких таблиц.

Другой вопрос, что предложенная мной схема плохо работает в случае большого количества разных типов удостоверений личности. Добавлять форейны на водительские права, загранпаспорт и т.д. - это действительно глупо. Тут лучше будет сделать обычную М:М-развязку между таблицами Клиенты и Удостоверения Личности и контролировать целостность связей либо в процедурах вставки / обновления / удаления, либо в соотв. триггерах.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35480746
xbz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а разве не должны быть данные в одной таблице?
ведь по сути у тебя отношение один к одному, ну и нах его бить на две таблице? тем более что тебе нудно проверять целостность данных.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35480800
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xbzведь по сути у тебя отношение один к одному
Откуда выдумали это?
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35480826
Mainframe_старый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть понятие А и В. между ними есть отношения S(A,B). Определеяется минимальная мощность множества таких отношений |S(A,B)|min=1. Это означает, что для каждого экземпляра А должно существовать по крайне мере один экземпляр отношений. Ну и далее реализация заивисит от .. от много. мы делаем пост проверку в одних случаях (когда ен можем изменить код) или проверку при изменениях.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35481015
L-b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уж коли паспорт это всего лишь пример. То разделять сущности или нет зависит строго от предметной области.
Согласен с мнением, что разделять не стоит, а при необходимости истории писать по триггеру на изменение атрибутов паспорта в другую табличку

Если уж разделять, то как вариант, реализовать сущность "паспорт" с полями start_date и end_date. А удаление вставку и модификацию реализовать строго через хранимые процедуры, дабы на уровне БД реализовать ограничение на необходимость паспорта. Одному человеку соответствует только один паспорт с непроставленным end_date.
Или вместо start_date и end_date задать только одно поле from_date (дата с которой паспорт актуален) тогда актуальными будут данные с максимальным from_date
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35481073
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L-bСогласен с мнением, что разделять не стоит, а при необходимости истории писать по триггеру на изменение атрибутов паспорта в другую табличку
Обмусолено уже кучу раз, что нецелесообразность хранения паспорта в самом физике следует не из необходимости сохранения истории (то есть, перечня недействующих паспортов и ошибок), а из того, что может быть много одновременно действующих паспортов.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35481079
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdlОднако как гарантировать, что каждый клиент будет обладать паспортом?
Никак. Исходя из предметной области, а не того, как это в БД наваять. Также рекомендую прислушаться к советам guest_20040621.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35481088
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdlПросто в нашем проекте сейчас имеются множество сущностей, которые не обладают важным аттрибутом, хотя должны. Нужно что-то придумать, что-бы исключить такие ситуации в будущем ...
Все крайне тривиально. На определенном этапе, где требуется наличие атрибута, проверяется его наличие. Если его нет - это ошибка. Например, не выдавать денег из кассы, если не указан паспорт - нормально.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35481123
mdl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mdl
Гость
Сергей Васкецов
Все крайне тривиально. На определенном этапе, где требуется наличие атрибута, проверяется его наличие. Если его нет - это ошибка. Например, не выдавать денег из кассы, если не указан паспорт - нормально.
есть такое понятие как инвариант класса. Это означает, что классу (сущности) назначается ряд правил, которым она обязана удовлетворять в любой момент времени, начиная созданием и кончая разрушением объекта (за исключением времени, когда выполняется какой-нибудь метод, тогда очевидно возможно нарушение инварианта, но для клиентов класса это невидно).
Так вот если к примеру паспорт назначен таким обязательным атрибутом, то он должен быть сразу и навсегда
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35481137
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdlесть такое понятие как инвариант класса. Это означает, что классу (сущности) назначается ряд правил, которым она обязана удовлетворять в любой момент времени, начиная созданием и кончая разрушением объекта (за исключением времени, когда выполняется какой-нибудь метод, тогда очевидно возможно нарушение инварианта, но для клиентов класса это невидно).
Так вот если к примеру паспорт назначен таким обязательным атрибутом, то он должен быть сразу и навсегда
Есть такое понятие, как ошибка проектирования. Все остальное замечательно из него исходит и является вторичным. Попробуйте реализовать отложенные циклические зависимости на FK, на большинстве СУБД сервер Вас пошлет куда подальше. И будет во многом прав. Рассуждать о том, что все обязательные атрибуты сущности должны быть в той же таблице, что и сущность - фи, не интересно.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35484222
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdl wrote:

> Такая схема гарантирует, что каждый паспорт будет обязательно иметь
> владельца (из-за наличия ссылки на него). Однако как гарантировать, что
> каждый клиент будет обладать паспортом ? Что делать с такими
> циклическими зависимостями ?

0) Каждый клиент НЕ ОБЯЗАН обладать паспортом, это во-первых.
значит ссылка на паспорт из клиента должна быть NULL-able.
1) (фактически проблема уже решена) ссылка из паспорта на владельца
будет обязательной, обратная ссылка - опциональной. Значит сначала
в БД создается клиент, потом его паспорт, потом заполняется ссылка
на паспорт в клиенте. Удаление производится в обратном порядке.

2) фактически у клиента паспортов может быть несколько,
т.е. от нуля до бесконечности, так что там по идее должно быть три таблицы,
но это безусловно зависит от постановки задачи и вам виднее.

3) некоторые СУБД делают отложенную проверку FK, во время коммита,
там вообще просто всё.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35484224
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mdl wrote:

> у нас mssql, такой фишки кажется нет
>

Это зависит от енжина.

Но там только Инно сейчас FK поддерживает, а в нём отложенных FK вроде бы нет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35486831
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv> у нас mssql, такой фишки кажется нет
Это зависит от енжина.
Но там только Инно сейчас FK поддерживает, а в нём отложенных FK вроде бы нет.Не путаете MS sql и My sql ?
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35487606
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bely wrote:

> Это зависит от енжина.
> Но там только Инно сейчас FK поддерживает, а в нём отложенных FK вроде
> бы нет.
>
> Не путаете *MS*sql и *My*sql ?

Да, пардон, напутал.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35488011
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
3) некоторые СУБД делают отложенную проверку FK, во время коммита,
там вообще просто всё.Между прочим, это нарушение 2-го принципа ACID ;-)
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35488028
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LМежду прочим, это нарушение 2-го принципа ACID ;-)
И Вы, конечно, сумеете это обосновать.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35488077
chAlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хочется остаться в более-менее классических реляционных рамках, то надо сделать связь клиент<-->паспорт в отдельной таблице и навесить на неё любых нужных проверок (unique, foreign key и т.д.) Тогда эта таблица будет основным источником данных, к ней будут джойниться остальные две. Заполнение этой таблицы будет одним действием, остальное -- подготовка, не влияющая на видимый набор данных.
...
Рейтинг: 0 / 0
Как гарантировать наличие атрибута (циклическая зависимость)
    #35488088
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Senya_LМежду прочим, это нарушение 2-го принципа ACID ;-)
И Вы, конечно, сумеете это обосновать. Нет, конечно. Прикалываюсь я, типа
Просто недавно попалось несколько ссылок ( пример ), там про Consistency вобщем-то все правильно написано, только забыли про то, что непротиворечивость по стнадарту должна быть обеспечена по окончанию транзакции.
Иногда пишут вообще глупости .
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как гарантировать наличие атрибута (циклическая зависимость)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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