首页 文章

如何在NoSql数据库(MongoDB)中强制执行外键?

提问于
浏览
13

假设我有一系列文件,例如:

{ "_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 回答

  • 1

    我还建议如果用户名是唯一的,那么将它们用作_id . 您将保存索引 . 在存储的文档中,在创建文档时将应用程序中“owner”的值设置为“username”的值,并且永远不要让任何其他代码更新它 .

    如果有更改所有者的要求,则提供适用的API以及实施的业务规则 .

    没有任何外键需要 .

  • 0

    如果有人真的想在Project / WebApp中强制执行外键 . 然后你应该使用MixSQL方法,即SQL NoSQL

    我更喜欢那些没有那么多引用的Bulky数据,然后它可以存储在NoSQL数据库Store中 . 喜欢:酒店或地方类型的数据 .

    但是,如果有一些严肃的事情,如OAuth模块表,TokenStore和UserDetails和UserRole(映射表)等....那么你可以使用SQL .

  • 0

    MongoDB没有外键(正如你可能已经注意到的那样) . 因此,基本上答案是“不要让用户篡改请求 . 只允许应用程序插入遵循参照完整性规则的数据 . ”

    MongoDB在很多方面都很棒......但是如果你发现你需要外键,那么它可能不是你问题的正确解决方案 .

  • 0

    为了回答您的具体问题 - 当MongoDB鼓励在客户端处理外键关系时,他们也提供了"Database References"的想法 - 请参阅this help page .

    也就是说,我不建议使用DBRef . 让您的客户端代码管理关联或(更好)从一开始就将文档链接在一起 . 您可能需要考虑在所有者对象本身内嵌入所有者的"documents" . 组装您的文档以符合您的使用模式,MongoDB将大放异彩 .

  • 13

    作为NoSQL解决方案,您可以使用MariaDB(NewSQL)它是SQL和NoSQL的组合,由MySQL开发人员实现,具有出色的性能 .

  • 16

    这是一对一的关系 . 最好将一个文档嵌入另一个文档中,而不是维护单独的集合 . 检查here如何在mongodb中建模它们及其优点 .

    尽管在文档中没有明确提及,但嵌入为您提供与外键约束相同的效果 . 只是想让这个想法变得清晰 . 当你有两个这样的集合:

    C1:

    { "_id" : 0 , "owner":0 "name":"Doc1"},{ "_id" : 1 , "owner":1, "name":"Doc1"}, etc
    

    C2:

    { "_id" : 0 , "username":"John"}, { "_id" : 1 , "username":"Sam"}
    

    如果您要在 C2._id 上声明外键约束以引用 C1._id (假设MongoDB允许它),则意味着您无法将文档插入 C2 ,其中 C2._idC1 中不存在 . 将其与嵌入式文档进行比较:

    {
        "_id" : 0 , 
        "owner" : 0,
        "name" : "Doc1",
        "owner_details" : {
            "username" : "John"
        }
    }
    

    现在,owner_details字段表示来自C2集合的数据,其余字段表示来自C1的数据 . 您不能将owner_details字段添加到不存在的文档中 . 你基本上可以达到同样的效果 .

相关问题