3NF以及关系和功能依赖的无损分解

时间:2016-06-10 06:41:50

标签: database database-design database-normalization 3nf

我试图找到关于函数依赖关系的以下关系的3NF无损分解:

enter image description here

首先,我首先从上面给出的函数依赖项中导出键。我认为关键如下:

{L,T},{E,T}和{T,M},因为可以使用这些键中的任何一个获得关系中的所有属性。

现在,我熟悉的3NF的定义是:

A relation schema R is in 3NF if, whenever a function dependency X -> A holds in R, either
(a) X is a superkey of R, or
(b) A is a prime attribute of R.

如果我们将这个应用于问题中给出的FD,则以下内容成立:

  • LT - > E满足(a)因为LT是一个密钥(因此是一个超级密钥)。
  • ET - > L满足(a)因为ET是键(因此是超级键)。
  • TM - > E满足(a)因为TM是一个密钥(因此是一个超级密钥)。
  • E-> M满足(b)因为M是主要属性。

鉴于此,如何获得关于功能依赖关系的3NF无损分解?我怀疑我可能错误地认为关系是在3NF,因为存在传递依赖,但不是100%肯定。

如果有人可以就我可能出错的地方提出意见,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

你的回答是正确的:

  1. 所有密钥实际上都是LT,ET,TM,因为它们确定了所有其他属性,并且没有其他密钥,因为它们的子集都不满足此属性。

  2. 依赖关系已经成为关系的规范性内容。

  3. 由于您所述的原因,这种关系已经在3NF中了。

  4. 请注意,如果您按照正确的方式执行第三范式的定义,则无需检查是否存在传递函数依赖关系。

    我们还可以注意到原始关系不是在Boyce-Codd Normal Form中,对于依赖关系E→M,并且通过应用分析算法将它带入BCNF产生分解:

    public class ClientProperty {
        public class Root{}         //NodeType1
    
        public class Partner{       //NodeType2
            public String partner_id;
            public String partner_name;
            public int partner_node_id;
    
            public Partner(String partner_id,String partner_name,int partner_node_id){
                this.partner_id = partner_id;
                this.partner_name = partner_name;
                this.partner_node_id = partner_node_id;
            }
        }
    
        public class Clients{       //NodeType3
            public String client_name;
            public String client_id;
            public int client_node_id;
            public Map<Enum,List<Enum>> clientproperty = new HashMap<Enum,List<Enum>>();
    
            public Clients(String client_name, String client_id, int client_node_id,Map<Enum,List<Enum>> clientproperty){
                this.client_name = client_name;
                this.client_id = client_id;
                this.client_node_id = client_node_id;
                this.clientproperty = clientproperty;
            }
        }
        public class Users{         //NodeType4
            public String user_name;
            public String user_id;
            public int user_node_id;
    
            public Users(String user_id,String user_name, int user_node_id){
                this.user_id = user_id;
                this.user_name = user_name;
                this.user_node_id = user_node_id;
            }
        }
        public class Node{
            Node next;
            Object nodes;
    
            public Node(){
                next = null;
            }
    
            public Node(Object nodes, Node next){
                this.nodes = nodes;
                this.next = next;
            }
        }
    }

    具有依赖性T M→E丢失的属性。