非关系型数据库设计混乱

Posted

技术标签:

【中文标题】非关系型数据库设计混乱【英文标题】:Non-relational database design confusion 【发布时间】:2020-01-28 14:05:17 【问题描述】:

我正在学习 MongoDB,并试图了解不使用关系数据库模式的概念。

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

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

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

我本可以将角色发布到 /project/id(包括角色名称和用户 ID),但是 GET /users/id 不会包含他们的角色,我可能想在他们的角色上显示用户参与的角色登陆页面。

要创建一个新角色,我真的必须将其 PUT 到 /users/id,然后使用角色和用户再 PUT 到 /projects/id

上述可以在关系数据库中通过简单地创建一个角色表来实现,该表可能包括角色名称、用户 ID 和项目 ID。然后我可以执行连接并访问我需要的任何信息。

我在这里遗漏了什么吗?任何提示或有用的参考资料将不胜感激。

【问题讨论】:

什么是您的 1 个明确的具体研究问题,即第一个坚持什么目标? 【参考方案1】:

恐怕您在使用关系型数据库时遇到了 NOSQL 数据库的巨大缺点。答案是忘记你所知道的关于规范化的一切,将数据复制到这两个地方,然后让它们都保持最新。

我知道这与您在 SQL 数据库中学到的所有内容背道而驰,但这是一种权衡。 Rob Volk 在这里写了一篇很好的文章https://robvolk.com/nosql-design-patterns-for-relational-data-9c2c11ae3b4a

起初这可能看起来很糟糕,但实际上是有道理的,因为您基本上所做的是以增加写入时间和额外内存为代价来减少读取时间。现在内存很便宜,你要写的用户权限比你要读的要少得多。

【讨论】:

【参考方案2】:

你是对的。 NOSql 数据库有一个概念,如果您沿着“表”重复相同的数据,这不是问题,因为重复的信息有一个哈希码,它将识别一个数据,当您想要更新它时将使用它。

【讨论】:

以上是关于非关系型数据库设计混乱的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL01_数据库的概述关系型和非关系型数据库区别设计规则

Hbase的设计原理与技术细节

非关系型数据库——HBase扩展

Cassandra 数据模型设计,根据你的查询来制定设计——反范式设计本质:空间换时间

接触软件体系架构设计

接触软件体系架构设计