Frage

Ich habe eine Tabelle mit einem einzigen einzigartigen Varchar (512) -Feld. Ich möchte eine weitere Tabelle haben, die einen Fremdschlüsselverweis auf diese erste Tabelle enthalten. Beide Tabellen verwenden InnoDB. Wenn ich der zweiten Tabelle eine VARCHAR (512) -Taste hinzufüge und eine Fremdschlüsselbeschränkung hinzufüge, werden die 512 -Bytes -Daten zweimal gehalten?

Wenn ja, gibt es eine Möglichkeit, nur einen Verweis auf den Index und nicht auf den Varchar selbst zu halten?

Kurz gesagt, meine Frage ist, gibt es in InnoDB eine effiziente Möglichkeit, Fremdschlüsseln für lange Varchar -Felder zu halten?

Vielen Dank,

Yaniv

War es hilfreich?

Lösung

Ja, wenn Sie eine haben VARCHAR(512) Spalte in der Referenzierungstabelle existieren die Daten zweimal.

Ich empfehle Ihnen, den Fremdschlüssel der Referenzentabelle auf einen Ganzzahl-Primärschlüssel für die erste Tabelle zu beziehen, nicht auf die 512-Byte-Daten. Darum geht es bei der Normalisierung.

Andere Tipps

Ich habe einen einfachen Test durchgeführt: Erstellen Sie 3 Tabellen, eine, die die Daten selbst mit zwei Spalten und ID (int) und den Daten (Varchar [120]) halten, eine andere Tabelle, die die ID als Fremdschlüssel und eine letzte verwendet, die verwendet wird Die Daten als Fremdschlüssel:

CREATE TABLE `dados` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`) USING BTREE,
  KEY `idx` (`id`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `refINT` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `dado` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`dado`),
  CONSTRAINT `id` FOREIGN KEY (`dado`) REFERENCES `dados` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `refSTR` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `dado` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `nome` (`dado`),
  CONSTRAINT `nome` FOREIGN KEY (`dado`) REFERENCES `dados` (`name`) ON DELETE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

Einfügte 100 Datensätze in jeder Tabelle und verglichen die Final -Tabellengröße:

dados:  192.0 KB
refINT: 32.0 KB
refSTR: 32.0 KB

Ich denke, die Daten werden zumindest in der MySQL 5.1 -Version nicht in VARCHAR -Fremdkasten repliziert.

Die Schlüsselgröße klein zu halten ist immer gut. Sie könnten das Problem umgehen, einen großen zu haben VARCHAR Indexiert, indem Sie stattdessen eine zusätzliche Überprüfungssummenspalte haben, die Sie zur Einfügungszeit generieren. Dieses Kontrollsumendfeld würde die Ausgabe eines Hashing -Algorithmus enthalten CRC32() oder vielleicht MD5() der größeren Säule.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top