Ich entwarf einige Tabellen mit MySQL WorkBench und setzte Fremdschlüssel in einigen Spalten, um "korrekten" Entwurfsmustern zu folgen. Dann fragte mich mein Chef, warum ich FK verwende, weil sie "nur Probleme verursachen".Performance- und Modellunterschiede zwischen indexiertem FK und indizierter Spalte
Wenn Sie sehen, was MySQL WorkBench beim Erstellen eines neuen FKs tut, erstellt es die Beziehung und einen Index dafür. Wie folgt aus:
CREATE TABLE `smx_portales-des`.`A1` (
`idA1` INT NOT NULL,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`idA1`));
CREATE TABLE `smx_portales-des`.`A2` (
`idA2` INT NOT NULL,
`price` DECIMAL(10,2) NULL,
`fkA1` INT NULL,
PRIMARY KEY (`idA2`),
INDEX `fk_A2_A1_idx` (`fkA1` ASC),
CONSTRAINT `fk_A2_A1`
FOREIGN KEY (`fkA1`)
REFERENCES `smx_portales-des`.`A1` (`idA1`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Mein Chef sagte mir, Tabelle erstellen A2
wie folgt:
CREATE TABLE `smx_portales-des`.`A2` (
`idA2` INT NOT NULL,
`price` DECIMAL(10,2) NULL,
`fkA1` INT NULL,
PRIMARY KEY (`idA2`),
INDEX fk_A2_A1(fkA1));
So, abgesehen von der offensichtlichen Einschränkung von FK, die nur Werte erlaubt, die auf dem anderen Tisch sind, oder NULL
Gibt es eine andere Performance, einen Stylisten oder irgendeinen Unterschied in diesen Modellen?
EDIT: Ich weiß, dass FKs in DB Datenintegrität helfen, und dass es einige Kaskadenoptionen gibt, die helfen, Kinder zu entfernen/zu aktualisieren. Auch, dass der Unterschied darin besteht, dass ich im zweiten Modell einen Index in einer "emulierten" FK-Spalte verwende. Meine Wunder, wo mehr über plausible Unterschiede in diesen beiden Modellen, wie Effizienz, Größe ...
Ihre zweite verwässerte Tabelle ohne Fremdschlüsseln könnte weniger Speicherplatz beanspruchen, da MySQL sich keine Gedanken über Integrität, Kaskadierung usw. machen müsste. Aber ich denke nicht, dass dies ein entscheidender Faktor wäre, den Sie wählen würden. –