识别功能依赖性II

时间:2011-04-25 19:05:57

标签: database database-design relational-database functional-dependencies

我对上一篇文章感到有些困惑,所以我找到了一个很好的例子,应该清理一下。 enter image description here

hireDate& carReg是主键。所以我的问题是任何人都可以找到除我下面确定的任何额外的功能依赖....修改也欢迎:

fd1 carReg -> make, model, outletNo, outletLoc
fd2 custNo -> custName
fd3 outletNo -> outletLoc
fd4 model -> make (only if we assume a model name is unique to a make)
fd5 carReg, hireDate -> make, model, custNo, custName, outletNo, outletLoc 

我不确定上述是否正确,我相信还有更多。请有人帮助我最终了解这些该死的FD!

编辑:基于catcall的答案....我的问题是:custName如何 - >没有有效的FD?对于上述关系,当然,客户名称只映射到一个客户编号,但凭直觉,我们知道可以将多个J SMith添加到表中。如果是这种情况,则此FD无效,因为它形成1 .. *关系。我们真的可以说custName - >不知道这个事实吗?我们只是将FD基于样本数据吗?或者我们是否考虑了可以添加的可能值?

4 个答案:

答案 0 :(得分:6)

一目了然。 。

custName -> custNo
model -> make
outletLoc -> outletNo
carReg, custNo -> hireDate
carReg, custName -> hireDate

我确信还有其他人。示例数据不具代表性,当您尝试从数据中确定功能依赖性时,这是一个问题。假设您的样本数据只有一行。

carReg    hireDate make  model  custNo  custName  outletNo  outletLoc
--
MS34 0GD  14/5/03  Ford  Focus  C100    Smith, J  01        Bearsden

FD回答了这个问题,“给定'x'的一个值,我知道'y'只有一个值吗?”基于该一行样本数据集,每个属性确定每个其他属性。 custNo确定hireDate。 hireDate确定outletLoc。 custName确定模型。

当样本数据不具代表性时,很容易打开无效的FD。您需要更多有代表性的示例数据来清除一些无效的功能依赖项。

custName -> custNo isn't valid ('C101', 'Hen, P')
carReg, custNo -> hireDate isn't valid ('MS34 0GD', 'C100', '15/7/04')
carReg, custName -> hireDate isn't valid ('MS34 0GD', 'Hen, P', '15/8/03')

您可以使用SQL调查示例数据中的函数依赖项。

create table reg (
  CarReg char(8) not null,
  hireDate date not null,
  Make varchar(10) not null,
  model varchar(10) not null,
  custNo char(4) not null,
  custName varchar(10) not null,
  outletNo char(2) not null,
  outletLoc varchar(15) not null
);

insert into reg values
('MS34 OGD', '2003-05-14', 'Ford', 'Focus', 'C100', 'Smith, J', '01', 'Bearsden'),
('MS34 OGD', '2003-05-15', 'Ford', 'Focus', 'C201', 'Hen, P', '01', 'Bearsden'),
('NS34 TPR', '2003-05-16', 'Nissan', 'Sunny', 'C100', 'Smith, J', '01', 'Bearsden'),
('MH34 BRP', '2003-05-14', 'Ford', 'Ka', 'C313', 'Blatt, O', '02', 'Kelvinbridge'),
('MH34 BRP', '2003-05-20', 'Ford', 'Ka', 'C100', 'Smith, J', '02', 'Kelvinbridge'),
('MD51 OPQ', '2003-05-20', 'Nissan', 'Sunny', 'C295', 'Pen, T', '02', 'Kelvinbridge');

模型是否确定了make?

select distinct model 
from reg
order by model;

model
--
Focus
Ka
Sunny

三种不同的模型。 。

select model, make
from reg
group by model, make
order by model;

model   make
--
Focus   Ford
Ka      Ford
Sunny   Nissan

烨。每种型号都有一个品牌。基于样本数据,模型 - >使

carReg,custName - >雇佣日期?

select distinct carReg, custName
from reg
order by custName;

carReg
--
MH34 BRP  Blatt, O
MS34 OGD  Hen, P
MD51 OPQ  Pen, T
MS34 OGD  Smith, J
NS34 TPR  Smith, J
MH34 BRP  Smith, J

carReg和custName的六种不同组合。

select carReg, custName, hireDate
from reg
group by carReg, custName, hireDate
order by custName;

carReg  custName  hireDate
--
MH34 BRP  Blatt, O  2003-05-14
MS34 OGD  Hen, P    2003-05-15
MD51 OPQ  Pen, T    2003-05-20
MH34 BRP  Smith, J  2003-05-20
NS34 TPR  Smith, J  2003-05-16
MS34 OGD  Smith, J  2003-05-14

烨。 carReg和custName的每个组合都有一个hireDate。因此,基于样本数据,{carReg,custName} - >雇佣日期。

答案 1 :(得分:4)

好吧,既然你要求第二个意见,我会给你一个。

第二种意见是第一种(CatCall)是完全正确的。

样本数据不足以识别/确定数据中的功能依赖性。识别/确定数据中的功能依赖性所需要的是用户需求,数据库要支持的业务环境的描述/定义,......

只有您的用户可以通过这种或那种方式告诉您哪些功能依赖性适用。 (不要将此解释为您应该告诉您的用户他们应该告诉您“适用的FD是什么”,因为您的用户通常不会知道该术语的含义。但是,适用的FD是什么,可以仍然只能从用户提供的商业规范中获得。)

(PS样本数据可能恰恰相反,足以证明某个给定的FD当然不适用。但这不是你的问题。)

答案 2 :(得分:1)

FD(函数依赖)表示关系值或变量的某个属性。我们可以说它对于给定的关系持有或不满足(满足或不满足)(是或否)。当我们说它对于关系变量持有或不成立时,我们的意思是它对于应用程序中可能出现的变量的每个可能值都持有或不成立。

此外,如果我们给出一个值,并且我们被告知它满足的FD是一个FD,一个可以容纳它的变量满足然后通过该假设变量& #39; FD是价值的FD。 (这有时被称为"有代表性的数据"对于变量。)但是如果我们只给出一个变量可能出现的值,那么我们只知道

  • 所持有的FD也不属于变量
  • 两个人的琐事 FDs (S的形式 - > S的子集) (仅根据属性,不论价值如何,必须持有的) (对于值和变量必须相同)

另见this answer

答案 3 :(得分:0)

这是我对关系的尝试:

enter image description here