K1n*_*sia 6 sql database database-design foreign-keys foreign-key-relationship
我是数据库的新手,我是来自Java的数据抽象新手.为了自学,我正在开发一个在线应用程序,除其他外,它将允许用户成为多个组的一部分.
草绘数据库,似乎我必须有类似"会员"表的东西:
UserID|GroupID
------|-------
1 | 1
1 | 2
2 | 1
2 | 3
2 | 5
Run Code Online (Sandbox Code Playgroud)
我对此有点担心,因为它只有两个外键,只能用于链接两个对象.这种关系的标准做法是什么?如果没有,首选方法是什么?
同样,我对数据库很新.我的书没有提到这种情况,所以如果有一些反映这个功能的关键词我忽略了......
谢谢.
这是表示多对多关系的标准方式,被称为"联结表"(或"链接表").
您已经注意到UserID和GroupID都是引用其他表的外键.但是当涉及到键(而不是外键)时,您有以下几种选择:
{UserID, GroupID}
.除了确保同一用户不能多次连接到同一组之外,它还有助于有效搜索给定用户的组.由于UserID位于索引的前沿(DBMS在密钥下自动创建),因此与同一UserID关联的所有GroupID值都在索引B树中的连续范围内,因此获取给定用户的组可以是由DBMS通过简单的索引范围扫描完成.{GroupID, UserID}
.相同的字段,相反的顺序.这有助于快速获得给定组的用户(即,与(1)相比,在相反的"方向"查询).{UserID, GroupID}
和(唯一)索引{GroupID, UserID}
(或反之亦然).如果您需要在两个方向上进行查询,这非常有用:分别获取给定用户的组和获取给定组的用户.{UserGroupID}
).如果您具有引用联结表的"子"表,并且希望简化通过外键迁移到它们的键的大小,则这可能很有用.如果您的ORM工具不能很好地使用复合键,那么它也可能很有用.如果您决定使用选项(1)或(2),请对表进行集群(如果您的DBMS支持它).由于您只进行索引范围扫描,因此根本不需要存在表堆.您甚至应该考虑(3)的聚类,因为两个索引都是覆盖的,因此不存在双重查找的危险.