Postgresql Postgres:继承外键解决方案的性能和正确性

Postgresql Postgres:继承外键解决方案的性能和正确性,postgresql,inheritance,Postgresql,Inheritance,我正在尝试构建我的第一个涉及继承的Postgres数据库模式。我知道中讨论的外键问题。然而,这个问题的答案并没有真正给出解决方案的示例,因此我提出了自己的解决方案(灵感来自: 为了执行工作插入x,我定义了以下触发器: CREATE FUNCTION marshal_x() RETURNS TRIGGER LANGUAGE plpgsql AS $$ DECLARE ref_table varchar; BEGIN

我正在尝试构建我的第一个涉及继承的Postgres数据库模式。我知道中讨论的外键问题。然而,这个问题的答案并没有真正给出解决方案的示例,因此我提出了自己的解决方案(灵感来自:

为了执行工作
插入x
,我定义了以下触发器:

CREATE FUNCTION marshal_x()
    RETURNS TRIGGER
    LANGUAGE plpgsql
    AS $$
        DECLARE
            ref_table varchar;
        BEGIN
            SELECT INTO ref_table p.relname FROM a, pg_class p WHERE a.id = NEW.a_id AND a.tableoid = p.oid;

            IF ref_table = 'b'
                THEN INSERT INTO xb ( a_id, bar ) VALUES ( NEW.a_id, NEW.bar );
            ELSIF ref_table = 'c'
                THEN INSERT INTO xc ( a_id, bar ) VALUES ( NEW.a_id, NEW.bar );
            END IF;
            RETURN NULL;
        END;
    $$;

CREATE TRIGGER insert_x_trg
    BEFORE INSERT ON x
    FOR EACH ROW
        EXECUTE PROCEDURE marshal_x();
编辑:有人认为这个定义有问题吗?这在我未经训练的眼睛看来是不明显的? 假设表
c
为空。你认为

SELECT * FROM a JOIN x ON a.id= x.a_id;
一模一样

SELECT * FROM b JOIN x ON b.id= x.a_id;
??非常感谢


Isam

使用继承的目的是什么?如果您只是希望根据行类型(如在OOP中)使用不同的列,那么最好使用单个表,并在不适用的列中设置NULL。或者将其他列拆分到另一个表中,并将其连接到原始表中

在PostgreSQL中,继承的主要用途是表分区,继承有许多注意事项。PostgreSQL 9.1引入了“合并追加”优化,虽然有所帮助,但仍然不够理想

从a.id=x.a\u id上的连接x中选择*

将两个大的表连接在一起听起来好像不能很好地扩展,特别是当您增加子表的数量时。PostgreSQL不够聪明,无法遵循这里的xb和xc外键约束,它会尝试将整个表a连接到整个x

但话说回来,这可能不是问题,这完全取决于您的查询和性能期望

SELECT * FROM b JOIN x ON b.id= x.a_id;