Да, я знаю, что нормализация данных должна быть моим приоритетом (как есть).
- У меня есть таблица с 65 столбцами , хранящих данные транспортного средства с колоннами:
used_vehicle
,color
,doors
,mileage
,price
и так далее, в общей сложности 65. - Теперь, я могу разделить это и есть
Vehicle
таблица,VehicleInterior
,VehicleExterior
,VehicleTechnical
,VehicleExtra
(все один к одному с основнойVehicle
таблицей).
Предположим, у меня будет около 5 миллионов строк (транспортных средств).
Вкл. SELECT
С WHERE
предложением: Будет ли производительность при поиске лучше (оба случая проиндексированы хотя бы на IDs
:)
Vehicle
таблица с 65 столбцами илиVehicle
таблица сJOINS
четырьмя другими таблицами (все с 5 миллионами строк), чтобы вернуть все данные, связанные сVehicle
?
(Что касается механизма базы данных, рассмотрим PostgreSQL и / или MySQL).
Действительно цените какие-либо подробные идеи, которые вы могли бы получить из вашего предыдущего опыта?
VehicleInterior
, другие запросы, относящиеся только к столбцамVehicleTechnical
и т. Д., Или если есть много строк / транспортных средств, которые не имеют абсолютно никакой информации (например),VehicleExtra
так вместо множества строк с множеством нулей в одной таблице у вас есть строки в остальных таблицах и нет строк вVehicleExtra
Ответы:
Предполагая, что речь идет об отношениях 1: 1 между всеми таблицами.
Общее хранилище практически всегда (существенно) дешевле с одной таблицей вместо нескольких таблиц в соотношении 1: 1. Каждая строка имеет 28 байтов служебной информации плюс обычно еще несколько байтов для дополнительного заполнения. И вам нужно хранить столбец PK с каждой таблицей. И иметь отдельный (избыточный) индекс для каждого из этих столбцов ... Размер имеет значение для производительности.
Это даже верно, если многие столбцы имеют значение NULL в большинстве строк, поскольку хранилище NULL очень дешево :
При извлечении всех столбцов одна таблица значительно быстрее, чем 5 таблиц, соединенных вместе. Это также намного проще . Пять таблиц может быть сложно объединить, если не все строки присутствуют во всех таблицах. С
WHERE
условиями, предназначенными для одной таблицы, достаточно легко добавлять другие таблицыLEFT JOIN
. Не так тривиально, если у вас есть предикаты в нескольких таблицах ...Вертикальное разбиение может все еще улучшить производительность определенных запросов. Например, если 90% ваших запросов извлекают те же 5 столбцов из 65 доступных, это будет быстрее, если таблица будет содержать только эти 5 столбцов.
OTOH, вы могли бы обслуживать такие запросы в нескольких выбранных столбцах с «покрывающим» индексом, позволяющим сканировать только по индексу .
Еще один кандидат на вертикальное разбиение: если у вас много обновлений только по нескольким столбцам, тогда как остальные вряд ли когда-либо изменятся. В таком случае разделение строк может быть значительно дешевле, поскольку Postgres пишет новую версию строки для каждого обновления. Существуют исключения для больших значений, хранящихся вне строки («TOASTed»). Больше деталей:
Это действительно зависит от полной ситуации. Если вы сомневаетесь, воспользуйтесь простым решением, состоящим из одной таблицы, особенно если она хорошо отображает реальность: в вашем примере это все атрибуты автомобиля, которые имеют смысл вместе.
источник
Выбор на одной таблице всегда должен быть быстрее. Как только вы нашли свой автомобиль, у вас уже есть все детали.
Однако вы теряете эффективность нормализации. Например, если у 1 машины было много моделей с разными вариантами.
Это эталонный дБ всех автомобилей? Или список подержанных автомобилей? Будет ли много примеров одной марки / модели с одинаковыми параметрами?
Изменить: я должен квалифицировать мой ответ как общие rdbms, а не конкретные postgres. Я полагаюсь на подробный ответ @ Erwin, специфичный для postgres
источник