use*_*142 3 database database-design relational-database functional-dependencies
我对上一篇文章感到有些困惑,所以我找到了一个很好的例子,应该清理一下. 
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
Run Code Online (Sandbox Code Playgroud)
我不确定以上是否正确,我相信还有更多.请有人帮助我最终了解这些该死的FD!
编辑:基于catcall的答案....我的问题是:custName - > custNo如何成为有效的FD?对于上述关系,当然,客户名称只映射到一个客户编号,但凭直觉,我们知道可以将多个J SMith添加到表中.如果是这种情况,则此FD无效,因为它形成1 ..*关系.我们真的可以说custName - > custNo知道这个事实吗?我们只是将FD基于样本数据吗?或者我们是否考虑了可以添加的可能值?
乍看上去 ...
custName -> custNo
model -> make
outletLoc -> outletNo
carReg, custNo -> hireDate
carReg, custName -> hireDate
Run Code Online (Sandbox Code Playgroud)
我相信还有其他人.示例数据不具代表性,当您尝试从数据中确定功能依赖性时,这是一个问题.假设您的样本数据只有一行.
carReg hireDate make model custNo custName outletNo outletLoc
--
MS34 0GD 14/5/03 Ford Focus C100 Smith, J 01 Bearsden
Run Code Online (Sandbox Code Playgroud)
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')
Run Code Online (Sandbox Code Playgroud)
您可以使用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');
Run Code Online (Sandbox Code Playgroud)
模型决定make吗?
select distinct model
from reg
order by model;
model
--
Focus
Ka
Sunny
Run Code Online (Sandbox Code Playgroud)
三种不同的模型...
select model, make
from reg
group by model, make
order by model;
model make
--
Focus Ford
Ka Ford
Sunny Nissan
Run Code Online (Sandbox Code Playgroud)
对.每种型号都有一个品牌.根据样本数据,模型 - > make.
carReg,custName - > hireDate?
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
对.carReg和custName的每个组合都有一个hireDate.所以基于样本数据,{carReg,custName} - > hireDate.
好吧,既然你征求了第二个意见,我就给你一个。
第二种意见是第一种意见(CatCall 的)是完全正确的。
样本数据不足以识别/确定数据中的功能依赖性。识别/确定数据中的功能依赖关系需要的是用户需求、数据库旨在支持的业务环境的描述/定义……
只有您的用户才能以某种方式告诉您适用哪些功能依赖项。(不要将此解释为您应该告诉您的用户,他们应该告诉您“适用的 FD 是什么”,因为您的用户通常不知道该术语的含义。但是,适用的 FD 是什么,可以仍然只能从用户提供给您的业务规范中得出。)
(相反,PS 样本数据确实足以证明某个给定的 FD 肯定不适用。但这不是你的问题。)