Моделирование фактов существования в реляционной базе данных - PullRequest
0 голосов
/ 08 января 2010

Мне нужен способ представления экзистенциальных отношений в базе данных. Например, у меня есть биоисторическая таблица (то есть семейное дерево), в которой хранятся родительский и дочерний идентификаторы, которые являются внешними ключами для таблицы сотрудников. Эта таблица используется для описания произвольных семейных отношений. Таким образом, я бы хотел сказать, что X и Y - братья и сестры, без необходимости точно знать, кто являются родителями X и Y. Я просто хочу сказать, что существуют два разных человека A и B, так что A и B являются родителями X и Y. Как только я узнаю, кто такие A и / или B, я должен быть в состоянии примирить их.

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

Ответы [ 3 ]

1 голос
/ 08 января 2010

Экзистенциальное означает «несуществующий»?

Они не должны быть отрицательными. Вы можете просто добавить запись в таблицу People без фамилии / имени и, возможно, с флагом «неизвестный человек». Или экзистенциально, если хотите.

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

Примирить дублирующих людей может быть сложнее. Я думаю, вы могли бы просто обновить FamilyTree set parent_id = new_id где parent_id = old_id и т. Д. Но это означает, например, что у одного и того же человека может оказаться слишком много родителей, поэтому перед этим вам нужно будет выполнить ряд сложных проверок .

1 голос
/ 08 января 2010

Я бы задокументировал только известные отношения в таблице ссылок, которая связывает вашу таблицу Person с самим собой:

FK Person1ID
FK Person2ID
   RelationshipTypeID (Sibling, Father, Mother, Step-Father, Step-Mother, etc.)

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

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

Например, люди, являющиеся братьями и сестрами, которые не определили всех своих родителей:

SELECT *
FROM People p1
INNER JOIN Relationship r_sibling
    ON r_sibling.Person1ID = p1.PersonID
    AND r_sibling.RelationshipType = SIBLING_TYPE_CONSTANT
INNER JOIN People p2
    ON r_sibling.Person2ID = p2.PersonID
WHERE EXISTS (
    -- p1 has a father
    SELECT *
    FROM Relationship r_father
        ON r_father.RelationshipType = FATHER_TYPE_CONSTANT
        AND r_father.Person2ID = p1.PersonID
)
AND NOT EXISTS (
    -- p2 (p1's sibling) doesn't have a father yet
    SELECT *
    FROM Relationship r_father
        ON r_father.RelationshipType = FATHER_TYPE_CONSTANT
        AND r_father.Person2ID = p2.PersonID
)

Возможно, вам понадобится ОБЪЕДИНИТЬ обратный запрос в зависимости от того, как вы хотите, чтобы ваши отношения были ограничены (братья и сестры всегда коммутативны, в отличие от других отношений), а затем аналогично обрабатывать матерей.

0 голосов
/ 08 января 2010

Хммм, если подумать, думаю, мне нужен общий способ примирить дублирующих людей, и я могу использовать его для этой цели. Мысли

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