假设我有一系列文件,例如:
{ "_id" : 0 , "owner":0 "name":"Doc1"},{ "_id" : 1 , "owner":1, "name":"Doc1"}, etc
另一方面,业主被表示为一个单独的集合:
{ "_id" : 0 , "username":"John"}, { "_id" : 1 , "username":"Sam"}
如何在插入文档时确保以正确的方式引用用户 . 在旧式RDBMS中,可以使用外键轻松完成 .
我知道我可以从我的业务代码中检查插入的正确性,但是如果攻击者篡改我对服务器的请求并将“所有者”置为100,那么Mongo不会抛出任何异常 .
我想知道如何在真实的单词应用程序中处理这种情况 .
先感谢您!
6 回答
我还建议如果用户名是唯一的,那么将它们用作_id . 您将保存索引 . 在存储的文档中,在创建文档时将应用程序中“owner”的值设置为“username”的值,并且永远不要让任何其他代码更新它 .
如果有更改所有者的要求,则提供适用的API以及实施的业务规则 .
没有任何外键需要 .
如果有人真的想在Project / WebApp中强制执行外键 . 然后你应该使用MixSQL方法,即SQL NoSQL
我更喜欢那些没有那么多引用的Bulky数据,然后它可以存储在NoSQL数据库Store中 . 喜欢:酒店或地方类型的数据 .
但是,如果有一些严肃的事情,如OAuth模块表,TokenStore和UserDetails和UserRole(映射表)等....那么你可以使用SQL .
MongoDB没有外键(正如你可能已经注意到的那样) . 因此,基本上答案是“不要让用户篡改请求 . 只允许应用程序插入遵循参照完整性规则的数据 . ”
MongoDB在很多方面都很棒......但是如果你发现你需要外键,那么它可能不是你问题的正确解决方案 .
为了回答您的具体问题 - 当MongoDB鼓励在客户端处理外键关系时,他们也提供了"Database References"的想法 - 请参阅this help page .
也就是说,我不建议使用DBRef . 让您的客户端代码管理关联或(更好)从一开始就将文档链接在一起 . 您可能需要考虑在所有者对象本身内嵌入所有者的"documents" . 组装您的文档以符合您的使用模式,MongoDB将大放异彩 .
作为NoSQL解决方案,您可以使用MariaDB(NewSQL)它是SQL和NoSQL的组合,由MySQL开发人员实现,具有出色的性能 .
这是一对一的关系 . 最好将一个文档嵌入另一个文档中,而不是维护单独的集合 . 检查here如何在mongodb中建模它们及其优点 .
尽管在文档中没有明确提及,但嵌入为您提供与外键约束相同的效果 . 只是想让这个想法变得清晰 . 当你有两个这样的集合:
C1:
C2:
如果您要在
C2._id
上声明外键约束以引用C1._id
(假设MongoDB允许它),则意味着您无法将文档插入C2
,其中C2._id
在C1
中不存在 . 将其与嵌入式文档进行比较:现在,owner_details字段表示来自C2集合的数据,其余字段表示来自C1的数据 . 您不能将owner_details字段添加到不存在的文档中 . 你基本上可以达到同样的效果 .