database - 第三范式算法

标签 database algorithm normalization

我将从一个例子开始回答我的问题。

假设我们有具有以下属性的表 Adress:

-Name(which also is the primary key, I will give this column the symbol N)
-Street(will have the symbol S)  
-City(will have the symbol C)  
-Region(will have the symbol R)  
-Zip_Code(will have the symbol Z) 

属性之间给出如下关系

N -> S,C,R,Z   
C -> R  
S,C,R -> Z  
Z -> C  

我使用以下规则消除了冗余状态: IF A1 ...Ai ... An -> T 还有:{A1...An}/Ai -> Ai 那么 Ai 在第一个关系中是多余的。

因此我们有:

 N-> S,C  
 C -> R  
 S,C -> Z  
 Z -> C 

现在,我必须删除所有关系 V -> B,其中我已经有 V -> AA -> B

这让我想到了我的问题。在我看来,我没有什么可删除的,这意味着对于 FN3,我将拥有上述关系描述的 4 个表。然而常识告诉我,我应该主要只有 2 个表 R1(#name,street,city,zip) R2(city,region).我可以删除以下两个关系吗: S,C -> ZZ -> C ? (我有 N -> S,CS,C -> ZZ -> C 所以在我看来我去 N -> S,C -> Z -> C 我已经有了所以删除前 2... )

最佳答案

不,您不能在不丢失信息的情况下删除这些关系。为了更进一步地举个例子,你最终会得到 N -> C ,它会丢弃你的大部分属性。

问题是您将所有 -> 关系视为平等的,但事实并非如此。也许 N -> S,C,R,Z 是 1:1 关系,但 C -> R 是多:1 关系(一个地区的许多城市)并且 Z -> C 是 1:many 关系(一个邮政编码有多个城市)。

使用不同的符号来表示这些其他关系,例如 C =} RZ {= C。然后规范化您的表关系。

关于database - 第三范式算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30672040/

相关文章:

database - 为什么 Long 数据类型在 Oracle 中已被 LOB 取代?

algorithm - 插入排序比冒泡排序好?

algorithm - NurbsSurface的理解

database - 过度规范化

sql - GROUP BY 用于 SELECT 一列

PHP-使用 GET 从 mysql 回显时遇到问题

javascript - d3.js 如何简化复杂路径 - 使用自定义算法

mysql - 关于地址、城市、国家数据的规范化问题

node.js - 用于规范化数据的 Mongoose getter/setter

php - 将波斯语值插入具有波斯语名称的表时出错