Záleží na tom, do jaké míry je velikost řádků v dělené tabulce důvodem pro nutnost rozdělení.
Pokud je velikost řádku malá a důvodem rozdělení je čisté číslo řádků, pak si nejsem jistý, co byste měli dělat.
Pokud je velikost řádku poměrně velká, zvážili jste následující:
Nechte P být rozdělená tabulka a F být tabulkou odkazovanou v případném cizím klíči. Vytvořte novou tabulku 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
a co je nejdůležitější, vytvořte uloženou proceduru pro přidávání řádků do tabulky P . Vaše uložená procedura by měla zajistit (použít transakce), že při každém přidání řádku do tabulky P , odpovídající řádek je přidán do tabulky X . Nesmíte povolit přidávání řádků do P "normálním" způsobem! Zachování referenční integrity můžete zaručit pouze tehdy, budete-li používat uloženou proceduru pro přidávání řádků. Z P můžete libovolně mazat normálním způsobem.
Myšlenka je taková, že vaše tabulka X má dostatečně malé řádky, že byste jej doufejme neměli rozdělovat, i když má mnoho a mnoho řádků. Myslím, že index na stole přesto zabere docela velký kus paměti.
Pokud potřebujete dotaz P na cizím klíči budete samozřejmě dotazovat X místo toho, protože tam je cizí klíč ve skutečnosti.