微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

分区具有外键的mySQL表?

什么是合适的方法,因为MysqL显然不喜欢这个.
数据库设计中留下分区或外键对我来说似乎不是一个好主意.我猜这有一个解决方法吗?

更新03/24:

http://opendba.blogspot.com/2008/10/mysql-partitioned-tables-with-trigger.html

How to handle foreign key while partitioning

谢谢!

最佳答案
它取决于分区表中行的大小是否需要分区的原因.

如果行大小很小并且分区的原因是行数,那么我不确定你应该做什么.

如果行大小很大,那么您是否考虑过以下内容

设P为分区表,F为be-be外键中引用的表.创建一个新表X:

CREATE TABLE `X` (
    `P_id` INT UNSIGNED NOT NULL,-- I'm assuming an INT is adequate,but perhaps
        -- you will actually require a BIGINT
    `F_id` INT UNSIGNED NOT NULL,PRIMARY KEY (`P_id`,`F_id`),CONSTRAINT `Constr_X_P_fk`
        FOREIGN KEY `P_fk` (`P_id`) REFERENCES `P`.`id`
        ON DELETE CASCADE ON UPDATE RESTRICT,CONSTRAINT `Constr_X_F_fk`
        FOREIGN KEY `F_fk` (`F_id`) REFERENCES `F`.`id`
        ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=INNODB CHaraCTER SET ascii COLLATE ascii_general_ci

并且至关重要的是,创建一个存储过程来向表P添加行.您的存储过程应该确定(使用事务),每当向表P添加一行时,相应的行将添加到表X.您不能允许行为以“正常”方式添加到P!如果继续使用存储过程添加行,则只能保证将保留参照完整性.但是,您可以以正常方式从P中自由删除.

这里的想法是你的表X有足够小的行,你应该不需要对它进行分区,即使它有很多行.我猜,桌子上的索引将占据相当大的一块内存.

如果您需要在外键上查询P,您当然会查询X,因为这是外键的实际位置.

原文地址:https://www.jb51.cc/mysql/432943.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐