Реализация базы данных людей с альтернативными именами и связывание всех имен вместе

#sql #database-design

#sql #база данных-дизайн

Вопрос:

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

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

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

Я придумал два способа создать таблицу альтернативных имен, которая имеет внешний ключ, возвращающийся к таблице Person, проблема тогда в том, что при поиске приходится искать в обеих таблицах и при необходимости ссылаться на Person. Я не могу придумать, как это легко сделать.

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

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

Спасибо

Комментарии:

1. 1 Это делает интересным вопрос для интервью для начинающих программистов!

Ответ №1:

Поскольку между Person и Name существует отношение «один ко многим», я бы структурировал его как таковой:

  • Фрагмент: PieceID, PersonID, Foo, …
  • Person: PersonID, Bar, …
  • Имена: NameID, PersonID, Name, …

Тогда ваш запрос был бы просто:

 SELECT Foo, Bar, Name
FROM Names
    JOIN Person USING(PersonID)
    JOIN Piece USING(PersonID)
WHERE Names.Name LIKE '$query'
  

Комментарии:

1. Спасибо, я принял maple_shaft, потому что он сказал это первым, хотя ваш ответ немного понятнее

Ответ №2:

Похоже, вы на правильном пути.

Таблицы:

  • Часть
  • Человек
  • Псевдоним
  • PersonPsuedonym

Таблица PersonPseudonyms, конечно, является таблицей сопоставления между Person и псевдонимом.

Вы должны быть в состоянии легко связать Person с псевдонимом, присоединив Person к PersonPseudonym, затем псевдоним к PersonPseudonym, затем фильтруя по псевдониму для имени, которое вы ищете.

Комментарии:

1. Да, это имеет смысл. Храните все имена в одном месте.