【发布时间】:2010-06-12 16:11:55
【问题描述】:
我最近遇到了一个非常复杂的问题,在环顾四周后,我找不到解决方案。我之前在 stackoverflow.com 上多次找到我的问题的答案,所以我决定在这里发帖。
所以我正在为一个基于 Web 的项目创建一个用户/组管理系统,并将所有相关数据存储到一个 postgreSQL 数据库中。该系统依赖于三个表:
- USERS(包含主键“USER_ID”)
- GROUPS(包含主键“GROUP_ID”)
- GROUP_USERS
前两个表仅定义站点上的所有用户和所有组,最后一个表 GROUP_USERS 存储每个用户所属的组。它只有两列:
- USER_ID
- GROUP_ID
由于每个用户都可以是多个组的成员,因此我决定为此创建一个单独的表,而不是在 USERS 表中存储一个逗号分隔的列。
现在,两列都是外键,我也想让它们成为复合主键,因为 USER_ID 和 GROUP_ID 的每个组合都必须是唯一的。但是现在我被一个似乎有很多索引和关系的东西困在一个只包含数字的非常小的表格中。最后,我希望这张表尽可能快,即使包含数万行。磁盘上的大小应该不是问题,因为它只是所有的数字,但是有一个完整的索引来引用一个较小的表感觉很愚蠢。
我应该坚持我当前的解决方案,将逗号分隔的值存储在 USERS 表的列中,还是有任何其他我应该注意的解决方案。我正在寻找的是最好的性能。在单个页面加载时,该表可能(但不太可能或通常)被查询数百次。
我不想使用数组列,即使它们受 postgreSQL 支持。我希望尽可能通用,以便稍后在必要时切换数据库。
编辑:换句话说,由于生成的索引的大小,在一个只有两列的表中使用复合主键和两个外键会对性能产生负面影响,而不是相反?
EDIT2:澄清。
谢谢!
【问题讨论】:
标签: sql database-design primary-key indexing