Mongodb 有没有办法强制遵守模式?

Mongodb 有没有办法强制遵守模式?,mongodb,rdbms,nosql,Mongodb,Rdbms,Nosql,首先,我想说我真的很喜欢NoSQL&MongoDB,但是我对它的无模式方面有一些主要的担忧 假设我有两张桌子员工和电影 而且。。。我有一个非常愚蠢的数据层/框架,它有时喜欢将对象保存在错误的表中 所以有一天,一部电影会保存在Employees表中。像这样: > use mongoTests; switched to db mongoTests > db.employees.insert({ name : "Max Power", sex : "Male" }); > db.em

首先,我想说我真的很喜欢
NoSQL
&
MongoDB
,但是我对它的
无模式方面有一些主要的担忧

假设我有两张桌子员工和电影

而且。。。我有一个非常愚蠢的
数据层
/
框架
,它有时喜欢将对象保存在错误的表中

所以有一天,一部
电影
会保存在
Employees
表中。像这样:

> use mongoTests;
switched to db mongoTests
> db.employees.insert({ name : "Max Power", sex : "Male" });
> db.employees.find();
{ "_id" : ObjectId("4fb25ce6420141116081ae57"), "name" : "Max Power", "sex" : "Male" }
> db.employees.insert({ title : "Fight Club", actors : [{ name : "Brad Pitt" }, { name : "Edward Norton" }]});
> db.employees.find();
{ "_id" : ObjectId("4fb25ce6420141116081ae57"), "name" : "Max Power", "sex" : "Male" }
{ "_id" : ObjectId("4fb25db834a31eb59101235b"), "title" : "Fight Club", "actors" : [ { "name" : "Brad Pitt" }, { "name" : "Edward Norton" } ] }
这是非常错误的

让我们切换上下文,想想电影,以及信用卡(无论出于何种原因,在这种上下文中,信用卡将以明文形式存储在数据库中)。这是大错特错吗

  • 代码可能会爆炸,因为它试图使用一个对象 结构并接收另一个完全未知的结构

  • 甚至最糟糕的是,代码实际上是有效的,Web商店的访问者 实际上可以在“租电影”列表中查看信用卡信息

  • 有没有什么内置的东西可以阻止这种威胁的发生?是否有某种方法可以“强制”只对某些表使用模式

    或者有没有办法强制MongoDB将模式设为强制模式?(无法在表等中创建新字段)

    EDIT:对于那些认为我在使用trolling的人,我真的不是,这对我和我的团队来说是一个重要的问题,因为这是我们是否要使用NoSQL的一个重大决定。


    谢谢,祝你今天愉快。

    无模式方面是主要的积极因素之一


    具有模式的数据库不能完全消除此类问题-例如,使用RDBMS的系统中可能存在错误,将错误数据放入错误的字段/表中

    IMHO,更大的问题是,这种bug是如何通过开发、测试并投入生产的

    话虽如此,您可以设置一个流程来检查集合中文档的“模式”(例如,查看新添加的文档,检查它们是否有您希望在其中看到的字段),然后标记以进行调查。这里有这样一个工具(node.js)(我想,我从未使用过它):

    编辑:
    对于那些在将来发现这个问题的人,我的评论中的链接不会被忽视,这里有一个jira项目用于这类事情:

    当然要做的一件事就是修复数据层中的错误。@Pointy:当然,但这并不能从根本上解决问题。让我们考虑一下,开发人员可能无法修复数据层的bug。谢谢你的评论。我说的不仅仅是信用卡,而是任何个人信息(包括姓名、地址等)。这取决于当地法律,但您可能需要为敏感数据提供额外的安全保护(对于医疗应用,法律可能会强制要求将它们分开)。“这就像说,不要在重要的事情上使用MongoDB”。对就像。你不可能100%安全,但检查越少,出错的概率就越大。这是一个完全正确的问题。尽管这是一个无模式的数据库,但最好知道是否有强制插入/更新某种模式的选项。@Tomshresds:FAQ的以下两个部分(在哪些问题不可问下)中的任一部分适用:a)我们被问到一个开放式的假设性问题:“如果发生了怎么办?”b)这是一个伪装成问题的咆哮:“糟透了,我说得对吗?”()。在我看来,这个问题不适合堆栈溢出。“带有模式的数据库不能完全消除此类问题-例如,使用RDBMS的系统中可能存在错误,将错误的数据放在错误的字段/表中。”是的,但是,尝试向表中添加未知字段将导致“X字段不存在”错误,而不是插入它。我只是觉得由开发人员来阻止这种事情发生有点愚蠢。应该有某种“强制模式”选项或其他什么。。。谢谢回复@我听到你在说什么了,是的,只是程度较轻。我不认为这是愚蠢的,毕竟,mongodb通过以不同的方式解决其他问题并专注于这些差异,给出了一个与RDBMS完全不同的选择。mongodb的jira问题可能与该领域有关。。。谢谢你真的帮助我,这正是我所说的,真的很感激!是的,它在节点中运行,您可以向它提供一组期望值(例如,每个员工都有一个姓名和性别字段以及可选的职务),然后它会将您拉到电影上,因为它不希望看到“标题”字段或演员数组。仅供参考,根据github上的警告,我会小心地在live DB上运行它:)