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.
Bounty is ON! Veamos si podemos hacer que esta pregunta vuelva a ser viva. – Industrial