基于Javascript的ORM对象关系映射

基于Javascript的ORM对象关系映射,javascript,node.js,database,orm,architecture,Javascript,Node.js,Database,Orm,Architecture,我正在从事一个NodeJSAPI项目,并且正在使用CouchDb(对象文档存储,类似于MongoDb) 在javascript中,您可以自由地进行流控制,因为您处理的数据结构只是JSON。所以您可以将对象从客户端传递到服务器,从服务器传递到数据库,而不使用类,只传递JSON数据。然而,拥有处理这些数据结构和表示实体的类是很好的 e、 g 我们可以想象,在创建新实例后,我们将其保存到数据库中: e、 g 我的问题是关于实体之间的关系上下文,假设我们的用户与项目有一个单一关系 // Create n

我正在从事一个NodeJSAPI项目,并且正在使用CouchDb(对象文档存储,类似于MongoDb)

在javascript中,您可以自由地进行流控制,因为您处理的数据结构只是JSON。所以您可以将对象从客户端传递到服务器,从服务器传递到数据库,而不使用类,只传递JSON数据。然而,拥有处理这些数据结构和表示实体的类是很好的

e、 g

我们可以想象,在创建新实例后,我们将其保存到数据库中:

e、 g

我的问题是关于实体之间的关系上下文,假设我们的用户与项目有一个单一关系

// Create new project and save the project 
var project = new Project({id: 1});
await projectRepository.add(project);

// Create new user, add a project to the list, save the user
var user = new User({id: 1});
user.addProject(project.getId());
await userRepository.add(user);
在本例中,实体之间的关系是手动处理的,因为使用的数据存储是NoSQL数据库,我们必须在代码中直接引用该关系。OOP语言(如JAVA)可以使用ORM,并允许您执行以下操作:

user.getProjects(); // [{ project_1_data }, { ... }];
var projects = user.getProjects(); // [1, 2] list of IDs
await projectRepositories.get(projects[0]); // {...} data of the project
因为对象映射到数据库,并且对象的属性可以是其他对象。 Javascript中类似的用例如下所示:

user.getProjects(); // [{ project_1_data }, { ... }];
var projects = user.getProjects(); // [1, 2] list of IDs
await projectRepositories.get(projects[0]); // {...} data of the project
我错了吗

您将如何表示多个实体之间的关系? 应该在请求运行时将对象存储在内存中,还是仅在域模型中使用ID处理关系

如果不够清楚,请告诉我。
致以最良好的祝愿。

我想我正确地理解了你的问题,如果是这样的话:

我将关系表示为子文档或ID列表。决策点是有多少其他实体需要与相关子文档的关系。在您的示例中,如果用户是拥有这些项目的唯一实体,并且项目对用户是唯一的,那么我会将这些项目保存在用户的子文档中。但是,可能有几个用户在同一个项目上,并且可能有一个团队实体将所有项目分配给该团队。在这种情况下,您将需要许多子文档,有许多重复的数据,并且您将引入一个要求,即如果项目名称发生更改,则每个子文档都将更新。如果将项目保持为单独的集合并引用ID,则只有1个位置可以进行更改。您可能还需要多次调用数据库来填充实体,具体取决于您的文档DBs对类似联接功能的支持。这可能对沙发有帮助:

例如,如果你有一篇带有一系列评论的博客文章,那将是一个很好的子文档用例。这些评论永远不会属于其他用户,也永远不会成为其他帖子的评论。它们独立于博客文章,因此您可以将博客文章和评论视为单个文档

我知道文档数据库非常流行,但就我个人而言,当我拥有高度关系数据时,我会毫不犹豫地使用SQL。太棒了D

希望有帮助