2010-03-22 12 views
5

¿Cuál sería una forma adecuada de hacerlo, ya que mySQL obviamente no disfruta de esto. Dejar la partición o las claves externas fuera del diseño de la base de datos no me parecería una buena idea. ¿Adivinaré que hay una solución para esto?Particionar tablas mySQL que tiene claves externas?

Actualización 03/24:

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

How to handle foreign key while partitioning

Gracias!

+0

Bounty is ON! Veamos si podemos hacer que esta pregunta vuelva a ser viva. – Industrial

Respuesta

2

Depende de la medida en que el tamaño de las filas en la tabla particionada es la razón por la cual las particiones son necesarias.

Si el tamaño de la fila es pequeño y el motivo de la partición es el puro número de filas, entonces no estoy seguro de lo que debe hacer.

Si el tamaño de fila es bastante grande, y luego tener que considerar lo siguiente:

Let P sea la tabla con particiones y F sea la tabla referenciada en la clave a los posibles extranjera. Crear una nueva tabla 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 

y lo más importante, crear un procedimiento almacenado para añadir filas a la tabla P. El procedimiento almacenado debe asegurarse (utilizar transacciones) de que cada vez que se agrega una fila a la tabla P, se agrega una fila correspondiente a la tabla X. ¡No debe permitir que las filas se agreguen a P de la manera "normal"! Solo puede garantizar que se mantendrá la integridad referencial si sigue utilizando el procedimiento almacenado para agregar filas. Sin embargo, puedes eliminarlo libremente desde P.

La idea aquí es que su tabla X tiene filas lo suficientemente pequeñas como para que no sea necesario dividirlas, aunque tenga muchas filas. Sin embargo, supongo que el índice en la mesa ocupará una gran cantidad de memoria.

En caso de que necesite consultar P en la clave externa, por supuesto consultará X, ya que es allí donde se encuentra realmente la clave externa.

+1

Acabo de revisar la página del manual de MySQL sobre restricciones de partición, y descubrí que no solo no puede tener una clave externa en una tabla particionada, tampoco puede tener una clave externa * que apunte a * una tabla particionada. Eso significa que lo anterior no es lo suficientemente bueno. Puede solucionarlo eliminando (obviamente) la restricción 'Constr_X_P_fk' y agregando un segundo procedimiento almacenado cuyo propósito es permitir la eliminación de filas en' P' y 'X'. Obviamente, debe asegurarse de que cualquier eliminación se lleve a cabo utilizando el procedimiento almacenado, en lugar de utilizar una instrucción 'DELETE' normal. – Hammerite

1

Sugeriría encarecidamente utilizar Fecha como la clave para archivar datos para archivar tablas. Si necesita informar múltiples tablas de archivo, puede usar Vistas o construir la lógica en su aplicación.

Sin embargo, con una base de datos adecuadamente estructurada, debe ser capaz de manejar decenas de millones de filas en una tabla antes de particionar, o se necesita fragmentar.

+0

Hola Gary. Sharding es definitivamente un enfoque interesante. Estoy un poco asustado al respecto, lo que resulta en una gran cantidad de UNIONES que se necesitan en la lógica de la aplicación? – Industrial

+0

Dejaría Foreign Keys en su diseño. ¿Por qué siente que necesita partición? Tenemos tablas con más de cien millones de filas que funcionan de manera excelente. El sombreado en mi opinión es una mejor opción que particiones. La implementación de partición actual en MySQL es demasiado limitante. – Gary

+0

En otra pregunta, vi que usted mencionó que su tabla tiene 400K registros.No verá ningún beneficio de rendimiento dividiendo una tabla de tamaño tan pequeño, suponiendo que esté indexada correctamente. – Gary

Cuestiones relacionadas