Таблица «Участники SQL» для отображения семейных отношений между членами - PullRequest
4 голосов
/ 19 декабря 2011

Я несколько дней пытался создать эту базу данных.Я проектирую его в Access, а затем внедряю на MYSQL Server в виде веб-приложения на PHP.

У меня есть таблица:

Участники

  • MemberID (autoNumber, PK)
  • MemberName
  • MemberDetails

Участники могут иметь много связей с другими участниками, это могут быть Child, Parent, Friend, Spouse и т. Д.Глядя на одного члена, я хотел бы иметь возможность создавать новые отношения с существующими членами, а затем иметь эти отношения также видимыми из соответствующего члена без дальнейшего ввода.Члены также должны иметь возможность перечислить все свои отношения.

Не могли бы вы посоветовать, как мне это сделать?Я пробовал несколько вариантов, но ни один из них не работает так, как задумано.Мне комфортно с SQL, у меня просто проблемы с дизайном унарных отношений.

-edit- Также я забыл добавить, что из-за ограничений сервера невозможно использовать INNODB.Скорее всего, это будет MYISAM, хотя я все еще хочу ссылочную целостность: (

Ответы [ 4 ]

4 голосов
/ 19 декабря 2011

Пусть таблица members содержит данные об участниках, а таблица relations содержит данные об отношениях с членами. relations.member_id будет ссылкой на участника, relations.related_member_id - на соответствующего участника. relations.type - перечисляемый тип отношения.

CREATE TABLE `members` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` TEXT NOT NULL ,
`details` TEXT NOT NULL
) ENGINE = INNODB;

CREATE TABLE `relations` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`member_id` INT NOT NULL ,
`related_member_id` INT NOT NULL ,
`type` ENUM(  'Child',  'Parent',  'Friend',  'Spouse' ) NOT NULL,
FOREIGN KEY (member_id) REFERENCES members(id),
FOREIGN KEY (related_member_id) REFERENCES members(id)
) ENGINE = INNODB;

UPD: Версия MyISAM (удалены внешние ключи, все возможные функции внешних ключей должны обрабатываться серверными сценариями):

CREATE TABLE `members` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` TEXT NOT NULL ,
`details` TEXT NOT NULL
) ENGINE = MyISAM;

CREATE TABLE `relations` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`member_id` INT NOT NULL ,
`related_member_id` INT NOT NULL ,
`type` ENUM(  'Child',  'Parent',  'Friend',  'Spouse' ) NOT NULL
) ENGINE = MyISAM;
2 голосов
/ 19 декабря 2011

Начиная с дизайна @Minras (+1), у меня будет

MEMBERS
  MemberId
  Name
  Details

RELATIONS
  FromMemberId
  ToMemberId
  RelationType

Но вместо ограничения проверки я бы добавил третью таблицу:

RELATIONTYPE
  RelationType
  Description
  FromLabel
  ToLabel

с RelationType, являющимся целым числом, а «Метки» являются символьными данными. Отношение является «направленным», в том смысле, что вам нужно обратить пристальное внимание на то, какой член «От», а какой «на» (но это не так важно для «ненаправленных» отношений, таких как «пошел в старшую школу»). все вместе"). Этот дизайн позволит вам:

  • Определите отношения между людьми с несколькими ярлыками, например, A is father of B и B is son of A.
  • Добавить новые отношения, если, когда и при необходимости

Очевидно, что вы либо будете иметь реляционную целостность во всем через внешние ключи или все, что у вас есть, или у вас будет крушение поезда, ожидающее наступления.

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

0 голосов
/ 19 декабря 2011

Создайте таблицу с столбцами:

Member_1_id
Member_2_id
Relation_type

Тогда вы можете использовать ее так: Если Алиса - дочь Бобса, у вас будут такие отношения:

<Bob id> <Alice id> 'Father'
<Alice id> <Bob id> 'Daughter'

Затем вы можетедобавьте некоторые дополнительные данные в эти отношения, например, когда это отношение началось (т. е. когда кто-то обручился).

Вы также можете создать индексы для обоих столбцов с идентификаторами элементов.

РЕДАКТИРОВАТЬ:Чтобы избежать дублирования данных в этой таблице, вы можете создать представление, а затем сохранить все отношения как одну строку.Однако это решение не позволит вам назвать такие отношения, как «отец» и «сын».

SELECT member1, member2, relation FROM rel_table UNION ALL SELECT member2, member1, relation FROM rel_table;
0 голосов
/ 19 декабря 2011

Попробуйте добавить сводную таблицу:

Relationships:

MemberId1
MemberId2
RelationshipType
...