为什么数据库架构师会选择对引用的子表进行反规范化

时间:2017-09-29 19:14:57

标签: sql database-design

为什么DBA会选择使用大量的,大量引用的查找表而不是几个小的专用查找表,其中只有一个或两个表引用每个表。例如:

CREATE TABLE value_group (
   id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
   group_name VARCHAR(30) NOT NULL
);

CREATE TABLE value_group_value (
   id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
   value_group_id INT NOT NULL,
   value_id INT NOT NULL,
   FOREIGN KEY (value_group_id) REFERENCES value_group(id)
);

CREATE TABLE value (
   id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
   value_text VARCHAR(30) NOT NULL
);

示例组将是:

  • '州名缩写'相应的值是所有美国州缩写的列表。

  • '名称前缀'相应的值是一个字符串列表,如' Mr。',' Mrs。',' Dr。'等。

根据我的经验,将这些值表规范化为每个value_group的表将使更改更容易,提供清晰度,并且查询执行速度更快:

CREATE TABLE state_abbrv (
   id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
   abbreviation CHAR NOT NULL
);

CREATE TABLE name_prefix (
   id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
   prefix VARCHAR NOT NULL
);

对于value_group表中的n个组,使用n个表。然后,根据所需的关系,可以从另一个表或使用某个中间表直接引用这些新表中的每一个。

哪些因素会影响DBA使用第一个设置而不是第二个?

1 个答案:

答案 0 :(得分:0)

根据我的经验,用于查找的单个标准化“表格表”结构的主要优点是代码重用,简化文档(如果您在1%的人员中记录您的数据库,那么)和您可以添加新的查找表而无需更改数据库结构。

如果我每次看到数据库中的某些内容让我想知道“DBA的想法是什么?”,我就可以退休到巴哈马。