在宣传MongoDB时,MongoDB的论据之一是MongoDB是“无模式”数据库的事实:
为什么没有模式?
MongoDB是JSON样式的数据存储。 数据库中存储的文档可以具有不同的字段集,每个字段具有不同的类型。
没错 但这并不意味着没有架构。 实际上有多种模式:
- 设计数据结构时的脑海
- 数据库真正实现的一种用于存储数据结构的数据库
- 您应该已经实现的一种才能满足您的要求
每次您意识到自己犯了一个错误(请参阅上面的第三点),或者当您的需求发生变化时,就需要迁移数据。 让我们在这里再次回顾MongoDB的观点:
使用无模式数据库,对数据库的90%的时间调整将变得透明且自动。 例如,如果我们希望将GPA添加到学生对象,则添加属性,重新保存,一切都很好-如果我们查找现有的学生并引用GPA,则只返回null。 此外,如果我们回滚代码,则如果我们的代码编写正确,则现有对象中的新GPA字段不太可能引起问题。
上面的一切都是正确的。
“无架构”与“全架构”
但是,让我们将其转换为SQL(或使用任何其他“ schema-ful”数据库):
ALTER TABLE student ADD gpa VARCHAR(10);
我们完成了! e,我们已经添加了一列,并将其添加到了所有行。 这是透明的。 这是自动的。 对于现有的学生,我们“只是返回零”。 我们甚至可以“回滚我们的代码”:
ALTER TABLE student DROP gpa;
现有对象不仅不大可能引起问题,而且实际上已经回滚了代码和数据库。
让我们总结一下:
- 我们可以在“无模式”数据库中做与在“全模式”数据库中做的完全相同的操作
- 我们保证进行迁移(这也是即时的)
- 回滚更改时,我们保证数据完整性
那更真实的DDL呢?
当然,在项目开始时,当它们仍然类似于典型的cat / dog / pet-shop,book / author / library示例应用程序时,我们将仅添加列。 但是,如果我们需要将学生与老师的1:N关系变成学生与老师的M:N关系,会发生什么? 突然,一切都改变了,关系数据模型不仅证明远远优于仅产生大量数据重复的分层模型,而且迁移起来也相当容易,并且保证结果正确且整洁!
CREATE TABLE student_to_teacher
AS
SELECT id AS student_id, teacher_id
FROM student;
ALTER TABLE student DROP teacher_id;
……我们完成了! (当然,我们将添加约束和索引)
考虑一下将JSON转换为新JSON的繁琐任务。 您甚至没有XSLT或XQuery来完成任务,只有JavaScript!
面对现实吧
与NoSQL一样,无模式是一个误导性术语:
根据NoSQL的历史@markmadsen #strataconf pic.twitter.com/XHXMJsXHjV
— Edd Dumbill(@edd) 2013年11月12日
再说一次,MongoDB的博客文章讲的是事实(也是一个有趣的事实):
通常,这种“无模式”样式与动态类型化的语言之间存在直接的类比。 诸如此类的构造很容易用PHP,Python和Ruby表示。 我们在这里要做的是使到数据库的映射自然。
当您说“无模式”时,您实际上是在说“动态类型的模式” –与静态类型的模式相反,因为它们可以从SQL数据库获得。 与XML相对,JSON仍然是完全无模式的数据结构标准,而XML使您可以在需要时指定XSD,或在面向文档的“无模式”(即,动态类型)模式下运行。
(并且不要说有json-schema 。这是模仿XSD的荒谬尝试)
了解这一点很重要! 即使您没有静态键入它,也总会有一个模式。 如果您正在编写JavaScript,则仍然有类型,您必须在代码的思维模型中充分了解这些类型。 除了没有编译器(或IDE)可以帮助您以100%确定性推断类型之外。
一个例子:
大声笑JavaScript:> null * 1 0> null == 0 false pic.twitter.com/Hc2NR2tsMP
— Lukas Eder(@lukaseder) 2014年10月15日
… 和更多:
因此,有绝对没有任何与除“schemaful”一“无模式”的数据库确实更容易。 您只是将清理架构的不可避免的工作推迟到了其他某个时间,或者您可能比今天更关心这个时间,或者您很幸运地找到了一份新工作,而其他人为您完成了工作。 您可能会相信MongoDB,当时他们说“对象不太可能引起问题”。
但是,让我告诉您一个丑陋的事实:
任何可能出错的事情都会
– 墨菲
我们希望您在使用动态类型的语言和动态类型的数据库架构时祝您好运,同时我们将坚持使用类型安全的SQL。
翻译自: https://www.javacodegeeks.com/2014/10/stop-claiming-that-youre-using-a-schemaless-database.html