主键选择 - 多值属性

时间:2013-10-23 08:45:13

标签: sql relational-database primary-key

我正在尝试确定多值属性的主键选择,并且有一个简单的问题:

鉴于:

Customer (cid, name, address, town, post code, email)
Customer_Number(cid, phone_number)

其中cid是客户的主键,我可以将Customer_Number关系的主键定义为“phone_number”,因为这是唯一标识每条记录的最小属性。我假设没有两个客户可以拥有相同的电话号码。

我不确定这一点,因为我觉得应该也包括cid。

非常感谢任何建议。

由于

3 个答案:

答案 0 :(得分:0)

  

我假设没有两个客户可以拥有相同的电话号码。

即使这是正确的(如果您的客户提供相同的号码,例如同一家庭,同一公司部门,则可能不是这种情况),但这并不妨碍用户输入错误。

“替代”与“非代理”关键讨论可能是一个漫长而激烈的讨论,但一个好的经验法则是不使用由最终用户分配或输入的列作为人为错误然后发挥作用。就个人而言,我是代理键的忠实粉丝,几乎总是使用它们,但你的需求可能会另有规定。

你的实际问题与代理或其他问题关系不大,而且与FK关系有关,所以请将此视为旁注。

答案 1 :(得分:0)

CustomerID必须作为Customer_Number表中的外键保留。我想你可以在该表中创建一个名为Customer_Number_ID的新列,因为电话号码不一定是唯一标识符。话虽如此,您可能有1个客户有多个电话号码,因此您可能需要添加该列,以便在需要时可以将两者(Customer_number_id和CustomerID)的组合用作复合键。

答案 2 :(得分:0)

将类似cnid列的内容添加为Customer_number表,并使用cid作为FK。