我试图找到关于函数依赖关系的以下关系的3NF无损分解:
首先,我首先从上面给出的函数依赖项中导出键。我认为关键如下:
{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,则以下内容成立:
鉴于此,如何获得关于功能依赖关系的3NF无损分解?我怀疑我可能错误地认为关系是在3NF,因为存在传递依赖,但不是100%肯定。
如果有人可以就我可能出错的地方提出意见,我们将不胜感激。
答案 0 :(得分:1)
你的回答是正确的:
所有密钥实际上都是LT,ET,TM,因为它们确定了所有其他属性,并且没有其他密钥,因为它们的子集都不满足此属性。
依赖关系已经成为关系的规范性内容。
由于您所述的原因,这种关系已经在3NF中了。
请注意,如果您按照正确的方式执行第三范式的定义,则无需检查是否存在传递函数依赖关系。
我们还可以注意到原始关系不是在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丢失的属性。