数据库设计的最佳实践

在当今世界,在开始设计数据库之前,除了关系数据库之外,我们还需要考虑非关系(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等资源的过程。
  • 水平扩展:向系统添加更多硬件的过程。这通常意味着向现有系统添加节点(新服务器)。

这两种扩展都可以组合在一起,将资源添加到现有服务器以垂直伸缩,并在需要时添加其他服务器以水平伸缩。在考虑每种方法时,明智的做法是考虑水平扩展和垂直扩展之间的权衡。

注意:本文仅介绍了一些最佳实践,还有许多其他的实践。此外,在设计数据库时还需要考虑许多其他因素(这里没有涉及)。

原文发布于微信公众号 - 程序你好(codinghello)

原文发表时间:2018-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏自动化测试

DIY自动化测试【智能音箱】

    笔者从事智能音箱系统测试,这是一款基于android系统的智能语音助手产品。基本功能特性和测试方法都已稳定,目前多产品快速迭代,涉及的场景较多且数据量大...

1.1K40
来自专栏微服务

电商前端交易型系统设计原则

个人认为设计系统要因场景因时间而异,一个系统不是一下子就设计的非常完美,在有限的资源情况下一定是先解决当下最核心的问题,并预测/发现未来可能出现的问题,一步步解...

10810
来自专栏Cloud Native - 产品级敏捷

微服务架构设计 第六步: 微服务的 User Stories 的分析、设计与定义完成

2016.9.12, 深圳, Ken Fang 特性负责人, 说服开发与测试人员, 能认同微服务中的 User Story 的价值, 并使开发与测试人员能从产品...

22880
来自专栏大前端开发

从编程小白到全栈开发:数据 (1)

有些事情时刻都在发生,但是我们通常很少意识到它们的存在。比如,当我们使用网页或移动应用的时候,其实在不断的产生着数据:注册一个网站或app的账号、发一条微博、写...

10530
来自专栏陈帅的专栏

Android 性能测试之 CPU 耗电性能篇

现有的耗电性能测试,除了高端深入带着原理去测试的方法,大多数都是读取系统文件或采用工具获取整体手机电流值,这样的方法受影响的因素多,数据波动大,可信度不高,同时...

60000
来自专栏zhisheng

告诉你们一个好消息

《通过项目逐步深入了解Mybatis》系列文章已在简书、掘金、segmentFault、CSDN受到一大波的好评。 今天晚上特意整理下来成一篇文章,本来是想发布...

381100
来自专栏PPV课数据科学社区

【数据可视化专题】数据可视化:前端数据之美如何展示?

随着 web 技术的蓬勃发展,前端的展示、交互越来越复杂,在用户的访问、操作过程中产生了大量的数据。由此,前端的数据分析也变得尤为重要。当然,对于站长来说,你可...

609100
来自专栏JAVA高级架构

盘点电商大战背后的技术力量支撑

『目的』满足贯穿从商品展示、搜索、购买、支付等整个流程,电商对于精细化、精准化促销运营的需求,使多渠道(终端)、多区域化营销成为简单易行的配置操作,提升运营能力...

19430
来自专栏高性能服务器开发

1 游戏服务器开发的基本体系与服务器端开发的一些建议

近年来,我身边的朋友有很多都从web转向了游戏开发。他们以前都没有做过游戏服务器开发,更谈不上什么经验,而从网上找的例子或游戏方面的知识,又是那么的少,那么的零...

72430
来自专栏王亚昌的专栏

UNIX编程艺术之“模块性”

     本章主要讨论模块划分、接口设计,提出了几个很重要的概念,包括紧凑性、正交性、自顶向下和自底向上的设计、SPOT原则、分层、插件化。下面就这几个概念,谈...

11020

扫码关注云+社区

领取腾讯云代金券