Допустим у нас есть список животных.
Пускай
CREATE TABLE animals( id int UNIQUE PRIMARY KEY, animal text );
И у нас есть животное "собака", у неё есть инварианты и синонимы: "пёс","dog","собчака" и т.п.
Как лучше реализовать хранение синонимов?
1. Для каждого значения создавать таблицу синонимов.
Самый глупый как мне кажется вариант. Так как будет у меня 10к животных, и под каждое придётся создать по таблице.
2. Создать дополнительное поле, где для каждого значения будут хранится одновременно все синонимы и инварианты.
Видимо это должно быть text'овое поле. Потому что другого подходящего типа данных я не нашёл. Тогда сразу встаёт вопрос как быть с апдейтом строки, когда я нахожу новый инвариант.
3. Создать дополнительное поле, в котором будет хранится только 1 инвариант для каждого значения. То есть что-то вроде:
id name synonym
------------------------
1 собака dog
2 собака пёс
3 собака собачка
...
В таком виде мне кажется таблица будет захламляться лишней информацией. Так как не зачем хранить дубликаты имени. И получается если надо добавить 100 животных и у каждого по 100 синонимов, то это аж 10к строк.
Подскажите, пожалуйста, как лучше поступить. Возможно есть какой-то 4й более удобный вариант?
Спасибо за внимание!
Единственный нормальный
Единственный нормальный способ - это:
таблица animals
id | animal
--------------------
1 | собака
таблица aliases
aid | id | alias
--------------------
1 | 1 | пёс
2 | 1 | собачка
3 | 1 | dog
т.е. в таблице aliases поле id является FOREIGN KEY для id из таблицы animals
Список алиасов легко получается через JOIN таблиц
или деревом c соответствующим
или деревом c соответствующим ключем
id | parent_id|name
--------------------
1 | null|собака
2 | 1 | пёс
3 | 1 | собачка
4 | 1 | dog
Дерево имеет смысл делать,
Дерево имеет смысл делать, если есть дочерние элементы. Тут же их нет.