node.js - 如何实现noSQL数据库抽象?

标签 node.js model couchdb domain-driven-design clean-architecture

我使用 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"}
  ]
}

注意:我想阅读埃里克·埃文斯 (Eric Evans) 的《领域驱动设计》一书。也许它可以帮助我了解如何管理此类模型抽象。

最佳答案

恕我直言,这个问题与 DDD 没有太大关系,但无论如何我都在尝试回答它;-)

我肯定会将数据库对象转换为域对象。原因很简单:如果您更改了底层数据存储,您的对象也会更改,然后出于技术原因,您将不得不更新您的代码.

除此之外,数据库对象所包含的内容远远超过领域感兴趣的内容。这是摆脱它们的另一个原因:为您的域对象建模,使它们整洁并按照您的期望进行。

此外,您希望能够轻松地测试您的域对象。如果它们包含所有数据库内容,这就会变得不必要地困难。

长话短说:不要在领域层使用数据库对象。

关于node.js - 如何实现noSQL数据库抽象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47892051/

相关文章:

node.js - Node JS,如何正确使用 Sequelize.create

javascript - 如何设置流nodejs读取的行数限制

node.js - docker compose 与 docker run - Node 容器

javascript - 在环回中自动插入模型的createdAt和updatedAt属性

authentication - 调用 CouchDB 的 _session 总是返回 200

docker - 连接到 docker 内的 couchdb

node.js - 如何确定包含多个流的流中文件的结尾? ( Node )

python - 具有动态添加属性的 Django 模型对象

model-view-controller - 如何更改模型属性上的 "get"和 "set"?

couchdb - 选择在 CouchDB 中没有某些键的文档