我有一个多对多关系,用
MySQL中的关联表实现.我有一张儿童餐桌和一张父母餐桌.子项可以有多个父项,保存在parent_child_link关联表中,并带有其ID.
可以通过HTML表单更新子项,父项是HTML多选.现在我需要更新数据库中的记录,但我的解决方案效率不高.这是伪代码我做的:
>更新child_id = x的子信息
>删除parent_id_link中child_id = x的所有当前关联
>插入新关联
这种解决方案效果很好,但是当父母没有改变时,例如只更改了孩子的名字,然后执行了2个不必要的查询.如何避免那些不必要的查询?有没有办法检查多选中的父母是否没有改变?
当然,我可以忽略所有这些麻烦,因为它已经有效,但我真的希望尽可能保持高效.
尝试在子表的定义中使用ON UPDATE CASCADE和ON DELETE CASCADE在数据库中而不是在应用程序层中解决它.
CREATE TABLE parent (id INT NOT NULL,PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE child (id INT,parent_id INT,INDEX par_ind (parent_id),FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=INNODB;
查看文档:http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
编辑:对于你的多对多关系,你可以使用类似的东西:
CREATE TABLE parent_child_link ( parent_id INT NOT NULL,child_id INT NOT NULL,PRIMARY KEY(parent_id,child_id),FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE,FOREIGN KEY (child_id) REFERENCES child(id) ON DELETE CASCADE ON UPDATE CASCADE );
希望这可以帮助.