有没有办法强制架构被尊重?

时间:2012-05-15 13:50:19

标签: mongodb rdbms nosql

首先,我想说我真的很喜欢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" } ] }

这是非常错误的。

让我们切换上下文,考虑电影信用卡(无论出于何种原因,信用卡将以明文形式存储在数据库中)。这是超级错误的?

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

  2. 甚至最糟糕的是,代码实际上和网店访问者一样 实际上在“租一部电影”列表中看到了信用卡信息。

  3. 是否有任何可以阻止此类威胁发生的内置内容?像某种方式“强制”一个模式只被一些表尊重?

    或者有没有办法强制MongoDB强制构建架构? (无法在表格中创建新字段等)

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

    谢谢你,祝你有个愉快的一天。

1 个答案:

答案 0 :(得分:2)

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

具有架构的数据库无法完全消除此类问题 - 例如系统中可能存在一个错误,它使用RDBMS将错误的数据放入错误的字段/表中。

恕我直言,更大的担忧是,这种bug是如何通过开发,测试和投入生产的?!

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

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

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