Получить наименьший возможный составной первичный ключ (Postgresql) - PullRequest
0 голосов
/ 07 февраля 2019

Мне было интересно, есть ли простое решение для получения наименьшего возможного составного первичного ключа.Сначала я хочу описать структуру базы данных, которую я хочу использовать:

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

и тд ..

1 Ответ

0 голосов
/ 08 февраля 2019

Нет ничего принципиально неправильного в вашем дизайне, если сохранение двух байтов на строку таблицы является вашим главным приоритетом.

Но два байта - это очень мало, и вам придется позаботиться об определении таблицы,иначе вы можете легко потерять два байта (и больше) на заполнение , потому что многие типы данных выровнены по границам четырех или восьми байтов.

Самый большой недостаток, который я вижу, состоит в том, чтоВы не можете заполнить emailaccountid автоматически - вы должны получить все электронные письма, уже определенные для этой учетной записи, чтобы найти бесплатный номер.Кроме того, вы можете «вслепую» вставить значения, отследить нарушения первичного ключа и повторить попытку с другим значением.И то и другое кажется не очень привлекательным.

Лично мне было бы напрасно тратить два байта.

...