假设我们有一个关系,其中:
病人决定医生,医院决定医生,医生决定医院。我们怎么把它分解成BCNF呢?
{,},,}或
{医生,医院},{,}或
{医生,医院},{医生,病人}
在我对关系的理解中,它需要是3NF,如果X→Y在R中保持,那么对于关系中的每一个依赖项,下列一个必须保持:X→Y是函数依赖的X是R的一个超键。
那么{医生,医院},{医生,病人}会是正确的选择吗?
发布于 2016-04-10 22:22:58
首先,我认为你误解了这个数字。其中使用的表示法通常被解释为描述以下两个函数依赖关系:
Patient, Hospital → Doctor (1)
Doctor → Hospital (2)功能依赖(1)意味着对某一医院中的每个病人指定一名独特的医生,而(2)意味着每个医生在一家独特的医院工作。在你的解释中,相反,每家医院都有唯一的医生,那就是任何一家医院都只有一名医生!
那么,考虑到上面的解释,让我们看看这种关系是否在BCNF中。如果每个行列式都是(超级)键,并且显然是依赖项,则关系在BCNF中:
Doctor → Hospital违反此条件,因为医生不是超级键(也就是说,它不确定所有属性)。事实上,这种关系有两个候选键:(病人,医院)和(病人,医生)。
因此,BCNF中这种关系的分解如下:
R1 <(Doctor, Hospital), { Doctor → Hospital }>
R2 <(Doctor, Patient), { }>(所以你的猜测是正确的)。
但是,请注意,这种分解有一个令人不快的特性:功能依赖的丢失!事实上,依赖性:
Patient, Hospital → Doctor是丢失的,即不能在结果数据库中强制执行。这意味着我们可以将病人的信息插入到不在病人所在医院的医生那里!
最后,请注意,由于医生是一个素数属性(即它属于候选键),初始关系已经在3NF中。
https://stackoverflow.com/questions/36535412
复制相似问题