Аннотированные отношения в Datomic
Я надеялся расширить разговор по этому вопросу SO и получить более подробную информацию с точки зрения реализации.
Мои требования включают разрешение администратору определять теги для отношения, число которых является произвольным, участвующие субъекты являются произвольными, а задействованные субъекты не являются условными (т.е. не являются Component
субъекта).
Для надуманного примера, User
может иметь много Projects
, Project
может иметь много Users
,
Администратор создает произвольное количество тегов, которые можно назначить связанным пользователям для каждого отношения, например Owner
, Contributor
, VIP
и т. д. для User
в Project
,
Из того, что я понимаю из этого ответа, простой ref
недостаточно, и мне нужно будет создать дополнительную сущность, что-то вроде этого
уместный Project
атрибут
:db/ident :project/associations
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
уместный User
атрибут
:db/ident :user/associations
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
уместный Association
атрибуты
:db/ident :association/related-ents
:db/valueType :db.type/string
:db/cardinality :db.cardinality/many
:db/ident :association/assoc-id
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/ident :association/tag
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one
уместный Tag
атрибут
:db/ident :tag/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
Это насколько я получил. Я не ясно, как построить association
юридическое лицо в идиоматическом-Datomic способе.
Чтобы найти связанные отношения по данному Project
, в том числе, но не ограничивается Users
, а также найти отношения, где relationship tag = Contributor
, нужно ли мне
1) бросить
refs
наProject
+User
и получить данные черезAssociations
? т.е. вернуть все ассоциации, гдеassociation/related-ents
содержитUser-Id = foo
2) Что-то совершенно другое.
Я предполагаю, что мой вопрос сводится к тому, где я храню ref
для эффективного поиска? Есть ли другой db.type
это следует использовать вместо string
или другой конструкции для association
что нужно? Являются ли project/associations
а также user/associations
refs
даже необходимо?
Ценю любое понимание.
Обновить
После нескольких размышлений, я думаю, что я споткнулся о refs
на различных сущностях. Мне интересно, если бы я мог просто иметь associations/relatedEnts
это ссылка, которая содержит 2 Datomic db ids + tag и отбрасывает все остальные перечисленные атрибуты. Это идеал?
:db/ident :association/relatedEnts
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
:db/ident :association/tag
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one
1 ответ
Когда вы определяете сущность для представления отношений между двумя другими сущностями (User
и Project
в вашем примере), я бы порекомендовал сделать связь с этой сущностью отношений Association
) к другим сущностям через Datomic ссылки. Это сохраняет возможность перехода от одного к другому без необходимости, например, разбора составной строки.
Кроме того, ваш пример подсказывает мне, что вы рассматриваете только один Association
сущность для представления отношений (отношений) между многими Users
а также Projects
, Хотя этот подход может работать, у вас будет гораздо больше гибкости и возможностей для настройки, если вы создадите Association
сущность для всех отношений, которые вы моделируете. Если вы предпочитаете думать об этом как о проблеме моделирования графов, ваш User
а также Project
сущности - это узлы графа, и вы создаете "граничную сущность" для каждого ребра между двумя узлами. Каждый из этих "краевых объектов" представлен экземпляром Association
который имеет два ссылочных атрибута, один к User
и один к Project
, Тогда что Association
может также иметь столько произвольных дополнительных атрибутов, сколько вы хотите, что позволяет вам прикреплять данные непосредственно к отношению (т. е. для атрибутов вашего тега или любых других данных, которые вы хотите представить о связи).
Бест, Маршалл