DB: Um Identitätsspalte zu verwenden oder nicht?

7

Beim Entwerfen einer Tabelle sagt mein Kollege hier, dass ich die Identitätsspalte vermeiden sollte, da sie spezifisch für SQL Server und MS Access ist. Aber ich unterscheide mich mit seinen Ansichten, da es meine Codierung einfacher macht.

Sollte ich Identitätsspalte verwenden oder nicht? Wenn nicht, was ist der beste Weg, die Identitätsspalten vom Anwendungscode zu erstellen?

    
Kishork 09.10.2008, 08:14
quelle

5 Antworten

10

Sie können eine Anwendung nicht vollständig vom Datenbankanbieter trennen. Wenn Sie dies tun, können Sie die Vorteile der von Ihrer Datenbank bereitgestellten Funktionen nicht nutzen.

Ich würde sagen, verwenden Sie die Identitätsspalte. Wenn Sie beispielsweise zu Oracle wechseln, können Sie eine Sequenz verwenden. Kaum eine große Veränderung.

Ich weiß nicht, welche Technologie Sie verwenden, aber eine Sache, die helfen würde, ist ein Tool wie Hibernate oder iBATIS (ich denke, dass sie beide für Java und .NET verfügbar sind), die Sie ein wenig voneinander trennt die Details der Datenbankimplementierung. Wenn Sie dann den Datenbankanbieter wechseln, müssen Sie den Anwendungscode nicht ändern, nur die Konfiguration. (In der Theorie zumindest!)

    
user7094 09.10.2008, 08:18
quelle
5

Ist es wichtig, dass es spezifisch für die Microsoft-Plattform ist? Soll Ihre Anwendung portabel sein, d. H. Planen Sie, sie auf mysql / postgres / was auch immer zu migrieren?

    
MDCore 09.10.2008 08:18
quelle
5

Verwenden Sie die Identity-Spalte!

Es trennt Ihre "Anwendungslogik" von "Geschäftslogik".

Nehmen wir an, Sie verwenden "E-Mail" als Primärschlüssel (was im Sinne von "Geschäftslogik" sinnvoll ist). Sie werden in Schwierigkeiten geraten, wenn diese E-Mail nicht mehr existiert und Ihr Benutzer Ihre E-Mail bearbeiten möchte.

    
Ekkmanz 09.10.2008 08:47
quelle
3

Soweit mir bekannt ist, hat jedes etwas ernste RDBMS eine Art eindeutiges Nummerierungsschema pro Tabelle.

  1. Access und SQL Server haben Identitätsspalten
  2. MySQL hat automatische Inkrementspalten
  3. PostgreSQL hat Sequenzen
  4. sqlite hat eine implizite ROWID-Spalte
  5. Oracle hat eine Art Sequenz, obwohl ich mich überhaupt nicht damit auskenne

Ich benutze es meistens, theoretisch ist es nicht immer eine Voraussetzung, aber wenn Sie referentielle Integrität beibehalten wollen, ist ein int weniger zu speichern und einfacher zu vergleichen als ein varchar, besonders wenn Ihre Fremdschlüssel komplexer als eine einzelne Spalte wären.

    
Kris 09.10.2008 08:45
quelle
2

Verwenden Sie keine Identitätsspalte, es sei denn, Sie sind sich dessen Fallstricke voll bewusst und haben keinen triftigen Grund, SEQUENCE oder einen emulierten Sequenzgenerator zu verwenden.

Sequenzen sind viel flexibler und haben nicht die Nachteile / Einschränkungen, die Identity-Spalten haben.

Von Ссылка :

  

Der Schmerz beim automatischen Inkrementieren

     

Kopieren von Daten während   Identitätswert erhalten

     

Automatisch inkrementierende Tasten können zu a   Schmerz, wenn Sie das ganze kopieren müssen   Tabellen und bewahren Sie den Primärschlüssel   Wert. Versuche, direkt in einzufügen   Eine Identitätsspalte führt zu a   Fehler wird ausgelöst. In der Regel die   Der Hersteller stellt einige Anweisungen zur Verfügung   Erlauben Sie Ihnen, vorübergehend die   Einschränkung, so dass Sie vorhandene einfügen können   Werte. In MSSQL können Sie die   Befehl

     

"SET IDENTITY_INSERT Produkte EIN".

     

Bei anderen Anbietern müssen Sie ablegen   die Einschränkung und dann wieder aktivieren.

     

Mehr Schmerz - wie man den Wert von   neu eingefügte Zeilen?

     

Zusätzlich der Server normalerweise   bietet verschiedene Möglichkeiten zum Abrufen   der Wert der Identitätsspalte für ein neu   eingefügte Zeile. Für MySQL ist dies die   LAST_INSERT_ID () -Funktion und für   MSSQL ist es @@ Identität zB auswählen   @@ Identität.

MS SQL Server 2011 unterstützt SEQUENCE.

Wenn Sie einen RDBMS-Server verwenden, der SEQUENCE nicht unterstützt (wie MSSQL vor 2011 oder MySQL), gibt es zwei Alternativen:

  1. Wechseln Sie zu PostgreSQL . Dies ist die einfachste Option, wirklich. Sie erhalten einen vollständig offenen RDBMS-Server der Enterprise-Klasse. Und Sie können kommerzielle Unterstützung auch haben, wenn Sie wollen.
  2. Verwenden Sie eine Datenzugriffsbibliothek, die das Emulieren von SEQUENCE unterstützt . JPA 2.0 Implementierungen, z.B. EclipseLink , Hibernate machen das ist für Sie sehr trivial (TABLE-Strategie) . Es schließt sich nicht mit dem oben genannten aus. Die Verwendung von JPA 2.0 mit PostgreSQL wird Ihr Leben so viel einfacher machen als, sagen wir, rohe JDBC mit MySQL.
Hendy Irawan 06.04.2011 08:52
quelle

Tags und Links