Предполагая, что речь идет об отношениях 1: 1 между всеми таблицами.
Общее хранилище практически всегда (существенно) дешевле с одной таблицей вместо нескольких таблиц в соотношении 1: 1. Каждая строка имеет 28 байтов служебной информации плюс обычно еще несколько байтов для дополнительного заполнения. И вам нужно хранить столбец PK с каждой таблицей. И иметь отдельный (избыточный) индекс для каждого из этих столбцов ... Размер имеет значение для производительности.
Это даже верно, если многие столбцы имеют значение NULL в большинстве строк, поскольку хранилище NULL очень дешево :
При извлечении всех столбцов одна таблица значительно быстрее, чем 5 таблиц, соединенных вместе. Это также намного проще . Пять таблиц может быть сложно объединить, если не все строки присутствуют во всех таблицах. С WHERE
условиями, предназначенными для одной таблицы, достаточно легко добавлять другие таблицы LEFT JOIN
. Не так тривиально, если у вас есть предикаты в нескольких таблицах ...
Вертикальное разбиение может все еще улучшить производительность определенных запросов. Например, если 90% ваших запросов извлекают те же 5 столбцов из 65 доступных, это будет быстрее, если таблица будет содержать только эти 5 столбцов.
OTOH, вы могли бы обслуживать такие запросы в нескольких выбранных столбцах с «покрывающим» индексом, позволяющим сканировать только по индексу .
Еще один кандидат на вертикальное разбиение: если у вас много обновлений только по нескольким столбцам, тогда как остальные вряд ли когда-либо изменятся. В таком случае разделение строк может быть значительно дешевле, поскольку Postgres пишет новую версию строки для каждого обновления. Существуют исключения для больших значений, хранящихся вне строки («TOASTed»). Больше деталей:
Это действительно зависит от полной ситуации. Если вы сомневаетесь, воспользуйтесь простым решением, состоящим из одной таблицы, особенно если она хорошо отображает реальность: в вашем примере это все атрибуты автомобиля, которые имеют смысл вместе.
VehicleInterior
, другие запросы, относящиеся только к столбцамVehicleTechnical
и т. Д., Или если есть много строк / транспортных средств, которые не имеют абсолютно никакой информации (например),VehicleExtra
так вместо множества строк с множеством нулей в одной таблице у вас есть строки в остальных таблицах и нет строк вVehicleExtra