【发布时间】:2017-09-29 19:14:57
【问题描述】:
为什么 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
);
示例组大致如下:
'State Abbreviation' 对应的值是美国所有州的缩写列表。
“姓名前缀”,对应的值为字符串列表,例如“先生”、“夫人”、“博士”等。
根据我的经验,将这些值表规范化为每个 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 使用所描述的第一个设置而不是第二个设置?
【问题讨论】:
-
我在理解您的示例时遇到了一些问题。您可以编辑您的问题以提供一些不太抽象的示例吗?这本质上是关于数据库规范化的问题吗?此外,这可能适合 dba.SE。
-
@RToyota,看起来他在问“多个专用查找表”与“单个表的表”(好吧,在他的情况下是三个)。
-
威廉,为了回答,我们需要知道你的“更好”标准,但恐怕答案仍然是“这取决于 - 去测试看看哪个”更适合您”。
-
抱歉,我已经澄清了我原来的问题。听起来@Brian 对这个问题有大致的了解。
-
是的@Brian,但他的意思是你的问题没有答案,除了你通过测量得到的答案。然而,甚至不清楚一种设计如何是另一种设计的转变。一般来说,如果你有一堆可以合并在一起的表,那么这就是简单的设计,如果你有一堆表是它们连接的投影,它们应该按规范化分解,如果你不知道那么从您的角度来看,在“效率”变得重要之前,您需要学习很多基础知识。 (就像很多这样的问题,你应该在谷歌上找到。)
标签: sql database-design