【问题标题】:How to use Oracle "partitioning by reference" in tables with 2 foreign keys?如何在具有 2 个外键的表中使用 Oracle“按引用分区”?
【发布时间】:2013-05-15 03:19:56
【问题描述】:

在项目的后期,我们意识到我们需要使用 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);

感谢您的任何建议。 /垫子

【问题讨论】:

    标签: oracle partitioning


    【解决方案1】:

    您不能通过两个外键进行分区。

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

    问题 - 为什么你在表 C 中有 A 的 FK。不是 A 由 fk 隐含到 B 吗?

    (我的猜测,从技术上讲这是可能的,但 oracle 必须访问表 B。我认为他不会这样做,所以我认为你不会被修剪)。

    【讨论】:

    • 感谢您的回复!在我们的对象模型中(在本例中投影),可能存在:A->B->C 或 A->C(例如,父对象或子对象上的错误)。也许我们必须重新设计,使它看起来像这样:A->B->C1 或 A->C2,但这样做感觉不对,因为实体/表 C1 和 C2 将具有相同的属性..(我们会有复制大约 10 个表并给它们起不同的名称)
    • 我们将重新设计,以便所有子表只有一个父表,如我上面的评论中所述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多