Меньше строк и меньше столбцов
В настоящее время я моделирую схему таблицы для PostgreSQL, которая имеет много столбцов и предназначена для хранения большого количества строк. Я не знаю, быстрее ли иметь больше столбцов или разбить данные на большее количество строк.
Схема выглядит следующим образом (сокращенно):
CREATE TABLE child_table (
PRIMARY KEY(id, position),
id bigint REFERENCES parent_table(id) ON DELETE CASCADE,
position integer,
account_id bigint REFERENCES accounts(account_id) ON DELETE CASCADE,
attribute_1 integer,
attribute_2 integer,
attribute_3 integer,
-- about 60 more columns
);
Ровно 10 рядов child_table
максимально связаны с одним рядом parent_table
, Порядок определяется значением в position
который колеблется от 1 до 10. parent_table
предназначен для проведения 650 миллионов строк. С этой схемой я получу 6,5 миллиардов строк child_table
,
Разумно ли это делать? Или лучше смоделировать это так, чтобы у меня было только 650 миллионов строк:
CREATE TABLE child_table (
PRIMARY KEY(id),
id bigint,
parent_id bigint REFERENCES other_table(id) ON DELETE CASCADE,
account_id_1 bigint REFERENCES accounts(account_id) ON DELETE CASCADE,
attribute_1_1 integer,
attribute_1_2 integer,
attribute_1_3 integer,
account_id_2 bigint REFERENCES accounts(account_id) ON DELETE CASCADE,
attribute_2_1 integer,
attribute_2_2 integer,
attribute_2_3 integer,
-- [...]
);
1 ответ
Количество столбцов и строк имеет меньшее значение, чем то, насколько хорошо они проиндексированы. Индексы резко сокращают количество строк, которые нужно искать. В хорошо проиндексированной таблице общее количество строк не имеет значения. Если вы попытаетесь разбить 10 строк на одну строку, индексирование будет намного сложнее. Это также затруднит написание эффективных запросов, использующих эти индексы.
Postgres имеет много разных типов индексов, чтобы охватить много разных типов данных и поисков. Вы даже можете написать свой собственный (хотя это не должно быть необходимым).
Ровно 10 строк child_table максимально связаны с одной строкой parent_table.
Избегайте кодирования бизнес-логики в вашей схеме. Бизнес-логика постоянно меняется, особенно произвольные числа, такие как 10.
Одна вещь, которую вы могли бы рассмотреть, - это уменьшить количество столбцов атрибутов, 60 это много, особенно если они на самом деле названы attribute_1
, attribute_2
и т. д. Вместо этого, если ваши атрибуты не определены должным образом, сохраните их как один столбец JSON с ключами и значениями. Операции JSON в Postgres очень эффективны (при условии, что вы используете jsonb
введите) и обеспечьте хорошую золотую середину между хранилищем ключей / значений и реляционной базой данных.
Точно так же, если какие-либо наборы атрибутов являются простыми списками (например, address1
, address2
, address3
), вы также можете рассмотреть возможность использования массивов Postgres.
Я не могу дать лучший совет, чем это без конкретных деталей.