Недавно я столкнулся с довольно сложной проблемой, и, оглядев много, я не смог найти решение. Я нашел ответы на свои вопросы много раз, прежде чем на stackoverflow.com, поэтому я решил опубликовать здесь.2-столбец с двумя внешними ключами. Вопрос о производительности/дизайне
Так что я делаю систему Managment пользователя/группы для веб-проекта, и я хранить все соответствующие данные в базу данных PostgreSQL. Эта система опирается на три таблицы:
- ПОЛЬЗОВАТЕЛЕЙ (содержит первичный ключ «user_id»)
- ГРУППЫ (содержит первичный ключ «GROUP_ID»)
- GROUP_USERS
Две первые таблицы просто определите всех пользователей и все группы на сайте, а последняя таблица GROUP_USERS сохранит группы, в которые каждый пользователь входит. Она имеет только два столбца:
- User_ID
- GROUP_ID
Поскольку каждый пользователь может быть членом нескольких групп, я решил сделать отдельную таблицу для этой цели, а не хранить запятую разделенный столбец в таблице USERS.
Теперь оба столбца внешних ключей, и я хочу, чтобы сделать их составной первичный ключ, а это, так как каждая комбинация USER_ID и GROUP_ID должен быть уникальным. Но теперь я застрял в том, что, похоже, много индексов и отношений к очень маленькой таблице, содержащей только числа. В конце концов, я хочу, чтобы эта таблица была как можно быстрее, даже если она содержит десятки тысяч строк. Размер на диске не должен быть проблемой, так как его просто все номера в любом случае, но совершенно глупо иметь полноразмерный индекс, ссылающийся на меньшую таблицу.
Должен ли я придерживаться мое текущее решение, хранить, разделенных запятыми значений в столбце в ПОЛЬЗОВАТЕЛЕЙ столе или есть другое решение, я должен быть в курсе. Я ищу наилучшую производительность. Эта таблица может потенциально (но не обязательно или обычно) запрашиваться несколько сотен раз при загрузке одной страницы.
Я не хочу использовать массив-столбец, даже если они поддерживаются PostGreSQL. Я хочу быть как можно более общим, чтобы в случае необходимости я мог переключать базу данных позже.
EDIT: Другими словами, использование комбинированного первичного ключа и двух внешних ключей в одной таблице с двумя столбцами отрицательно влияет на производительность, а не наоборот, из-за размера сгенерированного индекса?
EDIT2: Разъяснения.
Спасибо!
Я установил таблицы так, как вы предлагали. Я считаю, что, скорее всего, я проверю, есть ли пользователь в данной группе или нет, а не наоборот. Ваш ответ заставляет меня чувствовать себя увереннее, что я делаю это правильно, поэтому я рассматриваю этот вопрос. Спасибо вам снова. – Emanuel