首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将关系分解成BCNF?

如何将关系分解成BCNF?
EN

Stack Overflow用户
提问于 2016-04-10 20:50:33
回答 1查看 487关注 0票数 0

假设我们有一个关系,其中:

病人决定医生,医院决定医生,医生决定医院。我们怎么把它分解成BCNF呢?

{,},,}或

{医生,医院},{,}或

{医生,医院},{医生,病人}

在我对关系的理解中,它需要是3NF,如果X→Y在R中保持,那么对于关系中的每一个依赖项,下列一个必须保持:X→Y是函数依赖的X是R的一个超键。

那么{医生,医院},{医生,病人}会是正确的选择吗?

EN

回答 1

Stack Overflow用户

发布于 2016-04-10 22:22:58

首先,我认为你误解了这个数字。其中使用的表示法通常被解释为描述以下两个函数依赖关系:

代码语言:javascript
复制
Patient, Hospital → Doctor   (1)
Doctor → Hospital            (2)

功能依赖(1)意味着对某一医院中的每个病人指定一名独特的医生,而(2)意味着每个医生在一家独特的医院工作。在你的解释中,相反,每家医院都有唯一的医生,那就是任何一家医院都只有一名医生!

那么,考虑到上面的解释,让我们看看这种关系是否在BCNF中。如果每个行列式都是(超级)键,并且显然是依赖项,则关系在BCNF中:

代码语言:javascript
复制
Doctor → Hospital

违反此条件,因为医生不是超级键(也就是说,它不确定所有属性)。事实上,这种关系有两个候选键:(病人,医院)和(病人,医生)。

因此,BCNF中这种关系的分解如下:

代码语言:javascript
复制
R1 <(Doctor, Hospital), { Doctor → Hospital }>

R2 <(Doctor, Patient), { }>

(所以你的猜测是正确的)。

但是,请注意,这种分解有一个令人不快的特性:功能依赖的丢失!事实上,依赖性:

代码语言:javascript
复制
Patient, Hospital → Doctor

是丢失的,即不能在结果数据库中强制执行。这意味着我们可以将病人的信息插入到不在病人所在医院的医生那里!

最后,请注意,由于医生是一个素数属性(即它属于候选键),初始关系已经在3NF中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36535412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档