Квалифицированные отношения в Datomic
В реляционной БД у меня может быть таблица Person
и стол Hobby
, У каждого человека может быть ноль, одно или несколько увлечений, и я также хочу записать, скажем, приоритет этих увлечений для каждого человека.
Я мог бы создать таблицу отношений с 2 внешними ключами PersonFK
а также HobbyFK
и один простой столбец Priority
,
В Datomic, чтобы смоделировать простое отношение n:m (без приоритета), я бы, вероятно, создал атрибут типа Reference
с кардинальностью Many
, что я бы использовал дляPerson
юридические лица.
Но как бы мне было определить эту связь, чтобы сохранить приоритет? Должно ли это быть сделано аналогично реляционному случаю, то есть путем создания нового типа сущности только для этого отношения? Или есть способ получше? Используете метаданные или что-то еще?
1 ответ
Подобный вопрос был задан в списке рассылки Datomic несколько дней назад:
https://groups.google.com/d/topic/datomic/7uOl-TISdxA/discussion
Подводя итог, можно сказать, что вы правы: вам нужно создать объект отношения, в котором будет храниться дополнительная информация.
Принятый здесь ответ теперь уже не является полной историей, учитывая новую функцию, добавленную в Datomic в июне 2019 года. Иногда вам все равно нужно реифицировать отношения, но теперь есть и другой вариант: гетерогенные кортежи
Значение атрибута, т. Е. v
в eavto
5-кортеж, теперь сам может быть кортежем.
Это вектор закрытия с максимальной длиной 8. Это не способ хранить произвольное количество метаданных для отношения из-за максимальной длины 8.
Объявление официального блога.
Обсуждение релиза в твиттере.
В твоем случае:
{:db/ident :person/hobby
:db/valueType :db.type/tuple
:db/tupleTypes [:db.type/ref :db.type/long] ; hobby, priority
:db/cardinality :db.cardinality/many}
Чтобы использовать это в журнале данных, вы можете использовать функции tuple и untuple.
Однако может быть лучше использовать такие кортежи, как массивы, где кортеж действительно представляет составные данные. Действительно, например, в документации якобы для этих гетероциклических гомогенных кортежей фактически использует гомо гомогенные данные, так что я думаю, что это действительно до пользователя datomic что сделать из этих вариантов.
В мире sql обычно, если данные относятся к разным типам, вероятно, не рекомендуется рассматривать их как массив, во-первых, из-за потери мощности, которую вы получите при манипулировании этими структурами данных из языка запросов. Datomic может не быть полностью эквивалентным, поскольку это база данных графов, и, возможно, это все еще относительно неизведанная территория.