我使用CouchDB,一个面向文档的数据库,将数据存储为JSON文档。我在后端使用Javascript,所以我可以直接存储JS对象。目前,我在CouchDB和我的域层中存储的模型之间有直接映射。我认为这不是一件好事,因为我完全依赖这个数据库。
我有2个实体用户和项目。 一个用户可以拥有多个项目,这些模型在数据库中表示为单独的文档:
用户文档
{
"_id": "1",
"entity": "user"
}
项目文件
该关系由属性 user_id 引用。
{
"_id": "2",
"entity": "project",
"user_id": "1",
"name": "project1"
}
// other project document
{
"_id": "3",
"entity": "project",
"user_id": "1",
"name": "project2"
}
我的问题是:
我应该在图层之间保持这种方便的映射,还是应该创建一个抽象层,将模型从数据库转换为域对象?
更方便的用户域对象示例:
// _id property is replaced by id
// entity property is removed
// projects relations stand in a projects array
{
id: "1",
projects: [
{ id: "2", name: "project1"},
{ id: "2", name: "project1"}
]
}
注意:我想阅读这本书" Domain Driven Design"来自Eric Evans。也许它可以帮助我看看如何管理这样的模型抽象。
答案 0 :(得分:2)
恕我直言,这个问题与DDD没什么关系,但无论如何我都想回答它; - )
我肯定会将数据库对象转换为域对象。原因很简单:如果您更改了基础数据存储,您的对象将会更改,然后您必须更新域代码以获取技术原因
除此之外,数据库对象确实包含的方式多于域感兴趣的方式。这是摆脱它们的另一个原因:为你的域对象建模,使它们干净并按你所期望的那样做。
此外,您希望能够轻松地测试您的域对象。如果它们包含所有数据库内容,则会造成不必要的困难。
简而言之:不要在域图层中使用数据库对象。
答案 1 :(得分:1)
我认为这个问题涉及很多DDD 你在努力争取的是聚合。使用nosql db,文档应包含聚合 对同一聚合中的实体使用不同的文档会产生这样的效果,即聚合持久存储对应于存储的多个文档,这些文档可能独立失败(导致数据损坏)。 相反,DDD聚合是域的事务边界,聚合的持久性必须是原子操作。
关于技术的东西,如果依赖从域模型中移除它们很好是干净等等...等等 但是,如果留下它们导致更多问题,那么找到一种方法将它们隐藏在域中。所以它取决于域的规模。
有关详细信息,这可能会有所帮助:Why limit commands and events to one aggregate? CQRS + ES + DDD