Можно ли создать раздел списка в PostgreSQL на основе объединения ключа списка разделов?
Рассмотрим следующие таблицы
Table "public.Foo"
Column | Type |
------------------+-----------------------------+
foo_id | integer | PK
bar_id | integer | FK to bars
....
Table "public.Bar"
Column | Type |
------------------+-----------------------------+
bar_id | integer | PK
....
Table "public.very_big"
Column | Type |
------------------+-----------------------------+
foo_id | integer
....
Бар отображается в Foo таким образом, чтобы в баре было много Foo s. Есть < 50 баров, каждый из которых имеет сотни Foo s. Затем у меня есть отдельная таблица, которая довольно большая, > 200 миллионов строк, которая ссылается на Foo s (среди других таблиц), создавая большой составной первичный ключ, что приводит к большому размеру таблицы.
В идеальном мире я хотел бы разделить very_big на bar_id, не добавляя столбец для bar_id, просто используя ссылку foo_id. Это дало бы хорошее количество разделов, порядка 1-50, в то время как разделение на foo_id напрямую составило бы тысячи, что рекомендуется в документации.
В некотором смысле этот идеальный мир представляет собой раздел списка, основанный на объединении. Судя по документации, мне кажется, что это невозможно. Это также поднимает некоторые сложные вопросы, например, что происходит с данными в одном разделе, если отношение foo-bar изменяется таким образом, что данные должны будут перемещать разделы? Из-за этого это кажется невозможным / не имеет смысла.
Одна альтернатива состоит в том, чтобы использовать определенный вручную раздел списка. Это приведет к тому, что каждый диапазон, определенный вручную, будет иметь порядка 300-500 значений. Некоторыми минусами этого подхода являются: 1) если ссылки изменяются между foo и bar, как обсуждалось выше, раздел полностью разрушен (я не предвижу этого, иначе я бы не стал рассматривать это решение, но это все же обратная сторона) 2) Возможно, что большие, несмежные определения разделов списка из 300-500 значений будут иметь низкую производительность для планировщика запросов postgres. 3) Вновь добавленные Foo s не будут иметь места, чтобы перейти на основе предварительно определенных списков, так как они не будут добавлены в определение раздела.
Еще одна альтернатива - это взять ее и добавить столбец для bar_id к very_big, но это ненормально и избыточно.
Возможен ли раздел списка на основе объединения? (Думаю, нет)
Если нет, то есть ли последствия для производительности несмежных разделов на основе списка порядка 100+? (Не уверен, но здесь есть другие расходы)
Существуют ли другие решения этой проблемы, которые я могу пропустить? Я планирую перейти к "денормализованному" решению на данный момент и добавить bar_id к very_big и определить раздел на основе этого
Спасибо