0

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

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

这些表(例如假日)仅真正存在以保存有关客户的信息。因此,我是否需要指定一个单独的字段来保存假期的 ID?IE

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

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

问候,詹姆斯。

4

5 回答 5

3

这真的取决于你在做什么。

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

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

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

于 2009-08-24T19:10:16.370 回答
0

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

于 2009-08-24T19:11:28.973 回答
0

如果有一个面向对象的程序与这个数据库相关联,那么每个实体(每一行)都必须有一个唯一的键。

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

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

于 2009-08-24T19:14:25.193 回答
0

上一个答案是正确的,但请记住,每个表中可以有 2 个单独的主键,而“假日”表将具有 CustomerId 的外键。

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

如果只能使用假期创建客户,您甚至可以在客户表中放置假期字段,但这种设计很混乱,不建议这样做

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

于 2009-08-24T19:15:50.853 回答
0

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

这有助于其他人更好地理解关系,尤其是当他们使用工具将模式逆向工程为可视化表示时。

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

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

于 2009-08-24T19:25:04.860 回答