在试图解决同一个表的不同类型的问题时,我决定采用关系数据库的Party Model设计--使用多个表来表示子对象。
使用this post和this one作为指南,我决定使用多个表继承来构建一个政党模型。
下面是我正在做的事情的基本表示(用伪sql):
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)
由于数据分布在多个表中,所以我希望能够同时从父表和子表中读取和更新数据。阅读是可以的,可以通过以下方法来完成:
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可能会解决这个问题,但是我会留下相当多的空字段。
对此的洞察力将不胜感激。
发布于 2013-11-01 03:58:40
MySQL支持多表更新和删除,但不支持插入。MySQL也不像Server那样支持INSTEAD OF
触发器(这将为缺少多表插入提供一个解决方案)。
要处理这个问题,一个选项是为您的单行插入创建一个存储过程,它启动事务、插入各方、获取新的ID值(使用LAST_INSERT_ID()
),然后插入到子表中。
您的决定最终可能取决于是否需要定期执行多行插入。如果是这样的话,如果父(当事方)表中还存在所有唯一的子表列(和可空),则可以使用“后插入触发器”将非缔约方特定的列值插入到相应子表的新行中。
另一个不那么优雅(且效率较低)的场景将是(在存储过程中)锁定Parties表,将最高的自动增量ID保存到变量,执行多行当事方插入,保存最后插入的ID (现在是最高的ID),然后使用ID的增量变量(与您刚才在各方中创建的ID的范围相匹配)将行插入到适当的子表中。
https://stackoverflow.com/questions/19717609
复制相似问题