Я пытаюсь смоделировать схему, в которой list
может иметь много items
, а каждый item
может принадлежать многим lists
. Мне ясно, что у меня может быть тип ссылки :list/items
для моделирования отношения, но я также хотел бы иметь атрибут rank
, который определяет позицию элемента в каждом списке, где он существует. Как можно сделать такое?
Свойства отношений Datomic ref
Ответы (2)
Единственный ответ, который у меня есть — при условии, что позиционирование зависит от списка — это то, что вам нужно добавить косвенную сущность с атрибутом ранга. Это не очень приятно. Было бы неплохо, если бы можно было упорядочить отношение «многие», так как этот вариант использования существенно упростился бы.
Гетерогенные кортежи, добавленные в июне 2019 г., представляют собой новую модель моделирования. вариант здесь.
Значение атрибута, то есть v
в 5-кортеже eavto
, теперь само может быть кортежем. Это вектор clojure максимальной длины 8.
Официальное сообщение в блоге.
Обсуждение релиза в твиттере.
Обратите внимание, что пример в документах выше использует
:db/tupleTypes [:db.type/long :db.type/long]
что немного странно, так как речь идет о гетерогенныхкортежах, поэтому в случае OP это будет:
{:db/ident :list/item
:db/valueType :db.type/tuple
:db/tupleTypes [:db.type/ref :db.type/long] ; ref to item, rank
:db/cardinality :db.cardinality/many}
Или вы можете использовать тип значения вместо ref для элемента, если это работает для вас.
Чтобы использовать это в журнале данных, вы можете использовать tuple и размножение.