Frage

Ich möchte ein Beispiel sehen:

  • Wenn dies angemessen ist
  • Wenn diese nicht geeignet ist

Gibt es eine Zeit, als die Wahl der Datenbank einen Unterschied zu den obigen Beispielen machen würde?

War es hilfreich?

Lösung

Das ist wirklich eine Frage zu sein, über scheint Surrogat Tasten, die immer entweder eine automatische Erhöhung Nummer oder GUID und somit eine einzige Spalte, gegen natürlich Tasten, die erfordern oft mehrere Stücke von Informationen, um wirklich einzigartig zu sein. Wenn Sie in der Lage sind, einen natürlichen Schlüssel zu haben, die nur eine Spalte ist, dann wird der Punkt offensichtlich moot sowieso.

einige Leute darauf bestehen, nur das eine oder das andere verwenden. Verbringen Sie ausreichend Zeit mit Produktionsdatenbanken arbeiten, und Sie werden lernen, dass es keine kontextunabhängige Best Practice.

Einige dieser Antworten verwenden SQL Server-Terminologie aber die Konzepte sind in der Regel für alle DBMS-Produkte:


Gründe einspaltig Ersatzschlüssel zu verwenden:

  • Clustered-Indizes Ein Clustered-Index immer am besten durchführt, wenn die Datenbank lediglich anhängen können - andernfalls wird der DB zu tun hat, Seite teilt . Beachten Sie, dass dies nur gilt, wenn der Schlüssel sequenzielle , das heißt entweder eine Autoinkrement-Sequenz oder eine sequenzielle GUID. Willkürliche GUIDs wird wahrscheinlich viel schlimmer für die Leistung sein.

  • Beziehungen. Wenn Ihr Schlüssel 3, 4, 5 Spalten lang, einschließlich Charaktertypen und andere nicht-kompakte Daten, Sie am Ende verschwenden enorme Mengen von Raum und anschließend der Leistung reduzieren, wenn Sie Fremdschlüsselbeziehungen zu diesem Schlüssel in 20 anderen Tabellen.

  • erstellen haben
  • Einmaligkeit. Manchmal tun Sie nicht Haben ein wahrer Natur Schlüssel. Vielleicht ist Ihr Tisch ist eine Art Protokoll, und es ist möglich, dass Sie zugleich zwei der gleichen Veranstaltung zu erhalten. Oder vielleicht Ihr eigentlicher Schlüssel ist so etwas wie ein materialisierte Weg, der nur bestimmt werden kann nach die Zeile bereits eingefügt. So oder so, sollten Sie immer Ihre gruppierten Index und / oder Primärschlüssel eindeutig sein, so dass, wenn Sie keine andere wirklich einzigartige Informationen haben, haben Sie keine andere Wahl, als einen Ersatzschlüssel zu verwenden.

  • Kompatibilität. Die meisten Leute werden nie damit zu tun haben, aber wenn der natürliche Schlüssel so etwas wie ein hierarchyid enthält, ist es möglich, dass einige Systeme kann es nicht einmal lesen. In diesem Fall wieder Sie muss einen einfachen automatisch generierte Ersatzschlüssel für die von diesen Anwendungen Gebrauch erstellen. Auch wenn Sie nicht in dem natürlichen Schlüssel keinen „weird“ -Daten haben, haben einige DB-Bibliotheken eine Menge Ärger mit mehrspaltigen Primärschlüsseln handelt, obwohl dieses Problem schnell entfernt wird.

Gründe mehrspaltigen natürlichen Schlüssel verwenden

  • Speicher. Viele Menschen, die mit Datenbanken arbeiten nie mit groß genug, um denjenigen arbeiten zu diesem Faktor kümmern. Aber wenn eine Tabelle Milliarden oder Billionen von Zeilen hat, werden Sie die absolute Mindestmenge an Daten in dieser Tabelle halten mögen, dass Sie kann.

  • Replikation. Ja, können Sie eine GUID oder eine sequenzielle GUID verwenden. Aber GUIDs haben ihre eigenen Kompromisse, und wenn Sie nicht oder wollen nicht eine GUID aus irgendeinem Grund verwenden, eine mehrspaltige natürliche Schlüssel ist eine viel bessere Wahl für Szenarien, die Replikation, weil es an sich global einzigartig - das heißt, Sie brauchen nicht einen speziellen Algorithmus, um es einzigartig zu machen, es ist einzigartig definitions . Dies macht es sehr einfach, über verteilte Architekturen zur Vernunft.

  • Insert / Update-Performance . Ersatzschlüssel sind nicht frei. Wenn Sie eine Reihe von Spalten haben, die einzigartig sind und häufig abgefragt, und Sie brauchen daher einen abdeckenden Index auf diesen Spalten zu erzeugen; der Index landet fast so groß wie die Tabelle ist, die Abfälle Raum und erfordert, dass ein zweiter Index jedes Mal, wenn Sie keine Modifikationen aktualisiert werden. Wenn es überhaupt möglich ist, nur für Sie haben, ein index (der Clustered-Index) auf einem Tisch, sollten Sie es tun!


Das ist, was in dem Sinne rechts von der Fledermaus kommt. Ich werde aktualisieren, wenn ich plötzlich etwas anderes erinnern.

Andere Tipps

Ich denke, es ist fast immer besser (von einem Anwendungsentwickler Sicht zumindest) den Primärschlüssel eines automatisch generierter Schlüssel, zu machen und eine UNIQUE-Einschränkung und einen Index für die mehrere Spalten erstellen.

  • Mit einem einzigen automatisch generierten Primärschlüssel, werden Sie in der Lage seines leichten Verweise auf diese Tabelle aus anderen Tabellen hinzufügen.
  • Auto-generierten Primärschlüssel arbeiten mehr einfach mit ORM-Bibliotheken.
  • Auch wenn Ihre Einzigartigkeit Einschränkungen in der Zukunft ändern, müssen Sie nicht die vorhandenen Primärschlüssel ändern.

Ich habe laufen in mehr Kopfschmerzen auslösende Situationen, weil ein DBA gedacht, dass ein mehrspaltige Primärschlüssel immer ausreichen würde, und zukünftige Anforderungen Änderungen gezeigt, dass diese falsch.

Sie wollen fast immer einen Primärschlüssel, so dass ich davon ausgehen, ist die Wahl eine bestehenden zwei Spalten zwischen der Auswahl die Primärschlüssel, oder dem Erstellen einer neuen automatischen Erhöhung PK und setzt eine gewöhnliche eindeutige Einschränkung auf den beiden Säulen statt sein.

Wenn Sie einen 2-Spalte Primärschlüssel:

  • Wenn Sie eine Zwischentabelle, die zwei anderen Tabellen verweist, und es besteht nur aus zwei Fremdschlüssel, das heißt eine viele zu viele Beziehung, dann gibt es keinen Punkt eine zusätzliche Spalte Hinzufügen nur ein Primärschlüssel zu sein. Verwenden Sie die beiden Spalten, die Sie bereits als Primärschlüssel haben.

Wenn Sie einen Auto-Increment Primärschlüssel wollen:

  • Wenn Sie eine Tabelle aus einer anderen Tabelle verweisen, mögen Sie den Primärschlüssel der Zieltabelle klein sein, weil diese Daten werden als Fremdschlüssel in der verweisenden Tabelle wiederholt werden. Sie wollen es auch schnell sein zu vergleichen.
  • Jeder Index, den Sie zu einer Tabelle hinzufügen enthält eine Kopie des Clustering-Schlüssel (die in der Regel die gleiche wie die Primärschlüssel ist). Wenn Ihr Gruppierungsschlüssel ist größer als es sein muss, wird jeder Index für diese Tabelle größer sein, als es auch sein muss.

Ein paar Beispiele ...

Geeignet:

  • OLTP-Systeme, in den meisten Fällen bei der Implementierung der meist many-to-many-Beziehungen.

Unangemessen:

  • Für Maßtabellen in OLAP-Systemen -. Sie möchten, dass Ihre Dimensionsschlüssel so klein wie möglich machen, damit Ihre Faktentabelle so klein ist (und schnell) wie möglich

  • Für Zeiten, wenn Sie nicht sicher sind, ob die Kombination einzigartig ist. Zugegeben ist dies ein ziemlich mieses Beispiel, aber eine „Person“ Tisch eine schlechte Wahl für einen mehrspaltigen PK.

  • wäre

Ein Beispiel, wenn es angebracht ist, wenn Sie eine Verknüpfung Tabelle mit Fremdschlüsselfeldern Anschluss verschiedene Tabellen haben.

Im Allgemeinen ist es wahrscheinlich eine gute Idee, bestehenden zu verwenden, zu identifizieren Felder als Primärschlüssel, wenn möglich. Wenn Sie nicht über ein natürliches ID-Feld haben, und Sie würden eine Menge von Feldern zu kombinieren haben eine einzigartige PK zu bekommen, ist es wahrscheinlich besser, eine Auto-Nummer zu verwenden. Primärschlüssel mit mehr als 2 Feldern kann chaotisch.

Wir fanden große Leistungssteigerungen in unserer Anwendung, wenn wir mehrspaltigen indexs und Schlüssel verwendet. Es erlaubt uns Index auf unsere häufigsten Fragen und die Haupttabelle wurde zu schaffen nicht einmal zugegriffen, da die gesamte select-Klausel im Index sein könnte. Allerdings hängt es von Ihrer Anwendung und Datensatz.

Manchmal Verbund natürliche Schlüssel machen intuitiven Sinn. Z.B. Angenommen, Sie haben einen Tisch für ein Unternehmen (PK ist ComapnyId) mit einigen Details des Unternehmens in Spalten. Sie haben auch eine Anforderung thoughout seiner Geschichte des CEO Namen des Unternehmens zu speichern. Die natürliche invariant ist, dass ein Unternehmen nur eine CEO zu einem Zeitpunkt haben kann. Es ist dann intuitiv eine CompanyCeo Tabelle mit einem Composite-PK von CompanyID (a FK CompanyID in Firmen Tabelle) + Fromdate zu erstellen. Andere Spalten in dieser Tabelle kann ToDate und CeoName sein. Auf diese Weise können Sie garantieren, dass ein und nur ein CEO zu einem bestimmten Zeitpunkt starten kann.

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