Doctrine2 和 MySQL Partitioning

2022-08-30 20:07:59

是否有人有将分区功能与 Doctrine2 库结合使用的经验?

第一个问题是,Doctrine为关联列创建了外键,有人知道如何防止或禁用它吗?

第二个问题是如何指定自定义表定义(PARTITION BY ...)?

提前致谢!


答案 1

你不倒霉!!

首先,从 D2 管理的所有表中删除所有外键。复制并执行此查询的结果:

SET SESSION group_concat_max_len=8192; -- // increase this if you do not see the full list of your tables
SELECT IFNULL(REPLACE(GROUP_CONCAT('ALTER TABLE ',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,'; '), ',', ''), '') FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY';

然后重写该方法(或此类所在的任何位置)以:supportsForeignKeyConstraints()/vendor/doctrine-dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php

public function supportsForeignKeyConstraints()
{
    return false;
}

这将阻止 Doctrine 在下一个命令上创建外键约束。之后,您可以简单地在需要时执行语句(D2 不支持在架构级别上进行分区)。我建议您先备份并截断表(使用),以便尽快执行结构更改,然后还原它们。doctrine:schema:updateALTER TABLE PARTITION BY...--no-create-info

正如这个家伙在这里说的,根据我个人的经验,D2并不关心你是否有FKs,只要有适当的关系定义。

P.S.:我目前正在努力扩展注释语法以支持正确的表和列定义,包括(这可能很有用)和@Column数组(即ENGINEPARTITION BYoptions{"fixed"=true, "unsigned"=true, "default"=0})

整体努力相当于几个不眠之夜的逆向工程和代码补丁,希望你做得更快,:)


答案 2

MySQL中的分区引擎在键方面存在重大限制。请参阅最新文档,当前位置:http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

如果 Doctrine 需要 Partition 不支持的键,那么你就不走运了。分区引擎在设计上非常有限 - 它用于不经常读取的存档存储。很少有MySQL感知应用程序可以与分区一起使用,除非您进行更改。

我建议使用分区,因为它的意图 - 存档。将数据存储在更主流的MySQL数据引擎中将是答案。


推荐