作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
费尔南多·马丁内斯
验证专家 在工程

Fern和o是一位有着30年经验的资深系统和计算机工程师. 他使用Java、c#、SQL Server等语言进行开发.

以前在

IBM
分享

每当你, 作为开发者, 是基于现有的代码给出的任务, 你必须面对许多挑战. 其中一个挑战(通常是最苛刻的挑战)涉及理解应用程序的数据模型.

你通常会遇到令人困惑的表格,视图,列,值, 存储过程需要很长时间才能理解的函数、约束和触发器. 和, 一旦他们这么做了, 您开始注意到许多改进和利用存储信息的方法.

如果你是一个有经验的开发人员, 您可能还会注意到一些糟糕的数据库设计示例—这些示例在一开始就可以做得更好, 要是有人能给你一些数据库设计技巧就好了.

在本文中, 您将了解一些常见的数据库设计不良实践, 为什么它们不好?, 以及如何避免它们.

不良习惯No. 1:忽略数据的目的

存储数据以供以后使用, 目标总是以最有效的方式存储和检索它. 为实现这一目标 数据库设计师 必须事先知道数据将代表什么, 它将如何获得,以什么速度获得, 它的业务量将是多少.e.(预期有多少数据),最后是如何使用这些数据.

例如, 每天手工采集数据的工业信息系统与实时生成信息的工业信息系统的数据模型不同. 为什么? 因为每月处理几百或几千条记录与 管理数百万人 在同一时期. 为了保持数据库的效率和可用性,设计者必须特别考虑, 如果数据量很大.

但, 当然, 数据量并不是唯一需要考虑的方面, 由于数据的目的也影响到归一化水平, 数据结构, 记录大小, 并对整个系统进行了总体实现.

因此, 彻底了解您将创建的数据系统的目的,会导致在选择数据库引擎时需要考虑的问题, 要设计的实体, 记录的大小和格式, 以及数据库引擎管理策略.

忽略这些目标将导致设计在其基础上存在缺陷, 尽管在结构和数学上都是正确的.

不良习惯No. 2:规范性差

设计ing a database is not a deterministic task; two 数据库设计师 是否可以遵循给定问题的所有规则和规范化原则, 在大多数情况下,它们会生成不同的数据布局. 这是软件工程的创造性本质所固有的. 然而, 有一些分析技术对每种情况都有意义, 遵循它们是获得性能最佳的数据库的最佳方法.

一组数据的图像导致两种不同的布局

尽管如此,我们经常会遇到设计糟糕的数据库.e.它是动态设计的,没有遵循最基本的规范化规则. 我们必须明确这一点:每个数据库都应该, 至少, 归一化为第三范式, 因为它是最能代表你的实体的布局, 查询和插入-更新-删除记录之间的性能将得到最好的平衡.

你们若因不相合的桌子跌倒 3NF、2NF,甚至1NF,请考虑重新设计这些表. 你所付出的努力将在短期内得到回报.

不良习惯No. 3:冗余

与前一点非常相关,因为其中之一 标准化目标 是为了减少它,冗余是另一个经常出现的坏习惯吗.

冗余字段和表是开发人员的噩梦, 因为它们需要业务逻辑使相同信息的多个版本保持最新. 如果完全遵循规范化规则,这是可以避免的开销. 尽管有时冗余似乎是必要的, 它必须只在非常具体的情况下使用,并清楚地记录下来,以便在今后的发展中加以考虑.

冗余的典型不良影响是不必要地增加数据库大小, 数据容易出现不一致, 并且降低了数据库的效率, 但更重要的是,它可能导致数据损坏.

不良习惯No. 4:糟糕的引用完整性(约束)

参考完整性是数据库引擎提供的最有价值的工具之一,它可以使数据质量保持在最佳状态. 如果在设计阶段没有实现约束或很少实现约束, 数据完整性必须完全依赖于业务逻辑, 使它容易受到人为错误的影响.

不良习惯No. 5 .没有充分利用DB引擎的功能

当你使用 数据库引擎 (DBE), 您有一个功能强大的软件来处理您的数据处理任务,它将简化软件开发并保证信息始终正确, 安全, 和可用性. DBE提供如下服务:

  • 视图提供了一种快速有效的方式来查看数据, 通常出于查询目的而对其进行反规范化,而不会丢失数据正确性.
  • 有助于加快对表的查询的索引.
  • 帮助分析信息而无需编程的聚合函数.
  • 如果发生意外情况,全部执行和提交或取消(回滚)的事务或数据更改语句块, 从而使信息永远处于正确的状态.
  • 在执行事务时保持数据安全和正确的锁.
  • 提供编程功能以允许执行复杂数据管理任务的存储过程.
  • 允许复杂计算和数据转换的函数.
  • 有助于保证数据正确性和避免错误的约束.
  • 在数据上发生事件时帮助自动执行操作的触发器.
  • 在底层运行的命令优化器(执行规划器), 确保每句话都以最佳状态执行,并保留执行计划以备将来使用. 这是使用视图的最佳理由之一, 存储过程, 和功能, 因为它们的执行计划永久保存在DBE中.

不了解或忽视这些功能将使开发走上一条极不确定的道路,并且肯定会导致错误和未来的问题.

不良习惯No. 6:复合主键

这是一个有争议的观点, 因为现在许多数据库设计人员都在讨论使用自动生成的整数ID字段作为主键,而不是由两个或多个字段组合定义的复合键. 这是目前数据库设计的最佳实践之一,我个人倾向于同意它.

复合主键的映像

然而,这只是一种约定,当然,DBEs允许定义 复合的主 钥匙,许多设计师认为这是不可避免的. 因此,与冗余一样,复合主键也是一种设计决策.

当心, 虽然, 如果使用复合主键的表预计有数百万行, 控制复合键的索引可能会增长到CRUD操作性能下降的程度. 在这种情况下, 最好使用一个简单的整数ID主键,它的索引足够紧凑,并建立必要的DBE约束来保持唯一性.

不良习惯No. 7:索引差

有时,您将有一个表,您需要查询许多列. 随着表的增长,您会注意到这些列上的select变慢了. 如果桌子足够大的话, 你会想, 在逻辑上, 在用于访问该表的每一列上创建索引,结果几乎立即发现,除了insert之外,select的性能有所提高, 更新, 和delete drop. 这, 当然, 是因为索引必须与表保持同步吗, 这意味着DBE的开销很大. 这 is a typical case of over indexing that you can solve in many ways; 例如, 与用于查询表的主键不同的所有列上只有一个索引, 在所有CRUD操作中,将这些列从使用最多的列到使用最少的列排序可能比每列一个索引提供更好的性能.

另一方面, 如果一个表在用于查询它的列上没有索引,就会出现这种情况, 我们都知道, 导致select的性能很差.

也, index efficiency depends sometimes on the column type; indexes on INT columns show the best possible performance, 而是VARCHAR上的索引, DATE或DECIMAL(如果有意义的话)就没有那么有效了. 这种考虑甚至可能导致重新设计需要以尽可能高的效率访问的表.

因此, 索引总是一个微妙的决定, 因为太多的索引和太少的索引一样糟糕,而且要索引的列的数据类型对最终结果有很大的影响.

不良习惯No. 8 .糟糕的命名约定

这是程序员在面对现有数据库时经常遇到的问题:通过表和列的名称来理解其中存储的信息, 经常, 没有别的办法.

表名必须描述它所包含的实体, 每个列名必须描述它所代表的信息. 这很简单,但是当表之间必须相互关联时,它就开始变得复杂了. 名字开始变得混乱,而且, 更糟糕的是, 如果存在混淆命名约定和不合逻辑的规范(如, 例如, "列名必须少于8个字符"). 最终的结果是数据库变得不可读.

因此,一个 命名约定 如果数据库希望与它所支持的应用程序一起持续和发展,是否总是必要的, 这里有一些指导方针来建立一个简洁的, 简单的, 还有一个可读的:

  • 对表或列名大小没有限制. 最好有一个描述性的名字,而不是一个没有人记住或理解的缩写.
  • 相同的名称具有相同的含义. Avoid having fields that have the same name but with different types or meanings; this will be confusing sooner or later.
  • 除非必要,否则不要冗余. 例如, 在表“Item”中,,不需要像“ItemName”这样的列,”“PriceOfItem,” or similar names; “Name” 和 “Price” are enough.
  • 小心DBE保留词. 如果要将列称为“Index”,,这是一个SQL保留字, 尝试使用不同的一个,如“IndexNumber”.”
  • 如果坚持简单的主键规则(自动生成单个整数), 在每个表中命名为“Id”.
  • 如果要加入另一张桌子, 将必要的外键定义为整数, 名称为“Id”,后面跟着连接表的名称(e.g.IdItem).
  • 如果对约束进行命名,请使用描述约束的前缀(例如.g.(“PK”或“FK”),后面跟着所涉及的表的名称. 当然,少量使用下划线(“_”)有助于提高可读性.
  • 命名索引, 使用前缀“IDX”,后跟表名和索引的列. 此外,如果索引是唯一的,则使用“UNIQUE”作为前缀或后缀,必要时使用下划线.

internet上有许多数据库命名指南,它们将在数据库设计的这个非常重要的方面提供更多的信息, 但是这些基本的, 你至少可以得到一个可读的数据库. 这里重要的不是命名指南的大小或复杂性,而是遵循它们的一致性!

关于Good vs .的最后几点评论. 糟糕的数据库设计

数据库 design is a combination of knowledge 和 experience; the software industry has evolved a lot since its early days. 幸运的是,有足够的知识可以提供帮助 数据库设计师 达到最佳效果.

有很好的数据库设计 的指导方针 网上到处都是 不好的实践要避免的事情 在数据库设计中. 你只管挑,坚持挑.

和, 不要忘记, 这只能通过实验来实现, 错误, 以及你学到的成功, 所以现在就开始吧.

聘请Toptal这方面的专家.
现在雇佣
费尔南多·马丁内斯

费尔南多·马丁内斯

验证专家 在工程

波哥大——哥伦比亚的波哥大

2020年6月18日成为会员

作者简介

Fern和o是一位有着30年经验的资深系统和计算机工程师. 他使用Java、c#、SQL Server等语言进行开发.

作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

以前在

IBM

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

Toptal开发者

加入总冠军® 社区.