Зависи от степента, до която размерът на редовете в разделената таблица е причината за необходимостта от дялове.
Ако размерът на реда е малък и причината за разделянето е самият брой от редове, тогава не съм сигурен какво трябва да направите.
Ако размерът на реда е доста голям, обмислили ли сте следното:
Нека P
е разделената таблица и F
да бъде таблицата, посочена в бъдещия външен ключ. Създайте нова таблица 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
и най-важното, създайте съхранена процедура за добавяне на редове към таблица P
. Вашата съхранена процедура трябва да гарантира (използване на транзакции), че всеки път, когато се добави ред към таблица P
, съответен ред се добавя към таблица X
. Не трябва да позволявате добавяне на редове към P
по "нормалния" начин! Можете да гарантирате, че референтната цялост ще бъде запазена само ако продължите да използвате вашата съхранена процедура за добавяне на редове. Можете свободно да изтриете от P
но по нормалния начин.
Идеята тук е, че вашата таблица X
има достатъчно малки редове, така че да се надяваме, че няма нужда да го разделяте, въпреки че има много много редове. Въпреки това индексът в таблицата ще заеме доста голяма част от паметта, предполагам.
Трябва ли да поискате P
на външния ключ, вие, разбира се, ще поискате X
вместо това, тъй като там всъщност е външният ключ.