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