2-column table with two foreign keys. Performance/design question.

Posted by Emanuel on Stack Overflow See other posts from Stack Overflow or by Emanuel
Published on 2010-06-12T16:11:55Z Indexed on 2010/06/12 16:32 UTC
Read the original article Hit count: 170

Filed under:
|
|
|

Hello everyone!

I recently ran into a quite complex problem and after looking around a lot I couldn't find a solution to it. I've found answers to my questions many times before on stackoverflow.com, so I decided to post here.

So I'm making a user/group managment system for a web-based project, and I'm storing all related data into a postgreSQL database. This system relies on three tables:

  1. USERS
  2. GROUPS
  3. GROUP_USERS

The two first tables simply define all the users and all the groups on the site, and the last table, GROUP_USERS, stores the groups every user is part of. It only has two columns:

  1. USER_ID
  2. GROUP_ID

Since every user can be a member of several groups, I decided to make a separate table for this purpose, rather than storing a comma separated column in the USERS-table.

Now, both columns are foreign keys, and I want to make them both primary keys as well, this since each combination of USER_ID and GROUP_ID has to be unique, and if I give them the constraint UNIQUE pgAdmin tells me that each table should have at least one Primary key. But now I am stuck with what seems to be a lot of indexes and relations to a very small table only containing numbers. In the end, I want this table to be as fast as possible, even if containing tens of thousands of rows. Size on disk shouldn't be a problem since its just all numbers anyway, but it feels quite stupid to have a full-sized index refering to a smaller table.

Should I stick with my current solution, store comma-separated values in a column in the USERS-table or is there any other solution I should be aware of.

PS. I don't want to use an array-column, even if they are supported by postgreSQL. I want to be as generic as possible so I can switch database later on, if necessary.

EDIT: I other words, will using a compound primary key and two foreign keys in one table with only two columns have a negative impact on performance rather than the opposite due to the size of the generated index?

Thank you!

© Stack Overflow or respective owner

Related posts about sql

Related posts about primary-key