我最近遇到了一个相当复杂的问题,并经过四处寻找,我无法找到解决方案。我在stackoverflow.com上找到了很多次我的问题的答案,所以我决定在这里发帖。带两个外键的2列表。性能/设计问题
因此,我正在为基于Web的项目制作用户/组管理系统,并将所有相关数据存储到PostgreSQL数据库中。此系统依靠三个表:
- USERS(包含主键 “USER_ID”)
- 基(包含主键 “GROUP_ID”)
- GROUP_USERS
两个第一表只需定义站点上的所有用户和所有组,并且最后一个表GROUP_USERS存储每个用户所属的组。它只有两列:
- USER_ID
- GROUP_ID
由于每个用户都可以是多个组的成员,我决定做一个单独的表用于此目的,而不是存储逗号在USERS表中分隔列。
现在,这两列都是外键,我也想让它们成为一个组合主键,因为USER_ID和GROUP_ID的每个组合都必须是唯一的。但是现在我被困在似乎只有很多索引和关系的很小的表中,其中只包含数字。最后,我希望这个表尽可能快,即使包含数万行。磁盘上的大小不应该是一个问题,因为它只是所有的数字,但它感觉非常愚蠢的全尺寸索引引用一个较小的表。
我应该坚持我目前的解决方案,存储逗号分隔值列在用户表或有任何其他的解决办法,我应该知道的。我在寻找的是最好的表现。此表可能(但不太可能或通常)在单个页面加载时被查询数百次。
我不想使用数组列,即使它们被postgreSQL支持。我希望尽可能通用,以便稍后可以切换数据库(如有必要)。
编辑:换句话说,将使用复合主键,并且在一个表中的两个外键仅具有两个列已而不是相反对性能有负面影响,由于所生成的索引的大小?
编辑2:澄清。
谢谢!
我已按照您的建议设置了表格。我相信我很可能会检查用户是否在某个特定组中,而不是相反。 您的回复让我感到更加自信,我现在正以正确的方式进行,所以我正在考虑回答这个问题。 再次谢谢你。 – Emanuel 2010-06-12 22:25:45