sql >> Databáze >  >> RDS >> Mysql

Dělíte tabulky mySQL na oddíly, které mají cizí klíče?

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.



  1. mysql> vytvořit test databáze; ERROR 1006 (HY000):Nelze vytvořit databázi „test“ (chyba:2)

  2. Jak psát vybraná prohlášení

  3. Co je LEN() v SQL Server?

  4. Co indexovat u dotazů se spoustou sloupců v klauzuli WHERE