квалифицированные отношения в datomic

В реляционной БД у меня может быть таблица Person и таблица Hobby. У каждого человека может быть ноль, одно или несколько хобби, и я также хочу записать, скажем, приоритет этих увлечений для каждого человека.

Я мог бы создать таблицу отношений с двумя внешними ключами PersonFK и HobbyFK и одним простым столбцом Priority.

В datomic для моделирования простого отношения n:m (без приоритета) я, вероятно, создал бы атрибут типа Reference с кардинальностью Many, который я бы использовал для Person сущностей.

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


person SuperHorst    schedule 16.09.2012    source источник


Ответы (2)


Аналогичный вопрос был задан в списке рассылки Datomic несколько дней назад:

https://groups.google.com/d/topic/datomic/7uOl-TISdxA/discussion

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

person grahamstratton    schedule 18.09.2012

Принятый здесь ответ больше не является полной историей, учитывая новую функцию, добавленную в Datomic в июне 2019 года. Иногда вам все еще нужно подтвердить отношения, но теперь есть и другой вариант: гетерогенные кортежи

Значение атрибута, то есть v в 5-кортеже eavto, теперь само может быть кортежем.

Это вектор clojure максимальной длины 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 и размножение.

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

В мире sql, как правило, если данные имеют разные типы, вероятно, не стоит обращаться с ними как с массивом, для начала, из-за потери мощности, которую вы получите при манипулировании этими структурами данных из языка запросов. Datomic может быть не полностью эквивалентен, поскольку это графовая база данных, и, возможно, это все еще относительно неизведанная территория.

person mwal    schedule 24.04.2020