@AnjeyTsibylskij

[PostgreSQL] Какой тип данных выбрать?

Есть простая задача, в таблице лежат данные для разных типов сущностей. К примеру, есть таблица комментариев, и в ней хранятся комментарии для постов, фотографий, видео.

В таблице есть два поля, которые отвечают за сущность entity_id – это id сущности, и entity_type – тип сущности (пост, фото, видео).

Поле entity_id – само собой int (bigint NOT NULL)
А вот поле entity_type вызывает у меня сомнения. Сейчас я сделал их типа enum (character varying(255) NOT NULL) CONSTRAINT comments_entity_type_check CHECK (entity_type::text = ANY (ARRAY['post'::character varying, 'image'::character varying, 'video'::character varying]::text[]))

Но сомневаюсь в производительности такого подхода. Не лучше сделать entity_type -
small int? Как бы с int и проще индекс строить, а с другой стороны enum ограничивает возможные варианты.

Если ли большой выигрыш в производительности между enum и small int?
  • Вопрос задан
  • 946 просмотров
Пригласить эксперта
Ответы на вопрос 4
terrier
@terrier
Какой-то у вас не такой enum. enum здового человека такой:
CREATE TYPE entity_enum_type as ENUM ('post', 'image', 'video');

Ну и соответсвенно в таблице enum_type будет типа entity_enum_type .
https://www.postgresql.org/docs/9.6/static/datatyp...
Вот такой enum занимает на диске 4 байта на значение, нагляден и весьма эффективен.
Ответ написан
@koronabora
Человек
Сделайте таблицу типов сущности. У каждого типа сущности будет свой id. Далее в таблице объектов давайте на номер типа сущности.
Ответ написан
romy4
@romy4
Exception handler
> Если ли большой выигрыш в производительности между enum и small int?
Есть выигрыш в логике от подхода с enum, тип удобно использовать как сущность в функциях.
Ответ написан
Комментировать
@lega
Ещё можно объеденить entity_id и entity_type в одну колонку (bigint),
если нужно джойнить, то можно использовать уникальные ид по всей базе (префиксные ид),
так же будет удобно ссылаться на объекты из других мест просто одним числом, без указания типа, т.к. тип зашит в ид.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы