Подтвердить что ты не робот

Doctrine2 и MySQL Partitioning

Есть ли у кого-нибудь опыт использования функции секционирования в сочетании с библиотекой Doctrine2?

Первая проблема заключается в том, что Doctrine создает внешние ключи для столбцов ассоциации, кто-нибудь знает, как предотвратить или отключить это?

И вторая проблема заключается в том, как указать пользовательское определение таблицы (PARTITION BY...)?

Спасибо заранее!

4b9b3361

Ответ 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 от создания ограничений внешнего ключа для следующей команды doctrine:schema:update. После этого вы можете просто выполнить инструкцию ALTER TABLE PARTITION BY..., где это необходимо (D2 не поддерживает разделение на уровне схемы). Я рекомендую сначала создать резервную копию и обрезать ваши таблицы (используя --no-create-info), чтобы изменения структуры выполнялись как можно быстрее, а затем восстанавливали их.

Как говорит этот человек здесь, и, основываясь на моем личном опыте, D2 не волнует, есть ли у вас FK или нет, если правильные определения отношений на месте.

PS: В настоящее время я работаю над расширением синтаксиса аннотации для поддержки правильных определений таблиц и столбцов, в том числе ENGINE (этот может быть полезен), PARTITION BY и @Column options (т.е. {"fixed"=true, "unsigned"=true, "default"=0})

Общее усилие составляет пару бессонных ночей для обратного проектирования и патчей кода, надеюсь, что вы сделаете это быстрее:)

Ответ 2

Двигатель PARTITION в MySQL имеет серьезные ограничения в отношении ключей. Пожалуйста, ознакомьтесь с последними документами, которые находятся здесь: http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

Если Doctrine требует ключей, которые Partition не поддерживает, вам не повезло. Конструктор разделов очень ограничен дизайном - он предназначен для архивного хранения, который редко читается. Немногие приложения, поддерживающие MySQL, будут работать с разделом, если вы не вносите изменения.

Я бы предложил использовать раздел, как он был предназначен, - архивирование. Сохранение данных в более важном двигателе данных MySQL будет ответом.