Postgresql разбиение и FK - PullRequest
       17

Postgresql разбиение и FK

2 голосов
/ 07 марта 2012

В настоящее время есть 2 таблицы базы данных sessionaccounting и sessionaccountingdailysplit.

В каждой из этих таблиц есть данные.Sessionaccountingdailysplit имеет ограничение FK для sessionaccounting.

Мне нужно разделить обе таблицы так, чтобы окончательная структура выглядела следующим образом:

sessionaccounting
sessionaccounting2007
sessionaccounting2008
sessionaccounting2009
sessionaccounting2010
sessionaccounting2011
sessionaccounting2012
sessionaccountingdailysplit
sessionaccountingdailysplit2009
sessionaccountingdailysplit2010
sessionaccountingdailysplit2011
sessionaccountingdailysplit2012

Причина sessionaccountingdailysplit начинается в 2009 году, когда таблицабыл создан

Процесс, которому я следовал для выполнения вышеизложенного, выглядит следующим образом:

  1. Я создал разделы для сеансового учета на основе времени начала
  2. Я создал разделы дляsessionaccountingdailysplit на основе даты
  3. Я создал ограничение CONSTRAINT sessionaccountingdailysplit2009_sessionaccountingid_fkey FOREIGN KEY (sessionaccountingid) REFERENCES sessionaccounting2009 (id) MATCH SIMPLE

Вышеуказанное выглядит так, как будто оно будет работать, но из-за характера работы dailysplit его нет.Как работает dailysplit?Он берет время начала и время окончания сеанса и учитывает данные и разделяет их на отдельные строки.

Так что, если у меня был сеанс, который начинается с 2009-01-01 23:30:00 до 2009-01-03 13:00:00, dailysplit создает 3 строки с каждой датой в ней, поэтому 2009-01-01, 2009-01-02, 2009-01-03.

Теперь с указанным выше FK это будет работать, потому что я знаю разделенный год, в который должны войти строки.Проблема возникает, когда у меня следующий сценарий с 2009-12-31 по 2010-01-01.

Так как строка сеанса с доступом находится в sessionaccounting2009, FK работает так, как sessionaccountingdailysplit2009 имеет FK в sessionaccounting2009, но когда postgres пытается вставить новую строку в sessionaccountingdailysplit2010, он не может найти FK в sessionaccounting2010 как в sessionaccounting2009.

Мне нужна помощь в создании правила или триггера, который будет вставлять данные в sessionaccountingdailysplit2009, даже если дата строк равна 2010. Поэтому вставьте в таблицу sessionaccountingdailysplitгде она соответствует таблице, в которой находится строка сеанса, чтобы не нарушать ограничения fk.

Возможно ли это?

Визуальный пример

sessionaccounting2009
1, starttime:2009-12-31, endtime:2010

Что я хочу

sessionaccountingdailysplit2009
1, date:2009-12-31
2, date:2010-01-01

Что я получаю (это нарушает FK в 2010 году)

sessionaccountingdailysplit2009
1, date:2009-12-31

sessionaccountingdailysplit2010
1, date:2010-01-01

Правило, которое я использую при вставке данных, но вызывает проблему

CREATE OR REPLACE RULE sessionaccountingdailysplit2009_insert AS
   ON INSERT TO sessionaccountingdailysplit
   WHERE new.date >= '2009-01-01 00:00:00+02'::timestamp with time zone
     AND new.date < '2010-01-01 00:00:00+02'::timestamp with time zone
   DO INSTEAD
   INSERT INTO sessionaccountingdailysplit2009
     (id, sessionaccountingid, date, inputoctets
     , outputoctets, privcreditsused, usercreditsused) 
   VALUES (new.id, new.sessionaccountingid, new.date, new.inputoctets
          ,new.outputoctets, new.privcreditsused, new.usercreditsused
          )
   ;

Любойпомочь разобраться в этом?

1 Ответ

1 голос
/ 08 марта 2012

Я понимаю, что sessionaccountingYEAR таблицы - это дети sessionaccounting.Если это так, тогда вы можете просто ссылаться на родительскую таблицу вместо ссылки на соответствующую таблицу YEAR:

CONSTRAINT sessionaccountingdailysplit2009_sessionaccountingid_fkey 
FOREIGN KEY (sessionaccountingid) 
REFERENCES sessionaccounting (id) 
MATCH SIMPLE

Если sessionaccountingYEAR не являются потомками sessionaccounting, не могли бы вы объяснить, почему это не так?Т они?

...