Database design 新手DBA在设计表时应遵循的规则

Database design 新手DBA在设计表时应遵循的规则,database-design,rdbms,Database Design,Rdbms,我敢肯定,有成千上万的DBA拥有设计优化数据库的经验。 我将请他们分享他们在以下方面的一些经验: 如何设计表[多读少写/少读多写场景] 初学者在设计表格时常犯哪些错误 如果可能的话,举一些例子 我认为第一条规则是一个数据库不能做所有事情。它无法针对读写密集型操作进行优化。因此,您可以有多个数据库,每个数据库都有特定的用途 操作数据库 对于最终用户访问的系统的实际日常运行更新、读取、写入或应用程序。这应该在中,但是如果需要改进慢速查询,可以断开NF和一些字段 报告数据库 该数据库(数据仓库)针对

我敢肯定,有成千上万的DBA拥有设计优化数据库的经验。
我将请他们分享他们在以下方面的一些经验:

  • 如何设计表[多读少写/少读多写场景]
  • 初学者在设计表格时常犯哪些错误
  • 如果可能的话,举一些例子

    • 我认为第一条规则是一个数据库不能做所有事情。它无法针对读写密集型操作进行优化。因此,您可以有多个数据库,每个数据库都有特定的用途

      操作数据库

      对于最终用户访问的系统的实际日常运行更新、读取、写入或应用程序。这应该在中,但是如果需要改进慢速查询,可以断开NF和一些字段

      报告数据库

      该数据库(数据仓库)针对只读操作进行了优化。这将是,而且经常作为一个例子

      暂存数据库

      如果需要多个应用程序来访问数据。您可以创建一个暂存数据库,其中包含操作数据库中所有数据的副本。主要区别在于此数据库不应具有任何索引或许多约束、触发器等,因为它们都会降低插入(写入)速度。此数据库仅用作快速提取所有生产数据的临时存储,但其他应用程序不应直接使用此数据库。其他应用程序应该从中提取所需的数据,并将其转换为自己的格式。例如,将数据从暂存复制到报告/数据仓库中。它的主要目的是减少操作数据库上的负载


      因此,主要的一点是,对于您的操作数据库,您应该了解,如果您想进行大量插入,请注意字段上有哪些触发器和索引,因为它们会减慢插入速度。还可以查看NOSQL数据库,以获得可能更好的性能。

      我认为第一条规则是一个数据库不能做所有事情。它无法针对读写密集型操作进行优化。因此,您可以有多个数据库,每个数据库都有特定的用途

      操作数据库

      对于最终用户访问的系统的实际日常运行更新、读取、写入或应用程序。这应该在中,但是如果需要改进慢速查询,可以断开NF和一些字段

      报告数据库

      该数据库(数据仓库)针对只读操作进行了优化。这将是,而且经常作为一个例子

      暂存数据库

      如果需要多个应用程序来访问数据。您可以创建一个暂存数据库,其中包含操作数据库中所有数据的副本。主要区别在于此数据库不应具有任何索引或许多约束、触发器等,因为它们都会降低插入(写入)速度。此数据库仅用作快速提取所有生产数据的临时存储,但其他应用程序不应直接使用此数据库。其他应用程序应该从中提取所需的数据,并将其转换为自己的格式。例如,将数据从暂存复制到报告/数据仓库中。它的主要目的是减少操作数据库上的负载


      因此,主要的一点是,对于您的操作数据库,您应该了解,如果您想进行大量插入,请注意字段上有哪些触发器和索引,因为它们会减慢插入速度。还可以查看NOSQL数据库,以获得可能更好的性能。

      您的问题非常广泛,我的答案也是如此(这是针对典型的业务线应用程序,而不是数据仓库或决策支持系统):

      • 使用适当的数据类型-不要在字符串字段中存储日期-不要在字符串字段中存储数值(我以前都见过!);如果字符串为60-100个字符-请勿在SQL Server中使用
        VARCHAR(MAX)
        (2 GB)。。。。。如果您的固定长度字符串(例如代码)少于5个字符,请使用
        CHAR(x)
        not
        VARCHAR(x)

      • 标准化您的数据-尝试实现第三种标准形式-然后在需要和适当的地方进行反标准化。但首先设计为3NF规范化级别。这也意味着:每个表都有一个定义良好的主键

      • 适当时使用约束——子表和父表之间的外键关系、单列中允许的值约束和唯一性约束

      • 仔细考虑您的查询访问权限——将如何查询哪些表?考虑可能的指数——但不要做得太过分!太多的指数可能比没有更糟糕。找到一个平衡点

      此外,还有一些特定于供应商的优化/工作要做

      例如,在SQL Server中,我会:

      • 始终在外键字段上放置索引-这有助于连接和加速确保引用完整性

      • 通常将大blob字段(
        VARCHAR(MAX)
        VARBINARY(MAX)
        )移动到单独的表中,并将它们链接到“基本”表。这样,如果您使用的是ORM,那么您就不会一直将这些巨大的字节块加载到内存中


      保罗·利特温(Paul Litwin)的这篇文章很好地总结了这一点。

      你的问题非常广泛——我的答案也是如此(这是针对一个典型的业务应用程序,而不是数据仓库或决策支持系统):

      • 使用适当的数据类型-不要在字符串字段中存储日期-不要在字符串字段中存储数值(我以前都见过!);如果字符串为60-100个字符-不要使用
        VARCHAR(MAX)
        (