Аннотированные отношения в 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/associationsrefs даже необходимо?

Ценю любое понимание.

Обновить


После нескольких размышлений, я думаю, что я споткнулся о 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 может также иметь столько произвольных дополнительных атрибутов, сколько вы хотите, что позволяет вам прикреплять данные непосредственно к отношению (т. е. для атрибутов вашего тега или любых других данных, которые вы хотите представить о связи).

Бест, Маршалл

Другие вопросы по тегам