как сохранить брачные отношения в базе данных - PullRequest
6 голосов
/ 07 декабря 2010

Я должен сохранить эту информацию в базе данных

Человек -> женат на -> Человек

Где мне сохранить эту информацию? Какой шаблон дизайна мне следует применить здесь?

Спасибо!

Ответы [ 6 ]

4 голосов
/ 07 декабря 2010

Если вы можете состоять в браке только с одним человеком: 1: 1

-------------
- Person    -
-------------
id (key)
maried_to_id (foreign key)

Если вы можете состоять в браке более чем с одним человеком или хотите отслеживать предыдущие браки, n: n

-------------
- Person    -
-------------
person_id (key)

-------------
- Mariage   -
-------------
first_person_id (foreign key)
second_person_id (foreign key)
start_date
end_date

(также first_person_id + second_person_id + date образуют уникальный ключ для брака. Вы можете пропустить дату, но тогда повторные браки не будут отслеживаться)

2 голосов
/ 07 декабря 2010

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

PERSONS
- ID - INTEGER, PK
- FIRSTNAME - VARCHAR(20)
- LASTNAME - VARCHAR(20)
- SEX - CHAR(1)
- ... any other fields

MARRIAGES
- PERSON1_ID - INTEGER, FK
- PERSON2_ID - INTEGER, FK
- MARRIAGE_DATE - DATE
- ANULLMENT_DATE - DATE
- ... any other fields
1 голос
/ 07 декабря 2010

Это отличный вопрос для обучения проектированию схем. То, что кажется простой проблемой, может легко стать довольно сложным:

Например, как обращаться:
- браки более двух человек
- различные виды брака (юридический, религиозный, другой)
- одновременные браки
- повторные браки
- развод
- брак в браке (эй, это случилось на ликовании!)

Хитрость, если она есть, заключается в том, чтобы тщательно продумать все варианты того, что вы пытаетесь смоделировать. Только тогда вы на самом деле можете смоделировать это.

0 голосов
/ 07 декабря 2010

Это звучит как использование для простой таблицы поиска - важная часть состоит из двух полей, одно из которых является внешним ключом для поля идентификатора Person1, а другое - внешним ключом для поля ID Person2. Любые подробности о браке (даты, будет ли он еще действующим и т. Д.) Также будут храниться в этой таблице.

Это помогло бы людям, состоящим в нескольких браках, полигамных отношениях и так далее. Если вам нужны простые отношения 1: 1, вы можете просто включить ссылку на внешний ключ для супруга в поле «персона», но это будет значительно менее гибким.

0 голосов
/ 07 декабря 2010

Вы можете сделать это с помощью столбца «Супруг» в таблице «Персона», который может быть нулевым (для случая не состоящего в браке человека).

Если женат, он содержит идентификатор другого человека, как и внешний ключ.

Лучшим решением будет отдельная таблица "Брак", которая имеет как минимум три столбца:

MarriageId
Person1Id
Person2Id
...

Идентификаторы лица являются внешними ключами в таблице "Person", и вы должны сделать комбинацию MarriageId, Person1Id и Person2Id уникальной, чтобы избежать добавления строки, где люди меняются местами.

Хотя следует отметить, что обе эти модели довольно просты и предполагают, сколько людей может быть в одном браке;)

0 голосов
/ 07 декабря 2010

Я бы рекомендовал следующую структуру Допустим, имя таблицы - Персона.

  1. PersonId (int, Key)
  2. MarriedTo (int, обнуляемый)

.....

Нет необходимости создавать отношения с внешним ключом.

...