小编Nic*_*las的帖子

表关系 - 一对多(多)

我知道标题可能看起来令人困惑,但我还没有找到这个设计模式的可靠答案。假设我想创建一个 Employee 表并为每个员工设置多个地址。因此,这将需要您的标准一对多关系。您显然希望 Address Type 列跟踪您为每个员工存储的地址类型。

在此处输入图片说明

现在对于我的问题,我希望每个员工的每个地址类型只允许一个地址。这打破了一对多模型,因为我想在数据库级别强制执行此限制。我看到了几种处理此问题的方法,但我坚持根据最佳实践和功能选择哪种方法最好。

下面是删除了 AddressId 的相同表,因为没有用处,取而代之的是 EmployeeId 和 AddressTypeId 的复合主键。这将强制每个员工使用一种地址类型,允许每个员工有多个地址,但每种类型只有一个。

在此处输入图片说明

为了在地址表上强制执行密钥限制,这可能会正常工作。但这似乎更像是一对一/无关系,这可能会导致我无法使用这种表设计的 ORM 问题。(如果我错了,请纠正我。)

下面是我所知道的典型桥接表(多对多对多)关系。与上表一样,它处理我想要强制执行的地址类型限制,同时还使每个表结构良好并具有自己的单一主键。这种设计适用于大多数 ORM,并且可能是正确的方法,但它似乎有点矫枉过正,而且似乎打破了多对多关系的含义,因为永远不会有多个员工的地址。

在此处输入图片说明

尽管桥表关系设计很复杂,但它是否是最好的使用方法?除了 ORM 可能出现的问题之外,复合键关系是否会导致我没有看到的问题?还是我完全疯了,以错误的方式看待这一切,实际上有更好的方法来处理这种情况?

database-design sql-server

5
推荐指数
1
解决办法
2084
查看次数

标签 统计

database-design ×1

sql-server ×1