【发布时间】:2010-11-27 02:59:23
【问题描述】:
考虑一个匹配客户端和服务的模型。客户在不同时间既可以是服务的提供者,也可以是服务的消费者。客户可能是个人或团体(公司),后者有多个联系人。联系人可能有多个地址、电话、电子邮件。其中一些关系将是一对一的(例如,服务提供者),但大多数将是一对多或多对多的(公司的多个联系人将具有相同的地址)。
在此模型中,通常会存在多个关联表,例如 client_contact、contract_addr、contact_phone、contact_email、service_provider、service_consumer 等。
假设您针对给定服务的消费者发出简单的联系信息查询。除了包含数据的六个实体表之外,连接还将引用五个关联表。当然,这种查询没有什么特别有趣的地方——我们每天都在做。
我突然想到:为什么不使用一个“主”关联表来保存所有关联?除了两个 PK 之外,它还需要此主表具有“关联类型”,并且所有 PK 必须具有相同的类型(整数、GUID 等)。
一方面,查询会变得更加复杂,因为每个连接都需要指定类型和 PK。另一方面,所有连接都将访问同一个表,并且通过适当的索引和缓存性能可以显着提高。
我认为可能存在描述这种方法的模式(或反模式),但没有在网上找到任何东西。有人试过吗?如果是这样,它会扩展吗?
如果您能提供任何参考资料,我们将不胜感激。
【问题讨论】:
-
收藏和投票,因为我有直觉认为这是一个非常糟糕的主意,但我无法确定确切的(技术)原因。有人可能会争辩说,您非常非常容易受到这种设置的锁定问题的影响,并且如果需要,您不能真正将元数据添加到您的多对多关系中。另外,我假设适当的 RDBMS 已针对处理您在案例中提到的情况进行了优化。
-
这是我的想法,这就是为什么我很惊讶没有发现它被记录为一个非常糟糕的主意,至少在会有很多 CRUD 的地方。我怀疑在低 TX 量的情况下,查询可以在低隔离的情况下存在,它可能是可行的。我假设单个“主”表可能会产生更好的优化,但这可能取决于特定的 RDBMS。比较计划(与“master”与 reguar assoc 的)将是有益的。
-
我认为类型将成为键或索引的高阶部分,因此连接将类似于:在 Type = 'Type1' AND PK1 = PK2?在这种情况下性能真的会更好吗?
标签: database-design design-patterns anti-patterns associative-table