sql - 冒险作品说明

标签 sql sql-server tsql adventureworks

我一直在查看 Microsoft 的 Adventure Works 2012 数据库。如果有任何信息解释为什么创建这些表,我会非常感兴趣。我猜想是某种模式概述。

例如:

为什么他们选择创建一个 BusinessEntity 表作为 Person、Employee 等的基类

大多数数据都已标准化,因此他们选择将 CountryRegionCode 字段放入 StateProvince 表中,而不是将 ID 放入单独的表中。

无论如何,我非常有兴趣了解有关数据库设计决策的更多信息。有人知道涉及此类事情的资源吗?

最佳答案

我不知道 AdventureWorks 的任何官方设计文档,但我曾经是一名培训师,并广泛使用 AdventureWorks 数据库进行演示和实验室,所以我对它非常熟悉。

BusinessEntity 表是 SuperType/SubType 设计的经典案例,它减少了数据冗余,因为客户也可以成为供应商,员工也可以成为客户,以及所有其他组合。此外,这意味着您不会在单独的表中重复存储与所有实体相关的详细信息,从而最大限度地减少代码更改时的工作量。

我对 CountryRegionCode 不太肯定,但我怀疑以下三个原因之一:

  1. 没有足够多的不同组合来保证额外的表,但会牺牲报告性能(这可以通过一些简单的 COUNT(*) GROUP BY 语句进行验证)
  2. 他们希望它位于同一个表中,以便将来可以灵活地使用 HierarchyID 来建模层次结构(这是最不可能的选项)
  3. 这是一个标准化错误! (我的钱就花在这个选项上了!)

关于sql - 冒险作品说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13220573/

相关文章:

java - 在Java中查询数据库后返回一个数组

sql - DBCC CHECKIDENT 找不到表

sql-server-2005 - smalldatetime 是否有效?

sql - 重用的T-SQL游标的起始位置?

mysql - CodeIgniter 事件记录;将两个查询合并为一个?

sql - sql中并行插入语句会导致死锁吗?

mysql - 设置可序列化会使 2 个 select 语句成为原子吗? (两次选择之间的表格没有变化)

java - 当函数返回而不关闭准备好的语句/结果集时,这会很糟糕吗?

java - 即使启用全部级联后,也无法从具有子记录的父表中删除记录

mysql - 自定义格式mysql查询和一列中的多个值