Frage

In einer recht lebhaften Diskussion in meinem Team war ich gemacht zu denken, was die meisten Menschen wie als Primärschlüssel. Wir hatten die folgenden Gruppen -

  1. Int / BigInt welche autoincrement sind gut genug, um Primärschlüssel.
  2. Es sollte mindestens 3 Spalten sein, die den Primärschlüssel bilden.
  3. Id, GUID und Menschen lesbare Zeilenkennungen alle unterschiedlich behandelt werden sollten.

Was ist der beste Ansatz für PKs? Es wäre fantastisch, wenn Sie Ihre Meinung rechtfertigen könnten. Gibt es einen besseren Ansatz, dass die oben?

EDIT: Jeder hat einen einfache Probe / Algorithmus für Menschen lesbare Identifikatoren für die Zeilen zu erzeugen, die gut skaliert

?
War es hilfreich?

Lösung

Wenn Sie die Synchronisierung zwischen den Datenbanken gelegentlich verbundenen Anwendungen zu tun, gehen, dann sollten Sie GUIDs für Ihre Primärschlüssel werden. Es ist eine Art Schmerz für das Debuggen, so abgesehen von diesem Fall ich Ints zu Verkleben neigen, dass autoincrement.

Autoincrement Ints Ihr Standard sein sollte, und nicht verwenden, sollten sie gerechtfertigt werden.

Andere Tipps

Ich sehe eine Antwort, die Punkte nicht aus (was ich als betrachten) den wirklich grundlegenden Punkt - nämlich, dass ein Primärschlüssel ist, was garantiert, dass Sie nicht zwei Einträge in der Tabelle für die gleiche reale Welt bekommen Einheit (wie in der Datenbank modelliert). Diese Beobachtung hilft festzustellen, was gut und was sind schlechte Entscheidungen für Primärschlüssel.

Zum Beispiel in einer Tabelle (US) Staat Namen und Codes, entweder den Namen oder den Code könnte der Primärschlüssel sein - sie bilden zwei verschiedene Kandidatenschlüssel, und einer von ihnen (in der Regel je kürzer - der Code) sind als Primärschlüssel ausgewählt. In der Theorie der funktionalen Abhängigkeiten (und kommen Abhängigkeiten - 1NF durch 5NF - es den Kandidatenschlüssel ist, der eher als ein Primärschlüssel sind von entscheidenden Bedeutung

.

Für ein Gegenbeispiel, menschliche Namen machen im Allgemeinen eine schlechte Wahl für Primärschlüssel. Es gibt viele Menschen, die unter dem Namen „John Smith“ oder einige andere ähnliche Namen gehen; auch Mittelnamen zu berücksichtigen (zur Erinnerung: nicht jeder hat ein - zum Beispiel, ich nicht), gibt es viel Spielraum für die Vervielfältigung. Folglich verwenden die Menschen keine Namen als Primärschlüssel. Sie erfinden künstliche Schlüssel wie die Sozialversicherungsnummer (SSN) oder Mitarbeiternummer und nutzen sie die Person zu benennen.

Ein idealer Primärschlüssel ist kurz, einzigartig, unvergesslich, und natürlich. Von diesen Eigenschaften ist Einzigartigkeit obligatorisch; der Rest sind die Zwänge der realen Daten gegeben biegen.

Wenn es um die Bestimmung der Primärschlüssel einer bestimmten Tabelle kommt daher muss man schauen, was die Tabelle darstellt. Welcher Satz oder Sätze von Spaltenwerte in der Tabelle identifiziert eindeutig jede Zeile in der Tabelle? Das sind die Schlüsselkandidaten. Nun, wenn jeder Kandidat Schlüssel von 4 oder 5 Spalten besteht, dann könnten Sie sich entscheiden, dass diejenigen sind zu plump einen guten Primärschlüssel (in erster Linie aus Gründen der Kürze) zu machen. Unter diesen Umständen könnten Sie einen Ersatzschlüssel einführen - eine künstlich erzeugte Zahl. Sehr oft (aber nicht immer) ein einfaches 32-Bit-Integer ist für den Ersatzschlüssel ausreichend. Sie dann diesen Ersatzschlüssel als Primärschlüssel bezeichnen.

Allerdings Sie muss sorgen nach wie vor, dass die anderen Kandidaten Schlüssel (für den Ersatzschlüssel ein Kandidatenschlüssel ist auch, sowie die gewählte Primärschlüssel) sind alle als eindeutige Kennung erhalten - in der Regel, indem eine eindeutige Einschränkung auf jene Gruppen von Spalten.

Manchmal finden die Menschen es schwierig zu erkennen, was eine Reihe einzigartig macht, aber es sollte etwas sein, das zu tun, weil einfach eine Information Wiederholung macht es nicht mehr wahr. Und wenn du nicht aufpasst und erhalten Sie zwei (oder mehr) Zeilen die gleichen Informationen zu speichern, vorgeblich, und Sie müssen dann die Informationen aktualisieren, besteht die Gefahr, (vor allem, wenn Sie Cursor verwenden), die Sie nur eine Zeile aktualisieren jede Zeile statt, so dass die Zeilen aus Synchronie und niemand weiß, welche Zeile die richtige Information enthält.

Dies ist eine ziemlich harte Linie Ansicht, in mancher Hinsicht.

Ich habe kein besonderes Problem mit einer GUID zu verwenden, wenn sie benötigt werden, aber sie neigen dazu, groß (wie in 16 bis 64 Bytes), und sie sind auch oft verwendet. Sehr oft ein ganz guter 4-Byte-Wert ausreichen würde. eine GUID in dem ein 4-Byte-Wert Abfälle Speicherplatz ausreichen würde, und sogar einen Index den Zugriff auf die Daten verlangsamt bis da es weniger Werte pro Indexseite sind, so wird der Index tiefer und mehr Seiten werden müssen die zu lesenden zu erhalten Informationen.

Das ist nur eine religiöse Frage, weil die Menschen eine universelle richtige Antwort zu suchen. Die Tatsache, dass sowohl Ihr Team und das SO-Thread zeigt so viel Uneinigkeit ein Anhaltspunkt sein sollte, dass es gute Gründe gibt, alle Lösungen zu verwenden, die Sie beschreiben, in anderen Umständen.

  • Surrogate Schlüssel nützlich sind, wenn kein anderes Attribut oder eine Gruppe von Attributen in der Tabelle geeignet ist Zeilen eindeutig zu identifizieren.
  • sind natürliche Schlüssel bevorzugt, wenn möglich, die Tabelle mehr Menschen lesbar zu machen. Natürliche Tasten können auch die Fremdschlüssel in einer abhängigen Tabelle einen realen Wert anstelle eines Surrogat-ID enthalten. Z.B. wenn Sie benötigen state (CA, TX, NY) speichern Sie auch einen char(2) natürlichen Schlüssel anstelle eines int verwenden können.
  • Verwenden Sie Verbindung Primärschlüssel gegebenenfalls. Verwenden Sie keine „id“ Ersatzschlüssel unnötig hinzuzufügen, wenn eine ganz gute Verbindung Schlüssel vorhanden ist (dies gilt vor allem in many-to-many-Tabellen). Ein Mandat für einen Drei-Säulen-Schlüssel in jeder Tabelle ist absoluter Unsinn.
  • GUIDs ist eine Lösung, wenn Sie Eindeutigkeit über mehrere Standorte erhalten müssen. Sie sind auch praktisch, wenn Sie Werte im Primärschlüssel müssen eindeutig sein, aber nicht bestellt oder in Folge.
  • INT vs. BIGINT: es ist nicht üblich, dass eine Tabelle erfordert ein 64-Bit-Bereich für Primärschlüssel, aber mit der zunehmenden Verfügbarkeit von 64-Bit-Hardware sollte es nicht eine Last sein, und gibt mehr Sicherheit, dass Sie nicht überlaufen. INT ist natürlich kleiner, so dass, wenn Raum an einer Prämie ist, kann es einen leichten Vorteil.

Ich mag Der Datenbank-Programmierer Blog als Quelle für diese Art von Informationen.

3 Spalten für einen Primärschlüssel? Ich würde sagen, dass Spalten entsprechende eindeutige Einschränkungen als Geschäftsregeln Nachfrage haben sollten, aber ich würde immer noch einen separaten Ersatzschlüssel habe. Verbindung Tasten bedeuten Geschäftslogik in den Schlüssel gelangt. Wenn die Logik ändert, Ihr ganzes Schema aufgeschraubt ist.

Ich mag meine einzigartig.

ich immer mit dem Ersatzschlüssel gehen. Ein Ersatzschlüssel (in der Regel einer Identitätsspalte, Autoinkrement oder GUID) ist ein, in der der Schlüssel nicht in den Daten selbst ist. Eine natürliche Schlüssel, auf der anderen Seite, ist eine, die von sich aus, die Zeile eindeutig identifiziert. So nahe, wie ich im Leben sagen kann, gibt es kaum real natürlichen Schlüssel. Nicht einmal Dinge wie SSN in den Vereinigten Staaten ist ein natürlicher Schlüssel. Composite Primärschlüssel sind eine Katastrophe warten geschehen. Sie können keine dieser Daten bearbeiten (das ist der Hauptnachteil von jedem natürlichen Schlüssel ist, Composite oder nicht), aber schlimmer ist, dass mit einem zusammengesetzten Schlüssel, jetzt müssen Sie feststellen, dass Schlüsseldaten in jede verknüpften Tabelle verewigen. Was für ein Riesen-Abfall.

Nun, für die Auswahl des Ersatzschlüssels, ich bleibe mit Identitätsspalten (Ich arbeite hauptsächlich in MS SQL Server). GUID sind zu groß und Microsoft empfiehlt vor sie als PK verwenden. Wenn Sie mehrere Server haben, alles, was Sie tun müssen, ist die Schrittweite machen 10 oder 20 oder was auch immer denken, dass Sie die maximale Anzahl der Server, die Sie jemals, synchronisieren / erweitern müssen und inc nur den Samen für jede Tabelle auf jedem nachfolgenden Server , und Sie werden nie eine Datenkollision haben.

Natürlich wegen des Zuwachses, ich mache die Identitätsspalte ein BigInt (auch bekannt als lang [64 Bit]).

ein bisschen Mathe tun, auch wenn Sie das Schrittweite 100 zu machen, können Sie immer noch 92.233.720.368.547.758 haben (> 92 Billi) Zeilen in Ihrer Tabelle.

Ich denke, die Verwendung des Wortes „Primary“ in der Phrase „Primary“ Key im eigentlichen Sinne ist, irreführend.

Verwenden Sie zunächst die Definition, dass ein „Schlüssel“ ist ein Attribut oder Attribute festgelegt, die in der Tabelle eindeutig sein muss,

mehrere oft gegenseitig inkonsistent Zwecke

Dann dient eine Taste aufweist.

  1. Zur Verwendung als Bedingungen an einem oder mehrere Datensätze in den Kindern Tabellen verknüpft, die eine Beziehung zu dieser übergeordneten Tabelle hat. (Explizit oder implizit einen Fremdschlüssel in den untergeordneten Tabellen definieren)
  2. (bezogen), dass die untergeordneten Datensätze Sicherung muss einen übergeordneten Datensatz in der übergeordneten Registerkarte haben; e (Das Kind Tabelle FK als Schlüssel in der Elterntabelle vorhanden sein muss)
  3. Um perforamce von Abfragen zu erhöhen, die eine bestimmte Datensatz / Zeile in der Tabelle zu schnell lokalisieren müssen.

  4. Um die Datenkonsistenz sicherzustellen, indem sie doppelte Zeilen zu verhindern, die die gleiche logische Einheit repräsentieren aus Itno die Tabelle eingefügt werden. (Dies ist oft eine „natürliche“ Schlüssel bezeichnet und sollte aus Tabelle (Einheit bestehen) Attribute, die sind relativ invariant.)

klar, jedes nicht-meaningfull, nicht-natürliche Schlüssel (wie ein GUID oder eine automatisch erzeugten ganze Zahl ist völlig unfähig befriedigend # 4.

Aber oft mit vielen (meist) Tabellen, ein völlig natürlichen Schlüssel, die # 4 werden bestehen oft aus mehreren Attributen und seine übermäßig breit zur Verfügung stellen kann, oder so breit, dass die Verwendung für Zwecke # 1, # 2 oder # 3 wird inakzeptable Leistung consequencecs verursachen.

Die Antwort ist einfach. Verwende beide. Verwenden Sie einen einfachen Auto-Generierung integralen Schlüssel für all Verbindungen und FKs in anderen untergeordneten Tabellen, sondern sicherzustellen, dass jede Tabelle, die Datenkonsistenz (sehr wenige Tabellen nicht) hat einen alternativen natürlichen eindeutigen Schlüssel erfordert, die Einsätze von inkonsistenten Datenzeilen zu verhindern. .. plus, wenn Sie immer beide haben, dann werden alle Einwände gegen einen natürlichen Schlüssel (was ist, wenn sie sich ändert? ich habe jeden Ort zu ändern, es als FK verwiesen wird) werden strittig, wie man es nicht für die Verwendung sind. .. Sie verwenden sie nur in dem einen Tisch, an dem es sich um eine PK ist, inkonsistent duplciate Daten zu vermeiden ...

In Bezug auf GUIDs, sehr vorsichtig sein mit ihnen, wie guids in einem Index verwenden, können Indexfragmentierung Schlauch. Die am häufigsten verwendeten Algorithmen verwendet, um sie zu erstellen setzen den „random“ Teil der GUID in der höchstwertigen Bitpositionen ... Dies erhöht die Anforderung für die regelmäßige Defragmentierung Index / Reindizieren als neue Zeilen hinzugefügt werden.

Ein wenig Off-Topic, aber ich fühle mich gezwungen, im Einklang steht ...

Wenn Ihr Primärschlüssel ist eine GUID, nicht macht es zu einem Clustered-Index . Da GUIDs nicht sequentiell sind, werden die Daten, die während fast jedem Einsatz auf der Festplatte neu angeordnet. (Yuck). Wenn GUIDs als Primärschlüssel verwenden, sollten sie nicht gruppierte Indizes werden.

Eine Sache sollten Sie nie tun, ist eine Smart-Schlüssel verwenden. Das ist ein Schlüssel, wo Informationen über den Datensatz in dem Schlüssel codierten selbst, und es werden Sie schließlich beißen.

Ich arbeitete einen Ort, an dem der Primärschlüssel die Konto-ID war, die eine Kombination aus Buchstaben und Zahlen war. Ich erinnere mich an keine Besonderheiten, sondern zum Beispiel jener Konten, die von einem bestimmten Typ, würden im 600 Bereich liegen, und einen anderen Typen, begann mit 400. Das war toll, bis dass der Kunde für beide fragt entschieden Arten von Arbeit. Oder die Art der Arbeit, die sie taten geändert.

Ein weiterer Ort, verwendet, um die Lage im Baum als Primärschlüssel für Datensätze. So gäbe es Aufzeichnungen wie die folgenden sein.

Cat1.subcatA.record1
Cat1.subcatA.record2
Cat1.subcatB.record1
Cat2.subcatA.record1

Natürlich ist das erste, was die Kunden wollten, war eine Möglichkeit, Elemente in der Struktur zu bewegen. Der gesamte Satz von Software starb, bevor das passiert ist.

Bitte, bitte, bitte, wenn Sie Code schreiben, die ich je zu halten haben, können Sie nicht über eine Smart-Key verwenden!

Ich bin ein Fan des Autoinkrement als Primärschlüssel. Ich weiß tief in meinem Herzen, dass dies ein Rückzieher, aber es macht es so einfach von Daten zu sortieren, wenn es wurde hinzugefügt (ORDER BY ID DESC, f'r Beispiel).

3 Spalten klingt furchtbar hart menschlich Parse.

Und das ist der Kompromiss - wie viel von den relationalen Fähigkeiten brauchen Sie, im Vergleich zu dieser Tabelle RIGHT HERE verständlich an einem Menschen macht es Abfragen (im Vergleich zu der gespeicherten Prozedur oder programmatischer Schnittstelle)

.

Autoinkrement ist für uns Menschen. : - (

Im Allgemeinen ist es abhängig ist.

Persönlich Ich mag autoincrement Ints.

Aber eine Sache, die ich Ihnen sagen kann, ist, nie das Vertrauen Daten aus anderen Quellen als Schlüssel. Ich schwöre, jedes Mal, die ich getan habe, dass es mich zurück zu beißen kommt. Nun, nie wieder!

  

Es sollte atleast 3 Spalten, die die Primärschlüssel bilden.

Ich verstehe das nicht.

Sprechen Sie über einen „natürlichen Schlüssel“, z.B. „Name und Geburtsdatum“? Ein natürlicher Schlüssel sein könnte ideal, wenn es vorhanden ist, aber die meisten Kandidaten für einen natürlichen Schlüssel sind entweder nicht eindeutig zuzuordnen (mehrere Personen mit dem gleichen Namen) oder nicht konstant (kann jemand ihren Namen ändern).

  

Int / BigInt welche autoincrement sind gut genug, um Primärschlüssel.

Ich ziehe es Guid. Ein mögliches Problem mit autoincrement ist, dass der Wert (zB „Auftrags-ID“) durch die Datenbankinstanz zugewiesen wird (zB durch die „Vertriebsdatenbank“) ... die Arbeit nicht ganz (statt Sie benötigen Verbindung Tasten starten), wenn Sie jemals Daten von mehr als eine Datenbankinstanz (zB aus mehreren Verkaufsbüros mit jeweils eigenen Datenbank).

erstellt wird, müssen fusionieren

RE GUID

Watch out, wenn dies ein wirklich wirklich wirklich sein wird wirklich große Datenbank, viel Last und schnellen Zugriff.

Bei meinem letzten Job, wo wir Datenbanken von 100 bis 500 Millionen Datensätze hatten, unsere Datenbank Jungs stark gegen GUIDs argumentiert, und für eine entsprechend dimensionierte Dezimalzahl. Sie haben das Gefühl, dass (unter Oracle) die Größenunterschied in dem internen Speicher für ein String Guid - VS- einen Dezimalwert einen spürbaren Unterschied in Lookups machen würde. (Bigger Schlüssel = tiefe Bäume zu durchqueren)

Die zufällige Natur von GUIDs reduziert auch den Füllfaktor für Indexseiten deutlich - dies erhöht dramatisch Reiß- und Disk-I / O

.

Autoinkrement-Spalten. Ich bin in der Lage zu meinem Code arbeitet nahtlos mit SQL Server oder Oracle, einem mit Identität der andere unter Verwendung von Sequenzen durch meine DAL zu machen, und ich könnte nicht glücklicher sein. Ich bin damit einverstanden, GUIDs manchmal notwendig ist, wenn Sie die Replikation tun oder das Senden von Daten weg, sie zu empfangen später afer verarbeiten.

eine selbstinkrementierende ganze Zahl genannt ‚id‘ -

Ich habe immer einen Ersatzschlüssel verwendet. Ich kann viele Gründe, sehen dies auch tun, wenn eine andere Option liegt auf der Hand:

  • Konsistenz
  • Daten unabhängig (einzigartig, nicht durch Änderungen an Format zerstört)
  • Menschen lesbare

... und kein vernünftiger Grund, nicht zu:

  • Mehrdeutigkeit in beitritt? - aliasing Tabellen ist eine bessere Praxis, IMHO
  • Optimale Tabellen? - Entfernen von einem Byte pro Eintrag vorzeitige Optimierung, IMHO
  • Per-Tabelle Entscheidung? - nicht mehr konsistent
  • Skalierung Probleme? - Eh? Warum?
  • hierarchische Datenstruktur? - Das ist eine Entnormierung, ein ganz anderes Thema Religion. Es genügt zu sagen, ich bin ein Fan in einigen Fällen in der Theorie, aber in der Praxis nie:)

vernünftige Gründe dagegen, dass ich nicht gedacht oder stoßen noch sind immer willkommen ...

Dies ist ein klassischer „es kommt“. Es gibt keine richtige Antwort für jedes Projekt. Ich mag verschiedene Dinge für verschiedene Situationen. Es hängt davon ab, ob ich einen ORM bin mit und was es unterstützt. Es hängt von der Gesamtarchitektur (verteilt oder nicht, usw.). Wählen Sie einfach eine, die Sie denken, arbeiten und sich nach streiten über Tabulatoren und Leerzeichen.

Ich neige dazu, Option # 1 oder # 3 in Abhängigkeit von der Größe, die Zahl der Menschen zu verwenden, verbinden, und ob es sich um eine mehrfache Datenbankserver Situation oder nicht.

Option # 2 nicht viel Sinn für mich. Wenn einer der drei nicht genug, um einen eindeutigen Datensatz zu identifizieren, dann ist es möglich (ohne Umweg über zusätzliche Umtriebe zu gehen) zwei haben zwei Datensätze mit den gleichen Werten in allen drei Spalten angezeigt. Wenn Sie auf einer beliebigen Kombination der drei erzwingen Eindeutigkeit wollen, dann fügen Sie einfach einen Index für sie.

Ich habe nur ein Autoinkrement-int oder eine GUID verwenden. 99% der Zeit habe ich Gebrauch Autoinkrement-int. Es ist genau das, was ich gelehrt wurde, zu verwenden, wenn ich zum ersten Mal über Datenbanken gelernt und nie in einen Grund laufe sie nicht zu verwenden (obwohl ich von Gründen, warum eine GUID besser wäre).

Ich mag Autoinkrement Ints, weil es mit der Lesbarkeit hilft. Zum Beispiel kann ich sagen, „einen Blick auf Rekord 129.383 nehmen“ und es ist ziemlich einfach für jemand zu gehen und es findet. Mit einer GUID, die fast unmöglich zu tun.

Vergangenheit eine grundlegende definitorischen Antwort, was ein ausmacht gut Primärschlüssel ist weitgehend auf die Religion und Pausenraum Argumente gelassen. Wenn Sie etwas haben, das ist und wird immer, Karte eindeutig eine einzelne Zeile, dann wird es als Primärschlüssel funktioniert. Über diesen Punkt gibt es andere Überlegungen:

  • Ist der Primärschlüssel Definition nicht zu komplex? Meidet es unnötige Komplexität im Interesse der Einführung im Anschluss an eine „Best-Practice“?
  • Gibt es eine bessere Möglichkeit Primärschlüssel, die weniger Aufwand erfordern würde, für die Datenbank zu handhaben (das heißt INTEGER vs. VARCHAR, usw.)?
  • Bin ich absolut sicher, dass die Einzigartigkeit und definiert Heit invariant meiner Primärschlüssel wird sich nicht ändern?

Die letzte ist wahrscheinlich, was die meisten Menschen ziehen Dinge wie GUIDs oder selbst aufsteigenden Integer Spalten zu verwenden, da wie Adressen auf Dinge verlassen, Telefonnummern, Vor- / Nachnamen, etc., nur um es nicht schneiden. Die einzige unveränderliche über Menschen, die ich SSNs von ist denken kann, aber dann bin ich nicht einmal zu 100% sicher über jene verbleibenden immer einzigartig.

Hoffentlich hilft Klarheit hinzufügen ...

So wie ich Primärschlüssel nähern (und ich fühle mich ist die beste) ist eine „default“ Ansatz vermeiden müssen. Das bedeutet, statt nur slapping auf einer automatisch inkrementierende Ganzzahl und nannte es einen Tag, als ich auf das Problem schauen und sagen: „Gibt es eine Spalte oder eine Gruppe von Spalten, die immer unqiue sein und wird sich nicht ändern?“ Wenn die Antwort ja ist, dann nehme ich diesen Ansatz.

Fast immer ganze Zahlen sind.

Sie haben andere gute Gründe, neben kleiner ist / schneller zu verarbeiten. Welche würden Sie lieber aufschreiben? - "404040" oder "3463b5a2-A02B-4fd4-aa0f-1d3c0450026c"

Nur wenig relevant, aber eine Sache, die ich vor kurzem angefangen habe zu tun, wenn ich kleine Zuordnungstabellen habe (im Wesentlichen diejenigen, die ENUMs im Code darstellen würden), ist, dass ich den Primärschlüssel eines char (3) oder char machen (4 ). Dann mache ich diese Primärschlüssel Vertreter des Lookup-Wertes.

Zum Beispiel habe ich ein Angebotssystem für unsere internen Sales Agents. Wir haben „Kostenkategorien“, dass jeder Kurs Position eines zugeordnet ist ... Also ich habe eine Art Lookup-Tabelle ‚tCostCategories‘ genannt, wo Primärschlüssel ist ‚MTL‘, ‚SVC‘, ‚TRV‘, ‚Steuer‘, 'ODC'. Andere Spalten in der Lookup-Tabelle speichert mehr Details, wie die normalen Englisch Bedeutungen der Codes, „Material“, „Service“, „Travel“, „Steuern“, „Sonstige direkt Kosten“, und so weiter.

Das ist wirklich schön, weil es nicht mehr Platz als ein int zu verwenden ist, und wenn Sie auf den Quelldaten suchen, Sie haben nicht die Lookup-Tabelle zu verknüpfen das Heck zu wissen, was der Wert ist. Zum Beispiel könnte ein Zitat Zeile wie folgt aussehen:

1 Part $ 40 MTL
2 OtherPartNumber $ 29.99 SVC
3 PartNumber2 $ 150 TRV

Es ist viel einfacher, dass ein int mit den Kategorien darzustellen und dann Verknüpfung 1, 2, 3 auf allen Linien - die Daten genau dort vor Ihnen, und die Leistung nicht betroffen scheint (nicht dass ich wirklich getestet haben.)

Was die eigentliche Frage geht ... Ich mag ROWGUID uniqueidentifiers. Ich bin nicht 100% bei diesem, aber nicht alle Zeilen haben interne RowGuid ist sowieso ?? Wenn ja, dann die RowGuid Verwendung würde tatsächlich weniger Platz als Ints (oder irgendetwas anderes für diese Angelegenheit.) Alles, was ich weiß, ist, dass, wenn es in Greatplains für M $ verwenden, gut genug ist, dann ist es gut genug für mich. (Should I Ente ??)

Oh ein Grund mehr, ich GUIDs verwenden - ich verwende eine hierarchische Datenstruktur. Das heißt, ich habe eine Tabelle ‚Unternehmen‘ und eine Tabelle ‚Vendor‘ für die die Primärschlüssel übereinstimmen. Aber ich habe auch eine Tabelle ‚Hersteller‘, die auch ‚erbt‘ von Unternehmen. Die Felder, die gemeinsam sind Anbieter und Hersteller erscheinen nicht in diesen Tabellen - sie erscheinen in Unternehmen. In diesem Setup int die Verwendung ist viel schmerzhafter als Guids. In allerwenigsten, können Sie keine Identität Primärschlüssel verwendet werden.

Ich mag natürlichen Schlüssel, wenn ich ihnen vertrauen kann. Ich bin bereit, einen kleine Leistung zum Preis von Preis zu zahlen, um Schlüssel zu verwenden, den Sinn für die Fachexperten machen.

Bei Tabellen, die Entitäten beschreiben, sollte es ein einfacher natürlichen Schlüssel sein, der Gegenstand Menschen tun einzelne Instanzen die gleiche Art und Weise identifiziert. Wenn der Gegenstand nicht über vertrauenswürdige Bezeichner für eines der Unternehmen, dann werde ich auf einen Ersatzschlüssel greifen.

Bei Tabellen, die Beziehungen beschreiben, verwende ich eine Verbindung Schlüssel, wobei jede Komponente eine Entität verweist, die in der Beziehung beteiligt ist, und damit eine Zeile in einer Objekt-Tabelle. Auch hier treffen die Leistung durch einen Verbundschlüssel für die Verwendung ist in der Regel minimal.

Wie andere haben darauf hingewiesen, der Begriff „Primärschlüssel“ ist ein wenig irreführend. Im relationalen Datenmodell, der Begriff, der verwendet wird ist „Schlüsselkandidaten“. Dafür kann es mehrere Kandidaten Schlüssel für eine einzige Tabelle sein. Logischerweise ist jeder genauso gut wie der andere. Die Wahl einer von ihnen als „primäre“ und machen Sie alle Verweise über diesen Schlüssel ist einfach eine Wahl der Designer machen kann.

Guids.period.

Für den Fall, dass Sie brauchen, um zu skalieren oder Sie müssen die Primärschlüssel durch abwechselndes zuweisen bedeutet, dass sie dein Freund sein. Sie können sonst Indizes für alles hinzuzufügen.


update meine Aussage zu klären.

Ich habe auf vielen verschiedenen Arten von Websites gearbeitet. Von kleinen einzelnen Server-Angeboten bis hin zu groß diejenigen mit mehrere DB und Web-Servern unterstützt. Es gibt sicherlich apps gewesen, die mit automatischer Inkrementierung Ints als Primärschlüssel ganz gut gewesen wäre. diejenigen, nicht jedoch passen das Modell, wie ich Dinge tun.

Wenn Sie eine GUID verwenden, können Sie die ID überall erzeugen. Es könnte von einem Remote-Server, Ihre Webanwendung an, innerhalb der Datenbank selbst oder auch in mehreren Datenbanken in einer Multi-Master-Situation erzeugt werden.

Auf der anderen Seite, ein Auto erhöhte INT kann nur sicher in der primären Datenbank generiert werden. Auch dies könnte in Ordnung sein, wenn Sie eine Anwendung, die eng mit diesem einen Träger DB-Server gebunden werden und ist horizontale Skalierung nicht etwas, das Sie mit betroffen sind.

Sicher, Verwendung von GUIDs meinen Sie nächtlichen reindexing Prozesse haben müssen. wenn Sie etwas jedoch anders als ein Auto verwenden erhöht INT Sie das sowieso tun sollten. Heck, sogar mit einem INT als primäre ist es wahrscheinlich, Sie haben andere Indizes, die mit der Fragmentierung beschäftigen regenerierten müssen. Daher wird genau GUIDs nicht mit einem anderen Problem hinzufügen, da diese Aufgaben unabhängig durchgeführt werden müssen.

Wenn Sie einen Blick auf die größeren apps da draußen werden Sie etwas Wichtiges feststellen: Sie alle nutzen Base64 GUIDs als Schlüssel codiert. Der Grund dafür ist einfach, Verwendung von GUIDs Sie aus leicht zu skalieren ermöglicht Erwägung, dass es eine Menge von Reifen sein, durch zu springen, wenn INTs zu skalieren versuchen.

Unsere neueste App geht durch eine Phase der schweren Einsätze, die für etwa einen Monat dauert. Nach diesem 90 +% der Abfragen sind alle wählen für die Berichterstattung. Zur Erhöhung der Kapazität kann ich während dieses großen Einsatzzeitraumes zusätzlichen DB-Server bringen; und später leicht diejenigen in eine einzige DB verschmilzt für die Berichterstattung. Der Versuch, das zu tun, mit INTs wäre ein absoluter Alptraum.

Ganz ehrlich, Sie jederzeit eine Datenbank oder Setup-Replikation Cluster der DB-Server verlangen wird, dass Sie GUIDs auf dem Tisch sowieso haben. Also, wenn Sie denken, dass Ihr System muss möglicherweise wachsen dann die eine auswählen, die gut ist.

Dies ist ein komplexes Thema, ob Sie es realisieren oder nicht. Könnte auf dieser Stackoverflow FAQ unter dem Abschnitt fallen.

Welche Fragen sollte ich hier nicht fragen?

Vermeiden Sie Fragen zu stellen, die subjektiv sind, argumentative, oder erfordern erweiterte Diskussion. Dies ist ein Ort für Fragen, die beantwortet werden können!

Dies ist seit Jahren diskutiert und wird auch weiterhin jahrelang diskutiert werden. Die einzigen Hinweise Konsens ich gesehen habe, ist, dass die Antworten etwas vorhersehbar sind, je nachdem, ob Sie eine OO Kerl fragen (GUIDs sind der einzige Weg zu gehen!), Eine Daten Modellierer (Natural Tasten sind der einzige Weg zu gehen!), oder eine leistungsorientierte DBA (INTs ist der einzige Weg zu gehen!).

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