我对上一篇文章感到有些困惑,所以我找到了一个很好的例子,应该清理一下。
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基于样本数据吗?或者我们是否考虑了可以添加的可能值?答案 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。 (这有时被称为"有代表性的数据"对于变量。)但是如果我们只给出一个变量可能出现的值,那么我们只知道
另见this answer。
答案 3 :(得分:0)
这是我对关系的尝试: