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?
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!)
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.
Soweit mir bekannt ist, hat jedes etwas ernste RDBMS eine Art eindeutiges Nummerierungsschema pro Tabelle.
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.
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:
Tags und Links database design-patterns