2011-05-26 16 views
19

¿Alguien tiene experiencia en el uso de la función de partición junto con la biblioteca de Doctrine2?Partición de Doctrine2 y MySQL

El primer problema es que Doctrine crea claves foráneas para columnas de asociación, ¿alguien sabe cómo prevenir o deshabilitar eso?

Y el segundo problema es cómo especificar la definición de tabla personalizada (PARTITION BY ...)?

¡Gracias de antemano!

+3

Probablemente obtendrá mejores resultados si divide esto en dos preguntas. –

+0

Si desea obtener un rendimiento rápido con particiones y doctrina, no lo haga. Servidor más poderoso es más barato. Y las particiones solo traerán confusión. –

Respuesta

2

motor PARTITION en MySQL tiene grandes limitaciones con respecto a las claves. Consulte los últimos documentos, actualmente aquí: http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

Si Doctrine necesita claves que Partition no admite, no tiene suerte. El motor de partición está muy limitado por diseño: está destinado al almacenamiento de archivos, que rara vez se lee. Pocas aplicaciones compatibles con MySQL funcionarán con Partition, a menos que realice cambios.

Sugeriría usar Partition como estaba previsto - archivar. Almacene sus datos en un motor de datos MySQL más convencional sería la respuesta.

5

No has perdido la suerte !!

Primero, suelte todas las claves foráneas de todas las tablas que D2 está administrando. Copia & ejecutar el resultado de esta consulta:

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'; 

Entonces reemplazar el método supportsForeignKeyConstraints() en /vendor/doctrine-dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php (o donde esta clase se encuentra) a:

public function supportsForeignKeyConstraints() 
{ 
    return false; 
} 

Esto detendrá Doctrina de crear extranjera restricciones clave en su próximo comando doctrine:schema:update. Después de eso, puede simplemente ejecutar una instrucción ALTER TABLE PARTITION BY... donde sea necesario (D2 no admite partición en un nivel de esquema). Recomiendo que haga una copia de seguridad & trunque primero las tablas (usando --no-create-info) para que los cambios de estructura se ejecuten lo más rápido posible y luego restaurelos.

Como este individuo dice here, y según mi experiencia personal, a D2 no le importa si tiene FK o no, siempre que las definiciones de relación adecuadas estén en su lugar.

PS: Estoy trabajando actualmente en la ampliación de la sintaxis de anotación para apoyar las definiciones apropiadas columna de la tabla &, incluyendo ENGINE (this podría ser útil), PARTITION BY & la matriz @Column options (es decir {"fixed"=true, "unsigned"=true, "default"=0})

La general esfuerzo equivale a un par de noches de insomnio para la ingeniería inversa & parches de código, espero que lo haga más rápido :)