非关系型数据库设计混乱
Non-relational database design confusion
我正在学习 MongoDB 并试图了解不使用关系数据库模式的概念。
对于我的应用程序,我希望能够添加新的用户和项目,并按角色将用户分配给项目,例如'manager'、'developer' 等。用户应该能够查看有关他们在其中扮演角色的项目的详细信息。检索有关项目的详细信息应包括在该项目中也具有角色的用户列表。
假设我通过 POST 添加一个新用户到 /users
。我可以添加一个带有 POST 的新项目到 /projects
。
然后我想在项目中给用户一个角色。我可以使用角色(包括角色名称和项目 ID)对 /users/{id}
执行 PUT,但随后通过 GET /projects/{id}
检索项目的详细信息不会包括该项目中具有角色的用户列表.
我本可以将角色 POST 编辑为 /project/{id}
(包括角色名称和用户 ID),但是 GET /users/{id}
不会包含他们的角色,我可能想要在其登录页面上显示用户参与的角色。
要创建一个新角色,我真的必须将其 PUT 到 /users/{id}
,然后使用该角色和用户将另一个 PUT 到 /projects/{id}
吗?
上述内容可以在关系数据库中通过简单地创建一个角色 table 来实现,其中可能包括角色名称、用户 ID 和项目 ID。然后我可以执行连接并访问我需要的任何信息。
我是不是漏掉了什么?任何提示或有用的参考将不胜感激。
恐怕您在使用关系型数据库时遇到了 NOSQL 数据库的重大缺点。答案是忘记你所知道的关于规范化的一切,将数据复制到两个地方,然后让它们保持最新。
我知道这与您将在 SQL 数据库中学到的所有内容背道而驰,但这是一种权衡。
Rob Volk 在这里写了一篇很好的文章 https://robvolk.com/nosql-design-patterns-for-relational-data-9c2c11ae3b4a
乍一看这似乎很糟糕,但它实际上是有道理的,因为您基本上所做的是以增加写入时间和额外内存为代价来减少读取时间。现在内存很便宜,你要写的用户权限比你要读的要少得多。
你是对的。 NOSql 数据库有一个概念,如果你沿着 "tables" 重复相同的数据,这不是问题,因为重复的信息有一个哈希码,它会识别一个数据,当你想更新它时你会使用它.
我正在学习 MongoDB 并试图了解不使用关系数据库模式的概念。
对于我的应用程序,我希望能够添加新的用户和项目,并按角色将用户分配给项目,例如'manager'、'developer' 等。用户应该能够查看有关他们在其中扮演角色的项目的详细信息。检索有关项目的详细信息应包括在该项目中也具有角色的用户列表。
假设我通过 POST 添加一个新用户到 /users
。我可以添加一个带有 POST 的新项目到 /projects
。
然后我想在项目中给用户一个角色。我可以使用角色(包括角色名称和项目 ID)对 /users/{id}
执行 PUT,但随后通过 GET /projects/{id}
检索项目的详细信息不会包括该项目中具有角色的用户列表.
我本可以将角色 POST 编辑为 /project/{id}
(包括角色名称和用户 ID),但是 GET /users/{id}
不会包含他们的角色,我可能想要在其登录页面上显示用户参与的角色。
要创建一个新角色,我真的必须将其 PUT 到 /users/{id}
,然后使用该角色和用户将另一个 PUT 到 /projects/{id}
吗?
上述内容可以在关系数据库中通过简单地创建一个角色 table 来实现,其中可能包括角色名称、用户 ID 和项目 ID。然后我可以执行连接并访问我需要的任何信息。
我是不是漏掉了什么?任何提示或有用的参考将不胜感激。
恐怕您在使用关系型数据库时遇到了 NOSQL 数据库的重大缺点。答案是忘记你所知道的关于规范化的一切,将数据复制到两个地方,然后让它们保持最新。
我知道这与您将在 SQL 数据库中学到的所有内容背道而驰,但这是一种权衡。 Rob Volk 在这里写了一篇很好的文章 https://robvolk.com/nosql-design-patterns-for-relational-data-9c2c11ae3b4a
乍一看这似乎很糟糕,但它实际上是有道理的,因为您基本上所做的是以增加写入时间和额外内存为代价来减少读取时间。现在内存很便宜,你要写的用户权限比你要读的要少得多。
你是对的。 NOSql 数据库有一个概念,如果你沿着 "tables" 重复相同的数据,这不是问题,因为重复的信息有一个哈希码,它会识别一个数据,当你想更新它时你会使用它.