如何在YugabyteDB中替代实现PostgreSQL的INHERITS命令功能
你提到的直接从零创建新表的方案是完全可行的,针对你的场景有两种落地方式可以选择:
方案1:手动复刻表结构(适配你当前的简单场景)
你的父表ir_actions结构非常简单,手动把父表的所有字段复制到各个子表的定义中即可,唯一需要注意两个适配点:
- 后续如果父表有字段新增、修改,所有子表要同步做结构变更,保持字段定义一致
- PostgreSQL继承特性支持直接查询父表返回所有子表的记录,手动分表后如果你的业务逻辑有这类全局查询需求,需要额外用视图模拟该效果
完整适配SQL如下:
-- 父表如果不需要存储独立数据,可以直接删除 CREATE TABLE ir_actions ( id serial, primary key(id) ); -- 各子表完整复刻父表字段,再补充自身独有字段 CREATE TABLE ir_act_window ( id serial, primary key(id) ); CREATE TABLE ir_act_report_xml ( id serial, primary key(id) ); CREATE TABLE ir_act_url ( id serial, primary key(id) ); CREATE TABLE ir_act_server ( id serial, primary key(id) ); CREATE TABLE ir_act_client ( id serial, primary key(id) );
如果需要模拟继承的全局查询效果,可以新增统一视图:
CREATE VIEW ir_actions_all AS SELECT 'window' AS action_type, id FROM ir_act_window UNION ALL SELECT 'report_xml' AS action_type, id FROM ir_act_report_xml UNION ALL SELECT 'url' AS action_type, id FROM ir_act_url UNION ALL SELECT 'server' AS action_type, id FROM ir_act_server UNION ALL SELECT 'client' AS action_type, id FROM ir_act_client;
原来查询ir_actions的逻辑直接替换为查询该视图即可。
方案2:单表加类型标识(适合后续字段扩展的场景)
如果不同子表的差异化字段不多,也可以合并为单表存储,用类型字段区分不同动作类型,改造成本更低:
CREATE TABLE ir_actions ( id serial, action_type VARCHAR(32) NOT NULL, -- 取值对应window、report_xml、url等子表类型 -- 后续所有子表的独有字段都可在该表新增,非对应类型的记录可留空 PRIMARY KEY(id) );
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

