在做数据库规范化时,什么是行的信息重复套组合成新的实体叫什么名字?在做数据库规范化时,什么是行的信息

2019-05-12 10:52发布

我有点困惑的某一条数据库规范化的,我想我会问StackOverflow的:

想象一下,你有相关的产品颜色如下关系。 注意,产品1和产品2都使用相同的一组颜色(蓝色和绿色)。

Product_Color                         Color
+-------------+-------------+     +-------------+-------------+
| Product*    | Color*      |     | ColorId*    | Name        |
+-------------+-------------+     +-------------+-------------+
| 1           | 1           |     | 1           | Blue        |
| 1           | 2           |     | 2           | Green       |
| 2           | 1           |     +-------------+-------------+
| 2           | 2           |
+-------------+-------------+

如果我创建了两个新的关系,ColorSet和ColorSet_Color,我可以通过加入4个一起关系显示相同的信息。

Product_ColorSet:                 ColorSet_Color:             
+-------------+-------------+     +-------------+-------------+
| Product*    | ColorSetId* |     | ColorSetId* | ColorId*    |
+---------------------------+     +-------------+-------------+
| 1           | 1           |     | 1           | 1           |
| 2           | 1           |     | 1           | 2           |
+-------------+-------------+     +---------- --+-------------+

ColorSet:                         Color:
+-------------+                   +-------------+-------------+
| ColorSetId* |                   | ColorId*    | Name        |
+-------------+                   +-------------+-------------+
| 1           |                   | 1           | Blue        |
| 2           |                   | 2           | Green       |
+-------------+                   +----------[--+-------------+

在这一点上,如果我有一个大Product_Color表,用颜色共享组的一个合理的程度,我会站在从空间的角度大大获益。

什么是数据库规范化的背景下,这个操作的技术名称? 我清楚地消除,即使我已经创建了实际上不存在的实体,这是相当多只是随机的机会,有很多重叠的冗余信息。 特别是我在改变由这样做呢?

此外,好像我可以随意这样做是为了大多数实体。 令我百思不解的是,Product_Color和颜色已经是第六届正常形态,当我们开始练习(右?)。

Answer 1:

您将引入一个“ 代理键 ”(或标识符)来名称 / 标识组的产品进来的颜色。另一种方法是通常被认为是一个“ 自然键 ”(或标识符)。 (虽然不同的人具体不同的方式使用这些术语。例如,有些人可能只能用“代孕”时的名称/标识被永久地分配一个参照物和/或它的所指的唯一名称/标识符和/或它是可见的只有withing数据库&不是应用程序。例如有人会说,一个外部可见的系统生成的任意名称/像驱动程序识别号码标识符既是替代和自然的。)

代理键通常被称为“无意义(标识符)”。 这反映了思维不清。 没有一个先验的命名方案生成的所有名称是“毫无意义”和武断的。 “尼古拉斯”没有“的意思是” ,直到它被选中; 有被选择,它“是指”你。 这同样适用于任何名称/标识符。 因此,“毫无意义的” /“有意义”是不是一个有用的区别。 在系统中的替代名称/标识符是在系统启动后得到了选择只有一个。 什么叫获取系统中的“有意义的” [原文]会被称为“毫无意义” [原文]在任何系统分配时出现之前(因为任务是开始后)。

有一个“观点”中,你是“去除冗余信息”,但它不是实现关系正常化地址那种冗余。 您是通过其他表替换表,但它不是标准化分解。 代理人的介绍是不是正常化的一部分。 标准化不引入新的列名。 它只是取代它的表中重用一个原始表的名称。 (你可以只是为了清楚,准确地描述你的“冗余”这里是什么意思?)

有时人们认为,如果值的子元组同样可以出现在列集或表不止一次那么这些子行值需要由是FKS到映射的id值子行值的新表ID来代替。 (也许甚至是单柱子行,即当单个值出现较一列或表一次。)他们认为多子行值出现在“冗余”或只有IDS可以重复而不“冗余”。 (该ID设计被看作是一种原始的数据压缩的)。他们可能认为这是正常化的一部分。 这一切都不是如此。

这不是冗余的,你应该费心通过表设计来解决。 如果你知道你的表由DBMS的实施方案你知道你的应用程序的使用模式你知道,原来是demonstrably和有意义比一些选项,恰好是“少冗余”雪上加霜(为什么会不“更多的冗余”选项是更好吗?),那么你应该告诉DBMS你想要的选项,为您的设计没有,如果你可以改变模式。 (这一般是通过索引和/或视图来完成。)例如索引你的ColorId原Product_Color导致基本上你用人工方式你的第二个设计创建的,但自动生成和管理的执行相同的结构。 (您可能会引入代理人出于其他原因,例如,通过更简洁虽然比较隐晦的重视和约束的人来替代多列外键。)

回复选项:您的新设计将使用更多的操作 (如联接和预测)的查询文本和(典型DBMS实现)执行比原来的(如查询的原始表),但很少在其他地方(例如,在复制一个产品的颜色集另一种的)。 所以,这又是所有关于 “观点” 的权衡

事实上,你必须与代理人另一种意义上引入的冗余 。 有抱着一堆不在原来的ID值,但该记录相同的情况下,附加列。 您还背负着更多的命名和间接性设计的用户。 代孕的设计肯定有很多的这个“透视”,“冗余信息”比较原始。

即使你的出发设计已经大概介绍代理人,颜色名称,即颜色标识。 (如果颜色标识添加了“通知”,你不仅仅是他们的相关名称“信息”,即,那么他们就不会成为代理人,并有必要),即如果颜色标识是任意选择,那么你可能只是有:

Product_Color
+-------------+-------------+
| Product*    | ColorName*  |
+-------------+-------------+
| 1           | Blue        |
| 1           | Green       |
| 2           | Blue        |
| 2           | Green       |
+-------------+-------------+

你应该有一个理由来介绍颜色标识,并为此事产品ID,而不是自然键已经存在。 你能证明你的多个表,名称和间接性VS只有一个?



文章来源: What is combining repeating sets of row information into new entities called when doing database normalization?