0

我正在开发一个使用 datomic 的 webapp。像每个 web 应用程序一样,我确实有一个用户管理,我想将其作为单独的模块/库提供。

现在我的想法是拥有一个带有电子邮件、密码和启用标志的基本用户模式。然后,使用我的用户库的每个库都会添加额外的域特定用户属性。

所以我会有两个这样的模式:

 {: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解决这个问题?

更新我想得越多,我就越想我只需要在使用库中定义模式并在模式中声明用户库需要什么。

4

1 回答 1

1

设计方面,我认为正确的方法是让您的库与模式无关。

如果您正在构建的是一个库,则不应在其中定义模式。

我的替代方案是:

  • 您的库使用应用程序中实现的多方法委托数据库操作。
  • 您的库在某些初始化函数上接收数据库和字段映射。

第二种方法只是将模式字段映射到已知的库关键字,例如 :email 和 :friendui。

第一种方法甚至是不可知论的。

于 2014-02-24T12:29:08.957 回答