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.