Разделить Entity на разные разделы

Я разрабатываю веб-приложение, которое использует datomic. Как и в каждом веб-приложении, у меня есть управление пользователями, которое я хочу предоставить в виде отдельного модуля/библиотеки.

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

Итак, у меня было бы две схемы:

 {:db/id #db/id [:db.part/db],
          :db/ident :friendui
          :db.install/_partition :db.part/db
          :db/doc "The partition of the database for releases"}
  {:db/id #db/id [:db.part/db]
          :db/ident :friendui/id
          :db/valueType :db.type/uuid
          :db/cardinality :db.cardinality/one
          :db/unique :db.unique/identity
          :db.install/_attribute :db.part/db
          :db/doc "A unique identifier for any element"}
  ;; users
  {:db/id #db/id [:db.part/db]
          :db/ident :user/email
          :db/index true
          :db/unique :db.unique/identity
          :db/valueType :db.type/string
          :db/cardinality :db.cardinality/one
          :db.install/_attribute :db.part/db}
]...

И библиотека, которая использует пользовательскую библиотеку, выглядит так:

  {:db/id #db/id [:db.part/db],
          :db/ident :lweb
          :db.install/_partition :db.part/db
          :db/doc "The partition of the database for releases"}
  {:db/id #db/id [:db.part/db]
          :db/ident :lweb/id
          :db/valueType :db.type/uuid
          :db/cardinality :db.cardinality/one
          :db/unique :db.unique/identity
          :db.install/_attribute :db.part/db
          :db/doc "A unique identifier for any element"}


  ;; users
  {:db/id #db/id [:db.part/db]
          :db/ident :user/attr1
          :db/index false
          :db/valueType :db.type/string
          :db/cardinality :db.cardinality/one
          :db.install/_attribute :db.part/db}

....

Теперь проблема, которую я вижу, заключается в том, что у меня есть два разных раздела, которые нужно объединить. Есть ли способ решить это с помощью datomic?

Обновление Чем больше я об этом думаю, тем больше я предполагаю, что мне просто нужно определить схему в используемой библиотеке и объявить в схеме то, что нужно пользовательской библиотеке.


person sveri    schedule 23.02.2014    source источник
comment
Нет опыта работы с datomic, но разве ванильное слияние, assoc, dissoc не работает с этими хэш-картами?   -  person KobbyPemson    schedule 24.02.2014
comment
Да, с ними можно работать с помощью merge, assoc, ... но мне интересно, есть ли более простой и идиоматический способ.   -  person sveri    schedule 24.02.2014


Ответы (1)


С точки зрения дизайна, я думаю, что правильный подход заключается в том, чтобы ваша библиотека была независимой от схемы.

Если то, что вы создаете, является библиотекой, схема не должна быть определена там.

Альтернативы для меня:

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

Второй подход просто сопоставляет поля схемы с известными ключевыми словами библиотеки, такими как :email и :friendui.

Первый подход даже не зависит от атомарности.

person guilespi    schedule 24.02.2014
comment
Хм, я думаю, альтернатива не имеет для меня смысла, поскольку моя библиотека должна делать именно это, CRUD для пользователей с datomic (возможно, когда-нибудь будет независимым от db). Второй вариант звучит хорошо, и я думаю, что это единственный вариант. Или другая идея состоит в том, чтобы предположить, что по крайней мере некоторые поля должны быть предоставлены, а остальные могут быть заданы с помощью параметра & more. - person sveri; 24.02.2014
comment
Вы можете принять значения по умолчанию для ваших обязательных полей, если сопоставление не указано, но IMO вы не должны заставлять пользователей вашей библиотеки использовать ваши точные идентификаторы полей. - person guilespi; 24.02.2014
comment
Вы правы, поэтому я буду использовать подход, согласно которому клиентская библиотека должна предоставить файл конфигурации с базой данных-uri и сопоставлением полей. Большое спасибо. - person sveri; 24.02.2014