Мне было интересно, есть ли простое решение для получения наименьшего возможного составного первичного ключа.Сначала я хочу описать структуру базы данных, которую я хочу использовать:
Table 1: Account
accountId serial PRIMARY KEY
username text
Table 2: Email
accountId FOREIGN KEY
accountEmailId tinyint
email text
(accountId, accountEmailId) PRIMARY KEY
Структура базы данных должна обеспечивать возможность того, что учетная запись имеет несколько адресов электронной почты (ограничено номерами tinyint).Я хотел использовать эту архитектуру, потому что она не использует столько места в таблице по сравнению с тем, что я называю «стандартным» дизайном:
Table 2: Email
emailId SERIAL PRIMARY KEY
accountId FOREIGN KEY
email text
Мне не нужно делать запрос напрямую (ГДЕemailId = ..) на основе emailId, потому что я всегда хочу убедиться, что адрес электронной почты связан с определенной учетной записью.Поэтому для меня всегда необходимо проверять и accountId: (ГДЕ emailId = .. AND accountId = ..).Это означает, что мне не нужен emaildId, чтобы быть уникальным.Поскольку я создаю составной первичный ключ accountId и accountEmailId, сам accountEmailId может быть крошечным.Оба вместе создают хороший уникальный идентификатор.
Мой вопрос: хорошая ли это архитектура базы данных или я должен придерживаться «стандартной» (ИЛИ использовать поле массива для всех адресов электронной почты)?Есть ли способ автоматически установить accountEmailId на основе уже используемого accountEmailId?
Например:
Record 1:
accountId **23**
accountEmailId **1**
email mail@example.com
Record 2:
accountId **23**
accountEmailId **2**
email mail2@example.com
Record 3:
accountId **18**
accountEmailId **1**
email mail2@example.com
Следующая запись для accountId 23 должна быть:
accountId 23
accountEmailId 3
email mail2@example.com
и тд ..