1

首先,我想说我真的很喜欢NoSQL&MongoDB但我对它的schema-less方面有一些主要的担忧。

假设我有 2 张桌子。员工电影

而且...我有一个非常愚蠢的data layer/framework有时喜欢将对象保存在错误的表中。

所以有一天,一个Movie被保存在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" } ] }

这是非常错误的。

让我们切换上下文,考虑MoviesCreditCards(无论出于何种原因,在这种情况下,信用卡将以明文形式存储在数据库中)。这是大错特错?

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

  2. 更糟糕的是,该代码确实有效,并且网上商店的访问者实际上在“租电影”列表中看到了信用卡信息。

有什么内置的东西可以防止这种威胁发生吗?像某种方式来“强制”仅对某些表尊重架构?

或者有什么方法可以强制 MongoDB 强制使用模式?(不能在表中创建新字段等)

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

感谢,并有一个愉快的一天。

4

1 回答 1

2

无模式方面是主要的优点之一。

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

恕我直言,更大的问题是,这种错误是如何通过开发、测试和投入生产的?!

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

http://dhendo.github.com/node-mongodb-schema-validator/

编辑:
对于那些将来发现这个问题的人,所以我评论中的链接不会被忽视,这里有一个 jira 项目:http: //jira.mongodb.org/browse/SERVER-3536

于 2012-05-15T13:58:07.120 回答