首先,我想说我真的很喜欢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" } ] }
这是非常错误的。
让我们切换上下文,考虑Movies和CreditCards(无论出于何种原因,在这种情况下,信用卡将以明文形式存储在数据库中)。这是大错特错?
该代码可能会爆炸,因为它试图使用一个对象结构并接收另一个完全未知的结构。
更糟糕的是,该代码确实有效,并且网上商店的访问者实际上在“租电影”列表中看到了信用卡信息。
有什么内置的东西可以防止这种威胁发生吗?像某种方式来“强制”仅对某些表尊重架构?
或者有什么方法可以强制 MongoDB 强制使用模式?(不能在表中创建新字段等)
编辑:对于那些认为我在拖钓的人,我真的不是,这对我和我的团队来说是一个重要的问题,因为无论我们是否要使用 NoSQL,这是一个重大决定。
感谢,并有一个愉快的一天。