首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Super关系模型-子类和超类之间的一致性

Super关系模型-子类和超类之间的一致性
EN

Stack Overflow用户
提问于 2013-10-31 22:22:39
回答 1查看 852关注 0票数 0

在试图解决同一个表的不同类型的问题时,我决定采用关系数据库的Party Model设计--使用多个表来表示子对象。

使用this postthis one作为指南,我决定使用多个表继承来构建一个政党模型。

下面是我正在做的事情的基本表示(用伪sql):

代码语言:javascript
运行
复制
Parties
- ID, AUTO_INCREMENT
- Type
- Shared_Data
- Primary Key (ID, Type)

User_Sub
- ID
- Type, Default 'U'
- User_Data
- Primary Key (ID, Type)
- Foreign Key 'User-Party' (ID, Type) references (Parties.ID, Parties.Type)

Organization_Sub
- ID
- Type, Default 'O'
- Organization_Data
- Primary Key (ID, Type)
- Foreign Key 'Organization-Party' (ID, Type) references (Parties.ID, Parties.Type)

由于数据分布在多个表中,所以我希望能够同时从父表和子表中读取和更新数据。阅读是可以的,可以通过以下方法来完成:

代码语言:javascript
运行
复制
CREATE VIEW Users as
SELECT P.*, U.User_Data FROM Parties P 
Inner Join Users_Sub U on P.id=U.id, P.type=U.type

但是,在MySQL中,插入两者都是不可能的(在其他类型中可以吗?)难道不可能以这种方式进行多表继承吗?将我的所有用户和组织列放入Parties可能会解决这个问题,但是我会留下相当多的空字段。

对此的洞察力将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-01 03:58:40

MySQL支持多表更新和删除,但不支持插入。MySQL也不像Server那样支持INSTEAD OF触发器(这将为缺少多表插入提供一个解决方案)。

要处理这个问题,一个选项是为您的单行插入创建一个存储过程,它启动事务、插入各方、获取新的ID值(使用LAST_INSERT_ID()),然后插入到子表中。

您的决定最终可能取决于是否需要定期执行多行插入。如果是这样的话,如果父(当事方)表中还存在所有唯一的子表列(和可空),则可以使用“后插入触发器”将非缔约方特定的列值插入到相应子表的新行中。

另一个不那么优雅(且效率较低)的场景将是(在存储过程中)锁定Parties表,将最高的自动增量ID保存到变量,执行多行当事方插入,保存最后插入的ID (现在是最高的ID),然后使用ID的增量变量(与您刚才在各方中创建的ID的范围相匹配)将行插入到适当的子表中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19717609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档