函数依赖回答了这样一个问题:“给 X 一个单一的值,我们是否只知道一个 Y 的值?” Eitehr X 或 Y 可能是属性集,而不仅仅是单个属性。阅读此答案时请记住这一点。
每个公司都有不同的(唯一的)地址含义(Street_Address、City、Zip、State)共同构成一个密钥。
根据定义,该键意味着
- Street_Address、城市、邮编、州 -> CEO_Name
- Street_Address、城市、邮编、州 -> Company_Name
这就是候选键 {Street_Address, City, Zip, State} 的所有可能的 FD。四个中的两个——中途回家。
您将 {CEO_Name, Company_name} 标识为函数依赖项的左侧。在这种特殊情况下,您还将其标识为候选键。让我们看一些虚构的数据。
Company_Name CEO_Name Street_Address City State Zip
--
Wibble, Inc. Mary Smith 123 E Main St Anytown PA 00001
Wibble, Inc. Mary Smith 456 S Darn St Sometown WY 10000
该数据描述了两个碰巧同名的不同公司,有两个不同的 CEO 碰巧同名。这符合 FD 的描述,但清楚地表明 {Company_Name, CEO_Name}不是候选键。伪造的数据还清楚地表明 {Company_Name, CEO_Name} 不能是函数依赖的左侧。给定 {Company_Name, CEO_Name} 的单个值,对于任何其他属性,我们没有一个且只有一个值。
消除了作为左侧可能性的 Company_Name 和 CEO_Name 属性后,“制造”另外两个函数依赖项的唯一方法是在候选键 {Street_Address, City, Zip, State} 中找到它们。不是因为候选键有什么特别之处,而是因为这些是唯一剩下的属性。
我的猜测是你的老师希望你说
在美国(在“真实”世界中),“Zip -> City, State”不成立。邮政编码与承运人如何驾驶他们的路线和递送邮件有关;邮政编码与地理无关。一些城市(和邮政编码)跨越州界。相当多的邮政编码跨越一个州内的相邻城市。随着 USPS 削减预算,我预计此类邮政编码的数量会增加。
但在学术界,由于教学原因,这种现实世界的行为常常被忽视。这就是为什么我敢打赌你的老师期待 {Zip -> City, State}。