Как бы вы смоделировали флаг «дочерний по умолчанию» с ORM? - PullRequest
1 голос
/ 12 января 2009

Я использую ORM (SQLAlchemy, но мой вопрос довольно независим от реализации), чтобы смоделировать отношения «многие ко многим» между родительским классом и его дочерними элементами. Мне было интересно, каким будет простой способ выразить понятие "один из детей по умолчанию / основной"?

Например, мне нужно сохранить следующее:
Этот экземпляр Person имеет адреса X и Y, основным из которых является Y.

Я видел, как это реализовано с использованием "среднего" класса, такого как "PersonAddressRelation", который будет содержать "Person", "Address" и флаг "main", но я думаю, что это выглядит немного громоздким ... Есть ли лучший способ?

Ответы [ 2 ]

2 голосов
/ 12 января 2009

Простейшим способом было бы иметь таблицу соединения PersonAddressRelation, а также столбец DefaultAddress в таблице Person, который указывает на таблицу адресов.

1 голос
/ 12 января 2009

Пара замечаний.

  • Отношения M: N не определяют 'parent' и 'child', так как нет ни родителя, ни потомка: есть просто две сущности, имеющие отношение m: n через 3-ю сущность (промежуточную сущность) .

  • «Адрес» в общем случае не является допустимым типом сущности, так как семантически он не имеет идентичности, подобно «имени» не имеет идентичности (имя, фамилия). Вы увидите это, когда посмотрите на повторное использование экземпляра сущности типа Address: в общем, вы этого не сделаете. (хотя вы будете повторно использовать экземпляр сущности Customer, например, когда у клиента есть несколько заказов)

  • Вы хотите указать атрибут в отношении M: N (по умолчанию), так как он принадлежит там. Это означает, что сама связь формирует сущность (которая является промежуточной сущностью, часто она имеет только два поля FK, образующих PK). Это называется «объективированным отношением», поскольку само отношение рассматривается как сущность. Другими примерами этого являются Employee m: n Department, и вы хотите указать StartDate, которую сотрудник начал для отдела, в котором работает сотрудник.

Итак, в общем: создайте промежуточную сущность, как она должна быть там, и добавьте туда атрибут. В этом конкретном случае с Адресом действительно убедитесь, что вы повторно используете экземпляры Адреса среди связанных объектов (Персона). Если нет, объедините Address с Person ИЛИ, если у человека может быть несколько адресов, создайте простое отношение 1: n между Person - Address, чтобы его нормализовать, хотя не бойтесь объединять данные адреса в сущность, с которой он связан. , так как часто адресные данные действительно не используются повторно (поэтому ваши отношения m: n действительно не существуют: не существует экземпляра Address, который связан с несколькими экземплярами лица.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...