SQL党关系模型 - 子类和超类之间的一致性

时间:2013-10-31 22:22:40

标签: mysql sql entity-relationship single-table-inheritance

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

使用this post以及this one作为指南,我决定使用多表继承来构建Party模型。

这是我正在做的事情的基本表示(在伪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中不可能插入两者(在其他版本中是否可能?)。以这种方式不可能进行多表继承吗?将我的所有用户和组织列放入缔约方表可能会解决这个问题,但我会留下很多空字段。

对此的见解将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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

您的决定可能最终取决于您是否需要定期执行多行插入。如果是这样,如果所有唯一子表列也在父(派对)表上存在(并且可以为空),则可以使用AFTER INSERT触发器将非派对特定列值插入到相应的新行中儿童餐桌。

另一个不太优雅(效率较低)的场景是(在存储过程中)锁定Parties表,将最高自动增量ID保存到变量,执行多行Party插入,保存最后插入ID(现在是最高ID),然后使用ID的递增变量将行插入到相应的子表中(以匹配您刚刚在缔约方中创建的ID的范围)。