在当今世界,在开始设计数据库之前,除了关系数据库之外,我们还需要考虑非关系(nosql)数据库。40多年来,SQL(结构化查询语言)数据库一直是主要的数据存储机制。
尽管NoSQL自20世纪60年代以来就已经有了,近年来如MongoDB、Cassandra、Redis等NoSQL数据越来越受欢迎。
无论SQL或NoSQL的主要目标是存储数据,只是它们在存储、检索等方法上有所不同。
此外,终端用户通常对组合数据的报告信息感兴趣,而不是对单独的数据项感兴趣。根据项目的需要,我们可以选择使用SQL或NoSQL。我们还应该记住,一个不是一个替代另一个,有时候它只是一个合适选择而已。
让我们看看一些设计数据库的最佳实践,以及在数据库设计过程中需要考虑的所有内容。
需要存储哪些信息(数据)?
这一步是为了确定需要存储哪些数据。在这里,我们需要一个领域专家和一个数据库专家。
这需要数据库设计人员具备从具有领域知识的人员中获取所需信息的技能。这是因为那些拥有必要领域知识的人经常不能清楚地表达他们对数据库的系统需求,因为他们不习惯考虑必须存储的离散数据元素。
我们为什么要储存这些?
有必要知道为什么我们需要存储这些数据。谁会用这些,他们是谁?
我们需要执行什么样的查询?
我们如何使用这些数据?
数据的关系:
一旦设计人员确定到要存储在数据库中的数据,他们也就必须确定数据中依赖的数据。
结构化数据:
一旦确定了各种信息块之间的关系和依赖关系,就可以将数据安排到逻辑结构中,然后将其映射到数据库管理系统支持的存储对象中。
上面提到的这些点对于任何类型的数据库都是有效的,但是我们需要根据数据库类型(关系或非关系)考虑一些重要的步骤。
关系数据库:
非关系数据库(NoSQL)
非规范化:
将相同的数据复制到多个文档或表中,以便简化或优化查询处理,或将用户的数据适合于特定的数据模型。它允许我们以查询友好的结构存储数据,以简化查询处理。规范化数据增加查询连接的查询执行时间,特别是在分布式体系结构中。
软模式:
所有NoSQL都以这样或那样的方式提供了软模式功能:
软模式允许使用复杂的内部结构(嵌套实体)来形成实体类,并改变特定实体的结构,并通过嵌套实体来帮助最小化一对多关系,从而减少联接。
连接:
在NoSQL中很少支持连接。对于NoSQL,连接通常在设计时处理,而不是在查询执行时处理连接的关系模型。查询时间连接几乎总是意味着性能损失,但在许多情况下,可以使用非规范化和聚合(例如嵌入嵌套实体)来避免连接。在某些情况下,连接是不可避免的,应该由应用程序处理。
数据库可扩展性:
这是数据库设计中的一个概念,强调数据库处理数据量和用户数量增长的能力。数据库系统可大致分为两个领域:垂直扩展和水平扩展。
这两种扩展都可以组合在一起,将资源添加到现有服务器以垂直伸缩,并在需要时添加其他服务器以水平伸缩。在考虑每种方法时,明智的做法是考虑水平扩展和垂直扩展之间的权衡。
注意:本文仅介绍了一些最佳实践,还有许多其他的实践。此外,在设计数据库时还需要考虑许多其他因素(这里没有涉及)。