在尝试解决我遇到的同一个表的不同类型的问题时,我决定使用关联数据库的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中不可能插入两者(在其他版本中是否可能?)。以这种方式不可能进行多表继承吗?将我的所有用户和组织列放入缔约方表可能会解决这个问题,但我会留下很多空字段。
对此的见解将不胜感激。
答案 0 :(得分:1)
MySQL支持多表更新和删除,但不支持插入。 MySQL也不像SQL Server那样支持INSTEAD OF
触发器(这将为缺少多表插入提供一种解决方法)。
要处理这个问题,一个选项是为单行插入创建一个存储过程,它启动一个事务,插入到Parties中,获取新的ID值(使用LAST_INSERT_ID()
),然后插入儿童桌。
您的决定可能最终取决于您是否需要定期执行多行插入。如果是这样,如果所有唯一子表列也在父(派对)表上存在(并且可以为空),则可以使用AFTER INSERT触发器将非派对特定列值插入到相应的新行中儿童餐桌。
另一个不太优雅(效率较低)的场景是(在存储过程中)锁定Parties表,将最高自动增量ID保存到变量,执行多行Party插入,保存最后插入ID(现在是最高ID),然后使用ID的递增变量将行插入到相应的子表中(以匹配您刚刚在缔约方中创建的ID的范围)。