我是否需要为每个表定义新的主键字段?

时间:2009-08-24 19:07:49

标签: database database-design database-relations

我有一些数据库表,实际上只需要一个引用另一个表的唯一ID,例如

Customer      Holiday
********      *******
ID (PK)  ---> CustomerID (PK)
Forename      From
Surname       To
....

这些表格如Holiday,仅用于保存有关客户的信息。因此,我是否需要指定一个单独的字段来保存假期的ID?即。

Holiday
*******
ID (PK)
CustomerID (FK)
...

或者,在这种情况下,我可以将CustomerID设置为表中的主键吗?

此致 詹姆斯。

5 个答案:

答案 0 :(得分:3)

这实际上取决于你在做什么。

如果每个客户只有一个假期,那么是的,您可以将customerid作为主键。

如果每个客户可以有多个假期,那么您可以添加新的id列,使其成为主要假期。这允许您为每个客户选择假期,并按其唯一ID选择单个记录。

此外,如果每个客户只有1个假期,我只会将假日信息添加到表中,因为一对一的关系通常是不必要的。

答案 1 :(得分:0)

如果我正确理解了您的问题,那么只有从不是该表中该客户的任何其他假期时,您才能将Customer表用作Holiday中的主键。换句话说,一个客户的两个假期使用客户ID作为主键。

答案 2 :(得分:0)

如果有与此数据库关联的面向对象程序,则每个实体(每行)必须具有唯一键。

您的第二个设计确保可以使用简单的对象关系映射由OO应用程序唯一标识和处理Holiday的每个实例。

通常,最好确保数据库中的每个实体都具有唯一的,不可变的,系统分配的(“代理”)密钥。其他“自然”键可以具有唯一索引,约束等,以适应业务逻辑。

答案 3 :(得分:0)

以前的回答是正确的,但是请记住,每个表中可以有2个单独的主键,而“holiday”表将拥有CustomerId的外键。

然后,您可以在代码中管理客户的假期分配,以确保只能为客户分配一个假期,但这会带来问题的并发性,即2个人在客户处添加假期同一时间最有可能导致客户有2个假期。

如果客户只能用假期创建,您甚至可以将假日字段放在客户表中,但这种设计很混乱,并且没有真正建议

再一次,问题2中的选项仍然是最好的方式,只是给你选择。

答案 4 :(得分:0)

实际上,我发现每个表都应该有一个唯一的主键来标识这些表中的记录。应明确声明与其他表的所有关系。

这有助于其他人更好地理解这些关系,特别是如果他们使用工具将模式反向设计为可视化表示。

此外,它还为您在未来扩展解决方案提供了更大的灵活性。您现在每个客户可能只有一个假期,但如果您将客户ID作为主键,则更难以更改。

如果要在假期表中强制要求客户的唯一性,请在该外键上创建唯一索引。实际上,这可以在查询客户ID时提高性能(尽管我猜你不会看到足够的记录来注意这一改进)。