将实体拆分为不同的分区

时间:2014-02-23 18:45:15

标签: clojure schema datomic

我正在开发一个使用datomic的webapp。像每个webapp一样,我有一个用户管理,我希望将其作为一个单独的模块/库提供。

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

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

 {: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}
]...

使用用户库的lib如下:

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

更新我想的越多,我就越想我必须在使用库中定义架构并声明用户库在架构中需要什么。

1 个答案:

答案 0 :(得分:1)

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

如果您正在构建的是库,则不应在其中定义架构。

替代方案是:

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

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

第一种方法甚至与数据库无关。