非关系数据库设计的困惑

时间:2020-01-28 14:05:17

标签: sql mongodb nosql relational-database

我正在学习MongoDB,并试图弄清不使用关系数据库架构的概念。

对于我的应用程序,我希望能够添加新的用户和项目,并按角色将用户分配给项目,例如“经理”,“开发人员”等。用户应该能够查看有关其拥有角色的项目的详细信息。检索有关项目的详细信息应包括在该项目中也具有角色的用户列表。

假设我通过POST向/users添加了一个新用户。我可以将带有POST的新项目添加到/projects

然后,我想给用户一个项目角色。我可以使用角色(包括角色名称和项目ID)对/users/{id}进行PUT,但随后通过GET /projects/{id}检索项目的详细信息将不包括该项目中具有角色的用户列表

我本可以将角色发布到/project/{id}(包括角色名称和用户ID),但是GET /users/{id}将不包含其角色,我可能想显示用户的角色参与了他们的目标网页。

要创建新角色,我真的必须将其放置到/users/{id}中,然后使用角色和用户将另一个放置到/projects/{id}中吗?

可以通过简单地创建一个Roles表(其中可能包含Role名称,User ID和Project ID)来在关系数据库中实现以上目的。然后,我可以执行联接并访问所需的任何信息。

我在这里想念什么吗?任何提示或有用的参考将不胜感激。

2 个答案:

答案 0 :(得分:0)

恐怕您从关系型数据库中获取NOSQL数据库时会遇到很大的不利影响。答案是忘记关于标准化的一切知识,并将数据复制到两个地方,然后使它们保持最新。

我知道这与在SQL数据库中教您的所有知识背道而驰,但这是个折衷方案。 罗伯·沃尔克(Rob Volk)在https://robvolk.com/nosql-design-patterns-for-relational-data-9c2c11ae3b4a

上对此做了很好的文章

这乍看起来似乎很糟糕,但实际上是有道理的,因为您基本上要做的是减少读取时间,但要增加写入时间和额外的内存。如今,内存很便宜,并且您要写入的用户权限要比读取权限少得多。

答案 1 :(得分:0)

您是对的。如果您在“表”上重复相同的数据,则NOSql数据库的概念没有问题,因为重复的信息具有哈希码,这将标识数据,并在您要更新数据时使用。 / p>