在项目的后期,我们意识到我们需要使用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);
感谢您的任何建议。 /垫
答案 0 :(得分:1)
您无法通过两个外键进行分区。
如果A是B的父级,B是C的父级,我建议用fk_cb对C进行分区。天气你加入A和C时会获得最大的修剪 - 这是一个有趣的问题,为什么你不为我们进行测试?
问题 - 为什么你在表C中有A的FK不是fk暗示到B?
(我的猜测,从技术上来说这是可能的,但是oracle必须访问表B.我不认为他会这样做所以我认为你不会得到狡猾的。)