我对上一篇文章有点困惑,所以我找到了一个很好的例子,可以解决问题。
hiringDate 和 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 -> custNo 如何是有效的 FD?对于上述关系,当然,一个客户名称正好映射到一个客户编号,但根据直觉,我们知道可以将不止一个 J SMith 添加到表中。如果是这种情况,则此 FD 是无效的,因为它形成了 1..* 关系。我们真的可以说 custName -> custNo 知道这个事实吗?我们是否仅将 FD 建立在样本数据上?或者我们是否考虑了可以添加的可能值?
最佳答案
乍看上去 。 . .
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 确定租用日期。雇佣日期决定了 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');
型号决定品牌?
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
是的。每个型号一个。根据样本数据,model -> make。
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 的每个组合对应一个租用日期。因此,基于示例数据,{carReg, custName} ->hiringDate。
关于database - 识别功能依赖 II,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5782062/