2

我对上一篇文章有​​点困惑,所以我找到了一个很好的例子,它应该可以解决问题。在此处输入图像描述

hiredDate 和 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 吗?或者我们是否考虑了可以添加的可能值?

4

4 回答 4

7

乍看上去 。. .

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 决定了租用日期。hiredDate 确定 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

是的。每个型号都有一个。根据样本数据,模型 -> 制造。

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} ->hireDate。

于 2011-04-25T19:45:26.917 回答
4

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

第二个意见是第一个(CatCall's)是完全正确的。

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

只有您的用户才能以一种或另一种方式告诉您应用了哪些功能依赖项。(不要将此解释为您应该告诉用户他们应该告诉您“适用的 FD 是什么”,因为您的用户通常不知道该术语的含义。但是,适用的 FD 是什么,可以仍然来自用户提供给您的业务规范。)

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

于 2011-04-25T21:08:35.257 回答
1

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

此外,如果我们被赋予一个值并且我们被告知它满足的 FD 是可以容纳它的变量满足的 FD,那么通过该假设,变量的 FD 就是该值的 FD。(这有时被称为变量的“代表数据”。)但是如果我们只是给定一个变量可能出现的值,那么我们只知道

  • 包含在值中的 FD也不包含在变量中
  • 两者都持有的琐碎
    FD (形式为 S -> S 的子集的 FD)
    (无论值如何,都必须持有,仅基于属性)
    (值和变量必须相同)

另请参阅此答案

于 2018-03-25T10:57:39.253 回答
0

这是我对人际关系的尝试:

在此处输入图像描述

于 2011-04-27T11:24:27.970 回答