Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 为什么非依赖性保持BCNF分解仍然被认为是在BCNF中?_Database Design_Bcnf - Fatal编程技术网

Database design 为什么非依赖性保持BCNF分解仍然被认为是在BCNF中?

Database design 为什么非依赖性保持BCNF分解仍然被认为是在BCNF中?,database-design,bcnf,Database Design,Bcnf,从数据库系统概念教科书中,对于BCNF中要考虑的具有一组依赖项F的模式r,对于表a中F+中的所有依赖项(即关闭F)→ b、 必须至少满足以下条件之一: a→ b是一个平凡的函数依赖项(b⊆ (a) a是模式r 教科书给出的示例是,对于函数依赖关系为F={i\u ID的模式dept\u advisor(s\u ID,i\u ID,dept\u name)→ 部门名称;部门ID,部门名称→ i_ID},BCNF分解为: r1(序列号,序列号) r2(识别号、部门名称) 此分解满足第一个依赖项

从数据库系统概念教科书中,对于BCNF中要考虑的具有一组依赖项F的模式r,对于表a中F+中的所有依赖项(即关闭F)→ b、 必须至少满足以下条件之一:

  • a→ b是一个平凡的函数依赖项(b⊆ (a)
  • a是模式r
教科书给出的示例是,对于函数依赖关系为F={i\u ID的模式dept\u advisor(s\u ID,i\u ID,dept\u name)→ 部门名称;部门ID,部门名称→ i_ID},BCNF分解为:

  • r1(序列号,序列号)
  • r2(识别号、部门名称)

此分解满足第一个依赖项(i_ID→ 部门名称),因为i\u ID是r2的超级键,但由于它不满足第二个依赖项(s\u ID,部门名称→ i_ID,因此是非依赖性保留的),因为第二个依赖项是非平凡的,但不是分解模式的超键,所以该分解不符合BCNF吗?

您已经正确报告了BCNF的定义:对于F+的每个非平凡依赖项,行列式是一个超键

因此,在您的示例中,分解中的两个关系模式都实现了这个定义:在
r2
中,只有一个非平凡的依赖项
i\u ID→ dept_name
行列式是一个超键,而在
r1
中没有非平凡的依赖项,因此仍然满足定义。所以有两个模式都在BCNF中

但是,正如您再次正确指出的,依赖项
s\u ID,dept\u name→ i_ID
不包含在分解的依赖项集中(即使您执行了
r1
r2
的依赖项集并集的闭包),这意味着分解不会保留依赖项。实际上,这意味着在分解的模式中,
s_ID
dept_name
的两个值可能对应于
i_ID
的多个值,因此丢失了一个重要的完整性约束


这个例子能教给我们什么?我们可以对BCNF中的模式进行分解,从而生成可能包含不一致数据的数据库。请注意,在这种特殊情况下,BCNF中没有可以保留依赖关系的分解。因此,BCNF并不是消除数据库设计中所有问题的灵丹妙药,事实上,已经定义了其他范式,可以用来缓解数据库设计中的一些问题。例如,示例的原始模式已经是第三范式(3NF),这在实际情况下被认为是可以接受的。

虽然我同意你的要点,但问题的BCNF定义不正确,它并没有说F是一组有效的FD,缺少的部分是提问者困惑的根本,以及含糊不清的术语“中断”和“违反”,如果明确,将指持有的FDs。感谢您的输入!但是还有一点我不完全理解:您提到,
r1
只包含琐碎的依赖项,但我不确定我是否看到了,因为I_ID似乎不是s的子集_ID@LYC请解释一下你的“因为”——这没有道理。您说您不确定r1是否只“包含”(满足?)平凡的FD,这意味着您认为它可能“包含”一个非平凡的FD。但“i_ID似乎不是s_ID的子集”与此有什么关系?(如果你说的是第二个FD,那么它之所以不重要是因为{i_ID}不是{s_ID,dept_name}的子集。)@LYC,在
r1
中只有属性
s_ID
i_ID
。考虑到在
r
中存在的依赖关系,在
r1
中不存在此类依赖关系,并且从这些依赖关系派生的非平凡依赖关系在
r1
中也不存在。其中包含哪些依赖项?下面是一个列表:
i\u ID→ i_ID;我知道→ ; 苏伊德→ s_ID;苏伊德→ ; i_ID,s_ID→ i_ID,s_ID
。您可以看到它们都是琐碎的依赖项。@LYC&Renzo和
{}→ {}
。注意,我已经重新编写了我原来问题中的术语。当你说“第二个FD在两个表中都不存在”时,你的意思是因为(s_ID,dept_name)→ i_ID)既不适用于r1也不适用于r2,它不应被视为需要遵守非平凡或超级键要求的依赖项之一?是的。FD表示一条语句。当陈述为真时,我们说陈述成立、满足或是事实等。FD要保存其属性,必须将所有属性都包含在表中。两个表都没有第二个FD的所有属性。因此,这两种情况都无法维持。现在,你的理由是:你最后一句的“因为”没有使用定义中的“保持”部分。由于FD不成立,它不在F+中,因此它不在“F+中的所有FD”中,因此它是否满足无定义项无关。PS你的最后一段很草率。动词并不总是有正确的主语和宾语。那本教科书没有给出BCNF的正确定义。从技术上讲,它们定义了一个表何时“相对于集合F在BCNF中”,但随后并没有实际定义BCNF。对于BCNF:如果F必须是一组保持不变的FD,那么根据定义它将是F+。它们并不意味着F必须是一些有效的fd,因为除了F+中违反子弹测试的fd之外,其他fd也可以有效。正确的是,F必须是固定的FD的盖子。但他们没有这么说。他们甚至没有说F中的FDs必须保持不变!我同情你。PS所以你是对的!PS(所谓“你是对的”,我的意思是“这个分解[不]坚持[那个]”