Sql 完全由外键组成的表?

Sql 完全由外键组成的表?,sql,database,database-design,foreign-keys,foreign-key-relationship,Sql,Database,Database Design,Foreign Keys,Foreign Key Relationship,我对数据库非常陌生,我是数据抽象的新手,来自Java。为了教会自己,我正在开发一款在线应用程序,它将允许用户加入多个群组 勾勒出数据库,似乎我必须有一个类似“成员”表的东西: 我对此有点担心,因为它只有两个外键,并且只用于链接两个对象。这是这种关系的标准做法吗?如果不是,首选的方法是什么 再说一次,我对数据库很陌生。我的书没有提到这种情况,所以如果有一些关键字反映了我忽略的功能 谢谢。这种设置非常常见,也非常好 我还将在自动递增列上添加一个主键索引,并确保在userid和groupid上有索引

我对数据库非常陌生,我是数据抽象的新手,来自Java。为了教会自己,我正在开发一款在线应用程序,它将允许用户加入多个群组

勾勒出数据库,似乎我必须有一个类似“成员”表的东西:

我对此有点担心,因为它只有两个外键,并且只用于链接两个对象。这是这种关系的标准做法吗?如果不是,首选的方法是什么

再说一次,我对数据库很陌生。我的书没有提到这种情况,所以如果有一些关键字反映了我忽略的功能


谢谢。

这种设置非常常见,也非常好

我还将在自动递增列上添加一个主键索引,并确保在userid和groupid上有索引

如果您知道应用程序将如何使用数据,并且可以利用复合索引(又称复合索引,又称多列索引,又称…),那么就不要在userid和groupid上使用单列索引

您可以在此处了解有关多列索引的更多信息:


这是表示多对多关系的标准方法,称为“连接表”(或“链接表”)

您已经注意到UserID和GroupID都是引用其他表的外键。但对于关键点(不是外键),您有几个选项:

  • {UserID,GroupID}
    上创建一个复合(主)键。除了确保同一用户不能多次连接到同一组之外,它还可以帮助高效地搜索给定用户的组。由于UserID位于索引的前沿(DBMS在该键下自动创建),因此与同一UserID相关联的所有GroupID值都在索引内的连续范围内,因此DBMS可以通过简单的索引范围扫描来获取给定用户的组
  • {GroupID,UserID}
    上创建一个复合(主)键。相同的字段,顺序相反。这有助于快速获取给定组的用户(即,与(1)相反的“方向”进行查询)
  • {UserID,GroupID}
    上做一个键,并在
    {GroupID,UserID}
    上做一个(唯一)索引(反之亦然)。如果您需要在两个方向上进行查询:分别获取给定用户的组和给定组的用户,这将非常有用
  • 执行上述第(1)或(2)或(3)项,但生成代理键(例如
    {UserGroupID}
    )。如果您有引用连接表的“子”表,并且希望简化通过外键迁移到它们的键的大小,那么这可能很有用。如果您的ORM工具不能很好地处理复合键,那么它也可能很有用

  • 如果您决定使用选项(1)或(2),表(如果您的DBMS支持它)。由于您只是在执行索引范围扫描,因此根本不需要存在表堆。你甚至应该考虑聚类(3),因为这两个索引都没有双查找的危险。

    YEP,非常常见。但是您应该(a)将PK设置为UserID+GroupID(因此您不能创建重复的组合),或者(b)为UserID+GroupID创建一个唯一的索引(做相同的事情),并添加一个UserGroupID列作为PK.as@paul.abbott.wa.us提到这是非常常见的,通常被称为查找表。如果尝试搜索查找表上的信息,您可能会获得更多信息。K1nesthesia建议在userid和groupid上使用唯一键。这是个好主意。@roy请澄清。一对多的表只有ID是正常的吗?@roy这是不正常的,但在某些情况下可能需要它(例如,FK大部分为空或很少被查询)。这样的表只有一个FK上有一个键(与多对多表中的两个FK相反)
    UserID|GroupID
    ------|-------
      1   |   1
      1   |   2
      2   |   1
      2   |   3
      2   |   5