如何在具有2个外键的表中使用Oracle“按引用分区”?

时间:2013-05-20 14:25:40

标签: oracle partitioning

在项目的后期,我们意识到我们需要使用Oracle(11G)分区来实现数据的性能和管理。 我们有一个具有大量@OneToMany和@OneToOne关系的分层实体模型,并且一些实体是从2个或更多其他实体引用的。 我们希望在“父/根”实体上使用“按范围划分”(月),在所有子实体上使用“按引用划分”。一年后,我们将最早的月份分区移动到归档数据库。这是一个24-7系统,因此数据不断增长。

来自Oracle文档:“引用分区允许通过引用约束对两个彼此相关的表进行分区。分区键通过现有的父子关系解析,由启用和活动的主键和外键约束强制执行。 “

当有2个外键并且其中一个可以为空时,是否可以在表上使用“按引用分区”? (根据我的阅读,您必须在“按引用分区”的外键上使用“not null”)

一个用来说明问题的小例子:

A - parent entity
B - child entity to A
C - child entity to A or B

create table 
A (
   id number primary key,
   adate date
)
partition by range (adate) (
   partition p1 values less than (to_date('20130501','yyyymmdd')),
   partition p2 values less than (to_date('20130601','yyyymmdd')),
   partition pm values less than (maxvalue)
);

create table 
B (
   id number primary key,
   text varchar2(5),
   a_id number not null,
   constraint fk_ba foreign key (a_id) references A
)
partition by reference(fk_ba);

create table 
C (
   id number primary key,
   text varchar2(5),
   a_id number not null, -- NOT POSSIBLE as a_id or b_id will be null..
   b_id number not null, -- NOT POSSIBLE as a_id or b_id will be null..
   constraint fk_ca foreign key (a_id) references A,
   constraint fk_cb foreign key (b_id) references B
)
partition by reference(fk_ca)
partition by reference(fk_cb);

感谢您的任何建议。 /垫

1 个答案:

答案 0 :(得分:1)

您无法通过两个外键进行分区。

如果A是B的父级,B是C的父级,我建议用fk_cb对C进行分区。天气你加入A和C时会获得最大的修剪 - 这是一个有趣的问题,为什么你不为我们进行测试?

问题 - 为什么你在表C中有A的FK不是fk暗示到B?

(我的猜测,从技术上来说这是可能的,但是oracle必须访问表B.我不认为他会这样做所以我认为你不会得到狡猾的。)