2015-02-19 4 views
0

У меня есть схема с одной таблицей с большинством данных, customer и тремя другими таблицами с ссылками на внешние ключи customer.entry_id, которая является полем BIGSERIAL. Три другие таблицы называются location, devices и urls, где мы храним различные данные, относящиеся к определенной записи в таблице клиентов.Разбиение таблицы Postgres со звездообразной схемой

Я хочу разбить таблицу клиентов на ежемесячные дочерние таблицы и выполнить эту часть; customer будет оставаться как есть, каждый месяц будет иметь таблицу customer_YYYY_MM, которая наследует от основной таблицы с правом CHECK ограничение и индексы будут созданы на каждой отдельной дочерней таблице. Данные будут перемещены в правильные дочерние таблицы, а основная таблица останется пустой.

Мой вопрос касается других трех таблиц, так как я хочу их разбить. Однако у них нет информации о дате (вообще), только ссылка на первичный ключ из главной таблицы. Как настроить ограничения для этих таблиц? Является ли это даже значимым или возможным без указания даты?

Моя логика приложения знает, куда вставить все данные (это довольно тривиально), но я ожидаю, что смогу выполнить простые запросы SELECT, не указав, с каких дочерних таблиц его получить. Поэтому это должно работать так, как вы ожидали бы из несегментированных таблиц:

SELECT l.* 
FROM customer c 
JOIN location l USING entry_id 
WHERE c.date_field > '2015-01-01' 

ответ

0

Я бы разделил их ссылочным ключом. Внешний ключ используется в условии соединения и обычно не может быть изменен таким образом он выполняет следующие важные моменты:

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

Цель при определении разделов должно быть, чтобы как можно больше запросов, как можно извлекать данные из нескольких разделов, в качестве возможных - в идеале один.

  • Partition информация, которая не собирается быть изменена так, что строки не должны постоянно быть выброшены из одной подтаблицы в другую

Это все зависит от размера таблиц слишком конечно. Если размеры остаются маленькими, то нет необходимости разделять.

+0

Проблема заключается в том, что ссылка ключ не имеет определенную границу - я не могу сделать таблицы заранее и потому, что данные не всегда в порядке, я мог бы данные из 31 января, данные с 1 февраля, а затем данные от 31 января, приводящие к нестандартным первичным ключам. По этой причине я предпочел бы разделять по датам, что, скорее всего, произойдет (добавив поле даты в «внешние» таблицы). –

-1

Подробнее о разбиении на разделы here.

Использование просмотров:

create view customer as 
select * from customer_jan_15 union all 
select * from customer_feb_15 union all 
select * from customer_mar_15; 

create view location as 
select * from location_jan_15 union all 
select * from location_feb_15 union all 
select * from location_mar_15; 
Смежные вопросы