以JSON格式存储数据
共同点都是使用JSON存储器数据。事实上,CouchDB和RavenDB(以及其他许多数据库)均采用JSON格式存储数据。MongoDB对JSON使用称之为“二进制JSON”(BSON)的转换,以便能够执行二进制序列化。BSON是数据的内部表现形式,从编程的角度看开发者不会发现有任何区别。
JSON的简洁性使其很容易将几乎所有语言的对象结构转换为JSON。 因此,开发者可在应用程序中定义对象,然后将其直接存储在数据库中。这使得开发人员不需要使用对象关系映射程序 (ORM) 不断在数据库架构和类/对象架构之间进行转换。
MongoDB BSON API的数据类型和约定列表添加了一种数据类型及其他一些数据类型,以便充实JSON中的可用内容。而在一个单元中存储和检索相关数据可提供显著的性能和可伸缩性的优势。数据库不必四处查找常用的相关的数据,因为数据都存储在相同的位置。
类型的集合
与数据库交互时,应用程序如何知道哪一项代表学生,哪一项代表书,以及哪一项代表博客文章? 数据库使用集合这一概念解决了这一问题。 对于与特定集合(如学生集合)关联的任何文档(无论其架构如何)都可在从该集合请求数据时对其进行检索。使用字段来指示类型也十分常见。这只是使搜索过程更加轻松,但哪些内容应进入集合,哪些不应进入集合,由开发者的应用程序决定。
架构灵活的数据库
前面介绍的“示例代码1”包含自己的架构。 每个记录负责自己的架构,甚至负责单个数据库或集合中包含的架构。并且一个学生记录并不需要与另一学生记录相匹配。开发者只需利用此灵活性来提高效率。例如,为什么存储 null 值? 您可以在属性(如“most_repeated class”)不具有值时执行以下操作:
"scores" : [ 75, 99, 87.2 ]
"name" : "Julie",
"scores" : [ 50, 40, 65 ],
"most_repeated_class" : "Time Management 101"
文档数据库和领域驱动开发
规划域类(可能成为数据库中的文档)时,开发者可查找通常最为独立的数据(例如具有其明细项的订单),并将其作为单个数据结构加以关注。在订购系统中,可能还有客户和产品。但或许会在不需要订单的客户信息的情况下访问该订单,并且可能会在不需要访问使用产品的订单的情况下使用该产品。这意味着,尽管会发现许多机会来包含独立数据结构(如具有其明细项的订单),但这并不表示在某些情形下可以不必或者不通过外键联接数据。
每个数据库都提供各种可用模式的指南,并为用户指明使用哪些模式可以获得最大成功。 例如MongoDB文档讨论称为“上级数组”的模式,它可加快在联接文档时对相关数据的访问速度。
在关系数据库中,重复数据是个错误。 对数据库进行标准化可确保不出现此情况。 使用NoSQL数据库(尤其是分发数据库)时,对数据进行逆规范化是必要且可接受的。
查询和更新
每个数据库都附带用于查询和更新的API。尽管它们可能不是核心API的一部分,但多语言API是通过加载项提供的。其他查询依赖预定义的视图和称为Map/Reduce的模式。此过程的映射阶段使用这些视图,并且各个数据库的映射职责是不同的。映射还使数据库能够跨多个处理器分发查询处理。化简阶段可获取映射查询(如果已分发,则为多个查询)的结果,并将数据聚合到要返回到客户端的结果中。
尽管CouchDB要求开发者通过预定义的Map/Reduce视图进行查询,但MongoDB(也使用视图和Map/Reduce)另外提供执行临时查询的功能。RavenDB允许使用预定义索引进行查询,但也支持临时查询,并将根据开发者的实际运行时查询自动为其创建索引。但在大多数时候,当不采用SQL数据库的已知架构和关系本质时,开发者会丢失的一个功能是执行临时查询的功能。通过严格控制查询,文档数据库能够实现其快速性能。
数据库变革
有许多非关系数据库都不属于NoSQL范畴。但既然这扇门已经敞开,就会鼓舞更多人去探索其可用的功能,并考虑如何改进它。