Es hängt davon ab, inwieweit die Größe der Zeilen in der partitionierten Tabelle der Grund für die Notwendigkeit von Partitionen ist.
Wenn die Zeilengröße ist klein und der Grund für die Partitionierung ist die bloße Nummer Zeilen, dann bin ich mir nicht sicher, was Sie tun sollten.
Wenn die Zeilengröße recht groß ist, dann haben Sie darüber nachgedacht, wie folgt vor:
Let P
die partitionierten Tabelle und F
die Tabelle in der angehenden Fremdschlüssel referenziert werden. Erstellen Sie eine neue Tabelle 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
und entscheidend, für das Hinzufügen von Zeilen Tabelle P
eine gespeicherte Prozedur erstellen. Ihre gespeicherte Prozedur sollte sicherstellen (Transaktionen verwenden), dass beim Hinzufügen einer Zeile zur Tabelle P
eine entsprechende Zeile zur Tabelle X
hinzugefügt wird. Sie dürfen nicht zulassen, dass Zeilen auf "normale" Weise zu P
hinzugefügt werden! Sie können nur garantieren, dass die referenzielle Integrität erhalten bleibt, wenn Sie Ihre gespeicherte Prozedur zum Hinzufügen von Zeilen verwenden. Sie können jedoch normal von P
löschen.
Die Idee hier ist, dass Ihre Tabelle X
genügend kleine Zeilen hat, die Sie hoffentlich nicht brauchen, um es zu partitionieren, obwohl es viele viele Zeilen hat. Der Index auf dem Tisch wird trotzdem einen ziemlich großen Speicherbedarf haben, denke ich.
Sollten Sie auf dem Fremdschlüssel P
abfragen müssen, werden Sie natürlich X
abfragen, da das der Fremdschlüssel ist.
Bounty ist eingeschaltet! Mal sehen, ob wir diese Frage wieder lebendig bekommen können! – Industrial