Семейное древо MySQL: иерархия, ссылка на брак и отображение

Я создаю веб-сайт Family Tree + History [PHP], чтобы сопровождать и демонстрировать генеалогический отчет моей мамы, который она составила для рождественского подарка своим родителям. По крайней мере, дерево будет основано на базе данных MySQL («семья»), в которой я сейчас работаю с двумя таблицами: «люди» и «браки». У меня также есть третья таблица «отцовство», но с тех пор я считаю ее ненужной.

Структуры таблиц следующие:

PERSONS
- 'personID' [tinyint, pk]
- 'firstName'
- 'lastName'
- 'sex' [set{'M','F'}]
- 'birthDate'
- 'fatherID' [internal rel = 'personID']
- 'motherID' [internal rel = 'personID']
- 'birthPlace'
- 'deathDate'
- 'deathPlace'
- 'birthRecord' (filename)

MARRIAGES
- 'husbandID' [internal rel = 'persons.personID']
- 'wifeID' [internal rel = 'persons.personID']
- 'date'
- 'place'
- 'record'

Индекс PK в таблице «браки» состоит из обоих столбцов идентификатора. (*Пожалуйста, извините меня за использование сексистских терминов; это просто для структурных целей - на всякий случай, поскольку я новичок в MySQL - и моя семья в любом случае довольно правая и консервативная, но на самом деле это не так. "не имеет значения и не имеет никакого значения, и с таким же успехом может рассматриваться как супруга1 и супруга2, если хотите. Я лично совсем не гомофоб и не предубежден ни по отношению к кому-либо. Конец заявления об отказе от ответственности. Мир всем.)

Итак... вы понимаете, почему я хочу вести отдельную таблицу для «браков»: у каждого брака есть свои данные, которые необходимо включать, и было бы глупо повторять данные по каждому браку в записях для обоих супругов. Раньше у меня был столбец «идентификатор супруга» в таблице «лица», но затем мне нужно было вручную сопоставить идентификаторы каждого из супругов, и я не мог понять, как связать этот столбец с соответствующим столбцом брака (в « таблица браков) во всяком случае, поэтому я ее бросил.

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

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

Очень признателен.

P.S. Древо довольно обширное, охватывающее ~ 6 поколений. Есть около 45 «лиц», и я думаю, 16 браков, чего бы эта информация ни стоила...


person user163831    schedule 23.12.2012    source источник
comment
Ваша структура относительно надежна. Единственная проблема, которую я вижу, заключается в том, что вы не можете легко выполнить запрос о браках и найти конкретный брак для человека, не запрашивая столбцы идентификатора мужа и идентификатора жены. Лично я бы переместил это отношение в связанную дочернюю таблицу брака. На самом деле у вас такая же проблема с Persons. Во всяком случае, в ваших запросах вам просто нужно использовать внутреннее соединение от браков к людям для каждого из отношений, и это добавит все столбцы людей в строку.   -  person gview    schedule 24.12.2012
comment
Я не знаю, что вы подразумеваете под переносом этого отношения в связанную дочернюю таблицу брака. Как именно я бы это структурировал? (и с «лицами».) Я пытаюсь изучить все эти термины и методы, но, в конце концов, вся эта спорадическая и малорелевантная информация, с которой я сталкиваюсь, не приносит мне пользы, мне нужны примеры, относящиеся к поставленной задаче (и что Я могу работать с тем, с чем я работаю в настоящее время, чтобы понять).   -  person user163831    schedule 24.12.2012
comment
Я тоже не понимаю, какую проблему вы имеете в виду, говоря о «лицах», мне ничего из этого не очень ясно...   -  person user163831    schedule 24.12.2012
comment
FWIW, в общем случае генеалогическое древо - это не иерархия, а сеть. И он может иметь петли. Это может не относиться к вашему проекту, но в любом случае это полезно знать.   -  person Mike Sherrill 'Cat Recall'    schedule 24.12.2012
comment
Какие петли вы имеете в виду? Как в суффиксном дереве? Вы можете объяснить?   -  person Gigamegs    schedule 24.12.2012
comment
Петли: дальние родственники могут вступать в законный брак. Если у них есть дети, то эти дети имеют более одного пути отцовства к определенным предкам. Есть и более печальные, криминальные обстоятельства, создающие петли.   -  person Ross Presser    schedule 04.04.2016


Ответы (2)


Простой запрос SELECT-JOIN для одной и той же таблицы дважды получает все браки в виде списка.

SELECT m.*,
      h.firstName as husbandFirstName, h.lastName as husbandLastName, 
      w.firstName as wifeFirstName, w.lastName as wifeLastName 
FROM marriages m
LEFT JOIN persons h ON m.husbandID = h.personID
LEFT JOIN persons w ON m.wifeID = w.personID;

Для списка детей мужского пола вы передаете идентификатор отца как таковой:

SELECT p.firstName as fatherFirstName, p.lastName as fatherLastName, 
     c.firstName as childFirstName, c.lastName as childLastName
LEFT JOIN persons c ON c.fatherID = p.personID
WHERE p.personID = $fatherID;
person Philip Whitehouse    schedule 24.12.2012

Вот предложения, которые я сделал в своем комментарии на диаграмме ERD.

ERD

person gview    schedule 24.12.2012