Нужно ли использовать одинаковый тип данных для внешнего ключа и первичного ключа?

Какой тип данных лучше использовать для создания внешнего ключа во второй таблице, ссылаться ли на поле типа данных serial из первой таблицы, или использовать тип данных integer? Как это может повлиять на работу базы данных? Кроме того, было ли правильным решением использование типа данных serial в первой таблице только для генерации автоматических идентификаторов при вставке новых записей? Могло ли быть более удачное решение, например, использование типа данных integer в первой таблице?
  • 15 января 2024 г. 20:28
Ответы на вопрос 2
Да, при проектировании реляционных баз данных очень важно, чтобы внешние ключи соответствовали типу данных соответствующих первичных ключей. Это позволяет базе данных корректно установить связь между таблицами и обеспечивает целостность данных.

Если говорить о PostgreSQL, который имеет тип данных `SERIAL`, то внешние ключи должны быть того же базового типа, на который указывает `SERIAL`. В случае с PostgreSQL, `SERIAL` на самом деле является сокращением, которое предполагает использование целочисленного типа данных `INTEGER` (обычно беззнакового и автоинкрементного), а также создает последовательность (sequence), которая генерирует уникальные значения для этой колонки.

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

Использование `SERIAL` является правильным решением для автоматической генерации уникальных идентификаторов. Однако, есть и другие варианты, такие как:

- `BIGSERIAL`: если предполагается, что количество записей будет очень большим и может превысить лимит `INTEGER` (2^31-1 для signed integer в PostgreSQL)
- UUID: используется если нужны глобально уникальные идентификаторы, которые уникальны не только в рамках одной таблицы или базы данных, но и вообще любой базы в мире
- `SMALLSERIAL`: для экономии места, если количество записей гарантированно невелико

Таким образом, выбор типа данных для первичного ключа зависит от конкретных требований к приложению и ожидаемого объема данных. По умолчанию использование типа `SERIAL` является достаточным для большинства приложений.

Независимо от выбора типа данных для первичного ключа, важно убедиться, что внешние ключи соответствуют основному типу данных, на который указывает ваш `SERIAL` или другой тип ключа, чтобы обеспечить целостность и правильное функционирование базы данных.
serial - это и есть integer, а типа данных serial вообще не существует. Это просто синтаксический сахар вокруг неявного создания sequence из времён, когда GENERATED ALWAYS AS IDENTITY не было ни в стандарте ни в postgresql. 

Обратно к вопросу: тип данных может не совпадать. Но обычно это ошибка схемы данных, нежели запланированное различие.
Похожие вопросы