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



为了解决我遇到的一个问题,即使用不同类型的同一表,我决定采用关系数据库的Party Model设计 - 使用多个表来表示子对象。

使用

这篇文章和这篇文章作为指导,我决定使用多表继承构建一个 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中无法插入两者(在其他版本中可以吗?以这种方式进行多表继承是不可能的吗?将我所有用户和组织列放入当事方表中可能会解决此问题,但是我会留下很多空字段。

对此的见解将不胜感激。

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

为了解决这个问题,一种选择是为单行插入创建一个存储过程,该过程启动事务,插入到参与方中,获取新的 ID 值(使用 LAST_INSERT_ID()),然后插入到子表中。

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

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

最新更新