0

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

使用这篇文章和这篇文章作为指南,我决定使用多表继承构建一个派对模型。

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

对此的见解将不胜感激。

4

1 回答 1

1

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

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

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

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

于 2013-11-01T03:58:40.347 回答