我有一个非常基本的问题让我感到困惑。
我有两个表,一个是表格页面,另一个是菜单。我想知道,使用另一个表进行映射有什么好处?以下是我正在考虑的两个实现:
我看到的唯一区别是我搜索的方式。 例如,在第一个实现中:
a)如果我想要特定菜单的所有页面,我将查询特定菜单名称的所有page_ids,并且我将使用表格的id加入它们(这就是为什么我认为这个实现是更慢)。
b)如果我想要特定页面的所有菜单,我将搜索具有特定页面的page_id的所有菜单。
在第二个实现中更典型和直接(并且具有更多连接)。
我认为第二个实现是正确的,因为它更快(我想,因为它仅在ID之间进行查询而不是在菜单名称中搜索,如上所述)))。
或者还有其他特殊原因吗?这两个设计在它们可以完成的事情上是否相同,或者在第一个设计中是否存在任何其他限制,我总是应该选择第二个设计?
答案 0 :(得分:5)
这两个选项并不相同;后者是在多对多设计中使用的正确选择。使用连接表意味着您可以有许多页面(A,B,C)和许多菜单(1,2,3),您可以将一组菜单与一组页面相关联(产生A1,A2,A3,B1) ,B2,B3,C1,C2,C3)。
第一种设计假定任何给定菜单只能有1页与之关联。菜单1只能与一个页面相关联(它是A,B还是C?)。要将同一菜单与多个页面相关联,您需要在菜单表中为每个关联页面添加一行。
答案 1 :(得分:1)
您的第一个实现是1对多,而不是多对多。你的第二个实现是有效载荷的多对多(注意:它通常不需要id)。
多对多意味着您可以将n个项目映射到n个其他项目。 1到多意味着您只有一个项目映射到n个项目。
如果您需要多对多,则只能在第二次实施中完成。如果你需要1对多,那就是第一种方式。
答案 2 :(得分:1)
页面和菜单具有多对多关系。问题是,除了关系的简单事实之外,是否有关于您需要跟踪的关系的任何信息?
例如,如果您出版杂志,您可能会有一个M2M杂志关系 - 人们可以订阅多个杂志,而杂志可能有多个订阅者。但是有关于您想要跟踪的杂志和人的交集的信息 - 开始日期,到期日期等。使用交叉表为您提供放置这些的位置。
我已经做了一段时间的这种事情了,我可以想到我有一个M2M的情况,其中交叉点除了交叉点的存在之外没有任何记录,因为系统是最初实施。然而,在几乎所有情况下,用户后来都要求进行增强,这需要有关该关系的其他信息。
所以我总是使用交叉点。