Surrogat-vs natürlicher Schlüssel: harte zahlen auf performance-Unterschiede?
Gibt es eine gesunde Debatte gibt zwischen Surrogat-und untertasten:
Meiner Meinung nach, das scheint zu sein, im Einklang mit der Mehrheit (es ist eine knappe Mehrheit), ist, dass Sie sollten die Verwendung von Ersatzschlüsseln, es sei denn, ein natürlicher Schlüssel ist völlig klar, und garantiert nicht ändern. Dann sollten Sie Eindeutigkeit auf die natürlichen Schlüssel. Was bedeutet, dass Ersatzschlüssel fast alle der Zeit.
Beispiel der beiden Ansätze, beginnend mit einer Tabelle Firma:
1: Ersatzschlüssel: Tabelle hat ein Feld ID, das ist die PK (und eine Identität). Die Namen der Unternehmen sind erforderlich, um eindeutig zu sein, durch den Staat, so gibt es eine unique-Einschränkung vorhanden.
2: Natürlicher Schlüssel: Tabelle verwendet CompanyName und Staat als die PK -- erfüllt sowohl die PK und Einzigartigkeit.
Lassen Sie uns sagen, dass die Firma PK verwendet wird, in 10 anderen Tabellen. Meine Hypothese, mit keine zahlen, um es wieder auf, ist, dass der Ersatzschlüssel Ansatz wäre viel schneller hier.
Das einzige überzeugende argument, das ich erlebt habe, natürlicher Schlüssel ist für eine m: N-Tabelle, die verwendet die beiden Fremdschlüssel als Natürliche Schlüssel. Ich denke in diesem Fall macht es Sinn. Aber Sie können in Schwierigkeiten geraten, wenn Sie benötigen, zu überarbeiten; das ist außerhalb des Rahmens dieser post denke ich.
Hat jemand gesehen ein Artikel, der vergleicht performance-Unterschiede auf eine Reihe von Tabellen, die Verwendung Ersatzschlüssel vs. den gleichen Satz von Tabellen mit Natürliche Schlüssel? Auf der Suche rund um auf SO und Google hat nicht nachgegeben wird, nichts Wert, nur eine Menge von theorycrafting.
Wichtiges Update: ich habe begonnen, eine Satz von test-Tabellen, die diese Frage beantworten. Es sieht wie folgt aus:
- PartNatural - Teile-Tabelle, die verwendet
die eindeutige Bauteilnummer als PK - PartSurrogate - Teile-Tabelle,
verwendet wird eine ID (int, Identität) als PK und
hat einen eindeutigen index auf die Vergleichsnummer - Pflanze - ID (int, Identität) als PK
- Ingenieur - ID (int, Identität) als PK
Jedem Teil verbunden ist, auf eine pflanze und jeder Instanz, in der ein Teil an eine Anlage angeschlossen ist ein Ingenieur. Wenn jemand ein Problem mit diesem testbed, jetzt ist die Zeit.
- Es hängt wahrscheinlich von der Daten-Typ des Ersatz-und untertasten, und wie Sie sind indiziert, etc., etc.
- Gegeben, die Menschen benutzen, Ersatzschlüssel, weil Sie logisch notwendig, die performance-Unterschiede zwischen damals und natürlichen Schlüssel (sollten solche Unterschiede bestehen) nust unerheblich sein - Sie kann nicht ersetzen eine mit dem anderen.
- Ich denke, dass Natürliche Schlüssel in der Regel mit varchar-Felder und Ersatzschlüssel sind fast immer mit int-Werten. Du hast Recht, aber ich hoffe, dass alles, was mythische Studie/whitepaper, das ich Suche, werde diese Adresse.
- Natürliche Schlüssel beinhalten, was natürlich ist. Surrogat-Schlüssel für ints, bigints, GUID, etc.
- Ich bin mir nicht sicher, ich Stimme mit den logisch notwendigen Teil. Von dem, was ich gelesen habe, nutzen viele Menschen Ersatzschlüssel, auch wenn eine Natürliche Schlüssel sein könnte zur Verfügung, für eine Vielzahl von Gründen.
- Nicht zu Beginn dieser Debatte hier, sondern Surrogat-Schlüssel verwendet werden soll, ob es ein natürlicher Schlüssel ist oder nicht (und es fast immer ist). Und beachten Sie meine Verwendung des Ausdrucks "Gegeben, dass..."
- Ich bin damit einverstanden. Und ich werde zu aktualisieren, die OP zu Adresse, feinen Unterschied. Ich bin der Hoffnung, um zu sehen, einige echte zahlen unterstützen meine Meinung.
- Ersatzschlüssel sind NICHT "logisch notwendig". wie wäre es mit einer log-Tabelle, die Datum und Zeit (dargestellt mit ausreichender Genauigkeit) ist eine vollkommen akzeptable Natürliche Schlüssel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie beide! Natürliche Schlüssel verhindern eine Beschädigung der Datenbank (Inkonsistenz wäre vielleicht das bessere Wort). Wenn die "richtigen" natürlichen Schlüssel, (um doppelte Zeilen entfernen) durchführen würde schlecht wegen der Länge, oder die Anzahl der beteiligten Spalten, für performance-Zwecke, einen Ersatzschlüssel können ebenso Hinzugefügt werden, um verwendet werden, als Fremdschlüssel in anderen Tabellen anstelle der natürlichen Schlüssel... Aber der Natürliche Schlüssel bleiben sollte als Alternative key-oder unique-index zu verhindern, dass Daten Korruption und enforece Konsistenz der Datenbank...
Viel von der hoohah (in der "Debatte" zu diesem Thema), an was das liegen kann, ist eine falsche Annahme, dass die Primärschlüssel für joins und Fremdschlüssel in anderen Tabellen. DAS IST FALSCH. Sie können JEDE Schlüssel als Ziel für Fremdschlüssel in anderen Tabellen. Kann es sein das Primary Key, eine Alternative Taste oder einen beliebigen eindeutigen index oder eine eindeutigkeits-integritätsregel. Und wie für die Verknüpfungen, die Sie verwenden können, überhaupt etwas für eine join-Bedingung, es muss noch nicht mal ein Schlüssel, oder ein idex, oder sogar einzigartig !! ( obwohl, wenn es nicht eindeutig ist, erhalten Sie mehrere Zeilen in das kartesische Produkt es schafft).
Natürliche Schlüssel zu unterscheiden von Ersatzschlüsseln im Wert, nicht geben.
Jede Art kann verwendet werden, für einen Ersatzschlüssel, wie ein
VARCHAR
für die system-generiertenslug
oder etwas anderes.Jedoch, die meisten verwendet Typen für Ersatzschlüssel sind
INTEGER
undRAW(16)
(oder was auch immer geben Sie IhreRDBMS
nicht fürGUID
's),Vergleich Surrogat ganze zahlen und Natürliche zahlen (wie
SSN
) dauert exakt gleichen Zeit.Vergleich
VARCHAR
s machen nehmen Sortierung berücksichtigt wird, und Sie sind in der Regel länger als Ganzzahlen, das macht Sie weniger effizient.Vergleich ein Satz von zwei
INTEGER
ist wohl auch weniger effizient als der Vergleich eines einzelnenINTEGER
.Auf Datentypen, die in der Größe klein dieser Unterschied ist wahrscheinlich Prozente von Prozenten die Zeit, die erforderlich, um fetch Seiten, traverse Indizes, acquite Datenbank Riegel etc.
Und hier sind die zahlen (in
MySQL
):t_source
ist nur eine dummy-Tabelle mit1,000,000
Zeilen.aint
undadouble
,bint
undbdouble
enthalten genau die gleichen Daten, außer, dassaint
hat eine Ganzzahl alsPRIMARY KEY
, währendadouble
hat ein paar von zwei gleichen ganzen zahlen.Auf meinem Rechner, beide Abfragen ausführen, die für 14,5 Sekunden, +/- 0,1 Sekunde
Performance-Unterschied, wenn überhaupt innerhalb der Schwankungen der Reihe.
surrogate key
wie Sie verstehen, es für die Zwecke dieser Diskussion. Möchten Sie vielleicht Lesen Sie in diesem Wikipedia-Artikel: en.wikipedia.org/wiki/Surrogate_key Diese Frage ist entscheidend für die weitere Diskussion also ich würde wirklich bitten, Sie zu beantworten, bevor diese Diskussion fortgesetzt werden kann. Danke.VARCHAR(200)
Spalte gefüllt mitNEWID()
alsPRIMARY KEY
.NEWID
ist sicherlich "erzeugt durch dieRDBMS
", und natürlich "ist nicht abgeleitet aus einer beliebigen Anwendung Daten in der Datenbank". Die zweite Tabelle verwendet eineVARCHAR(200)
Spalte ausgefüllt mit dem Namen des Unternehmens alsPRIMARY KEY
. Jetzt sehen wir zwei identische Tabellen, deren Tasten unterscheiden sich nur in der Art, nicht Wert, aber die erste Tabelle verwendet Ersatzschlüssel, während die zweite verwendet man Natürliche Schlüssel. Nun, was ist, dass Sie nicht mit?@jcollum
: Sie sind conserned über die Leistungen vonINT32
Vergleich oder was? Es wird das gleiche sein. Eine Datenbank vergleicht32-bit
Ganzzahlen gefüllt mit Teilenummern mit genau den gleichen Wirkungsgrad wie solche, gefüllt mit Identität. LeistungCMP EAX
hängt nicht davon ab, die Quelle für die Zahl, die verglichen werden.