Справка по проектированию баз данных: чей это ребенок? - PullRequest
3 голосов
/ 27 августа 2010

Я создаю для своей жены программу «Менеджер контактов» в качестве забавного упражнения в изучении Silverlight 4. Она будет отслеживать адреса людей, номера телефонов, электронные письма, особые случаи (день рождения, юбилей и т. Д.)

В процессе проектирования базы данных я столкнулся с небольшим дорожным ударом. Она хотела бы иметь возможность группировать контакты ( человек ) по семейству, поэтому я создал таблицу Families с FamilyID и FamilyDescription, а затем добавил FamilyID в таблицу People.

Теперь SELECT * FROM People WHERE FamilyID = 2 вернет всех в этой конкретной семье.

Я ДУМАЮ это приемлемая идея; но я борюсь за то, чтобы включить детей, как в детей. У нас очень, очень большая семья, поэтому в семье будет несколько детей. Должен ли я просто добавить их в таблицу Люди, если да, то как мне отличить детей от взрослых?

Я очень благодарен за понимание, спасибо.

Ответы [ 5 ]

8 голосов
/ 27 августа 2010

Проблема с PEOPLE.familyid состоит в том, что он гарантирует, что человек может принадлежать только к одной семье - когда-либо. Это означает, что если вы хотите провести различие между ближайшими и расширенными семьями, вы будете искать иерархическую структуру, чтобы связать семьи, когда они не обязательно являются иерархическими ...

Наиболее подходящим решением было бы включение таблицы «многие ко многим», чтобы можно было связать запись PEOPLE с любым количеством записей FAMILY:

PEOPLE_FAMILY_MAP

  • PEOPLE_ID (первичный ключ, внешний ключ для PEOPLE.id)
  • FAMILY_ID (первичный ключ, внешний ключ для FAMILY.familyid)

Если вы хотите показать отношения между людьми - вам потребуется таблица типов отношений (type_code, description) и связать отношения, используя:

  • PERSON_ID (первичный ключ, внешний ключ для PEOPLE.id)
  • RELATED_TO_PERSON_ID (первичный ключ, внешний ключ к PEOPLE.id)
  • RELATIONSHIP_TYPE_CODE (первичный ключ, внешний ключ к RELATIONSHIP_TYPE_CODES.RELATIONSHIP_TYPE_CODE)
2 голосов
/ 27 августа 2010

Разве у вас не было бы столбца «Мать и отец» на сущность «Люди», которая ссылается на другой PeopleId?

Дети тоже люди, вы знаете!

Кроме того, как вы определяетеСемья?Люди, которые живут по одному адресу.Боксировать людей в семью звучит сложно, сколько поколений составляет семью.

И мое представление о столбце «мама и папа» на одну организацию «Люди» не учитывает однополые пары с детьми, но мы не должны этого делать.подумайте над проблемой или вы можете свести себя с ума.

Ознакомьтесь с этим примером приложения WPF - http://www.vertigo.com/familyshow.aspx

0 голосов
/ 27 августа 2010

Хорошо, я собираюсь пойти по другому пути.

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

Итак:

Иметь таблицу семей:

  • FamilyId
  • Имя
  • Описание

Тогда просто создайте таблицу сопоставления:

  • FamilyId
  • PersonId
  • Роль

Роль может быть любой из следующих («Глава семьи» (он же решающий - иначе, доллар там останавливается), «Пион»)

Тогда дляМистер и миссис Джонсон, вы можете иметь семью "Джонсонс".но если вы хотите рассылать спам всем их родственникам, используйте "The Johnsons extended"

0 голосов
/ 27 августа 2010

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

Преимущество заключается в том, что дети могут позже стать родителями.Таким образом, вы можете просто продолжать определять новые семьи и не менять прежние отношения.Также позволяет вам найти все семьи, к которым принадлежит один человек, или позволяет создать цепочку, чтобы найти связанные семьи ... (найти все семьи, в которых familyX.relationtype = детей появляются ...)

Так же, как ярешите сделать это.

0 голосов
/ 27 августа 2010

Вы можете создать столбец Level в таблице People и присвоить ему поколение.

Пример: у бабушек и дедушек будет уровень -2, у родителей будет -1, у детей / подростков будет 0, их дети (в будущем) будут иметь 1, домашние животные могут иметь 2 и т. д.

Тогда вы можете легко составить список семьи по поколениям.

...