实现一对多的关系

时间:2014-04-18 14:03:14

标签: sql database

我是编程新手。我设计的数据库有两个表:地址和客户。我不知道如何分配外键。我不知道哪种方式更好用:

方法一:

客户表格列:

的CustomerID 名字 姓 地址ID

地址表列:

AddressId 国家 州 市 AddressLine

方法2

客户表:

客户ID 名字 名字

地址表:

AddressId 顾客ID 国家 市 AddressLine

换句话说,我不知道放置外键的位置。

4 个答案:

答案 0 :(得分:0)

如果每个客户可以拥有多个地址,那么您希望使用方法2,因为Addresses中的每个客户Customer都可以有多个记录。

然而,在我看来,你可能需要一个多对多的关系。如果两个客户共享同一地址会怎样?

您可以通过添加第三个表来完成此操作,例如: CustomerAddresses逻辑上位于CustomerAddresses之间。第三个表将保存来自其他两个表的外键 - CustomerIDAddressID

答案 1 :(得分:0)

在您的第一种方法中,一个客户只能与一个地址相关联,因为它只有一个ID引用一个地址。但没有什么能阻止几个客户拥有相同的地址ID。所以这代表many-customer-to-one-address关系。那不是你想要的。

在你的第二种方法中,关系是相反的。每个地址都与一个客户相关联,多个地址可以与同一个客户相关联,这是一个one-customer-to-many-addresses关系。

在sql中,要检索与客户关联的地址,您可以执行以下操作:

select * from address where customer_id = '<some customer_id>'

答案 2 :(得分:0)

如果您尝试实现一对多,那么建议的方法是将除了一个表之外的表的主键作为外键放入许多表中。

例如:如果一个客户有很多地址,地址有一个客户。所以你必须将costumerId作为外键放在地址表中。

如果一个地址可以有许多客户,而一个客户有一个地址。因此,您必须将AddressNumber作为外键放在客户的表中。

祝你好运

答案 3 :(得分:0)

我会指出你可能实际上有多对多的关系。一个地址可以有多个客户,一个客户可以有多个地址。在这种情况下,您使用Join表来建模包含addressid和customerid的关系,而不是其他任何内容。这将具有这两个字段的连接PK以确保唯一性。