SQL Server表关系实践

4
在这种情况下,推荐采用什么方法:
Customer ..* <-------------> 0..1 Car

有一个客户表和一张车辆表,每个客户可以拥有零个或一个车辆,每个车辆可以链接到多个客户表。

  • 我应该给客户表添加一个可空的 CarID 列吗?还是
  • 我应该创建一个包含 CustomerID 和 CarID 的 Customer_Car_Map 表?

我问这个问题是因为我不知道是否建议使用可空外键?


它是什么类型的业务?正如Vash所提到的,对于注册系统,关系是不同的:客户(1)->(n)汽车。而对于租赁业务,您希望有重复的客户,并保留租赁历史记录,因此您需要:客户(n)->(n)汽车。 - pascal
5个回答

5
只要您确信客户永远不会拥有超过1辆车,就采用您的第一个提案。如果您认为未来可能存在一对多的关系,请现在选择第二个选项以避免将来的麻烦。

1
正是我的思考过程。 - Denis Valeev
1
我仍然倾向于使用多对多关系,并使用触发器来强制执行即时业务规则。如果将来业务规则放宽,工作量会减少。 - OMG Ponies

1

我会选择第一种解决方案,它更简单。使用另一种解决方案,您需要一个键或唯一约束条件来确保每个用户没有多个汽车。如果以后允许这样做,您将需要对任何一种解决方案进行模式更改,因此,请选择简单的方法。


0

如果您确定在实施决策后客户不会拥有太多的汽车,那么您可以将此列CarId添加到客户表中。

如果您按照以下方式操作,每个特定客户都可以拥有任意数量的汽车:

Car: CarId, CustomerId, MakeId, ModelId, Color, PlateNumber, VIN
Customer: CustomerId, LastName, FirstName, MiddleName

0

这是一个平衡的过程,一方面在数据库中不要有任何空值是个好主意。

然而,如果你把这个规则看作是铁律,最终可能会导致一些庞大的联接语句,难以在后期进行维护。

如果你确定它将是一对一的关系,请坚持只使用两个表。


0

在我看来,映射取决于应该呈现的情况。

例如,如果这是一个国家汽车注册表,那么一个人可能拥有多辆汽车,但一辆汽车应该只有一个所有者。对于您的第一个解决方案,良好的表示是当我们想知道某个人所在的汽车组时,因为在这种情况下很难同时处于两个地方。对于一般情况,更好的解决方案是多对多,我会选择这个解决方案的优势,即在不久的将来一个人将能够拥有多辆汽车。

*应该,因为一辆汽车可能有两个所有者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接