Namenskonventionen für Datenbanken, Tabellen und Spalten? [geschlossen]


791

Wenn ich eine Datenbank entwerfe, frage ich mich immer, ob es eine beste Möglichkeit gibt, ein Element in meiner Datenbank zu benennen. Sehr oft stelle ich mir folgende Fragen:

  1. Sollten Tabellennamen Plural sein?
  2. Sollten Spaltennamen singulär sein?
  3. Soll ich Tabellen oder Spalten voranstellen?
  4. Sollte ich bei der Benennung von Elementen einen Fall verwenden?

Gibt es empfohlene Richtlinien für die Benennung von Elementen in einer Datenbank?


7
Ich denke, wir sollten Plural für Tabellen und Singular für Spalten nennen.
AZ_

7
Ich sehe eine Tabelle als "Speicher" mit mehreren Elementen, nicht als einzelne "Entität", daher nenne ich sie Plural. Wenn ich Tabellen Objekten zuordnete, nannte ich die Objekte Singular. Dies ist nur meine persönliche Meinung.
dpp

2
@Tryinko Die Verwendung von ID überall ist LIVING HELL für alle, die Verknüpfungen mehrerer Tabellen durchführen. Es gibt keine Möglichkeit, dass der leichte Vorteil, dies zu wissen, die PK ist, den unglaublichen Ärger überwiegt, die Dang-ID-Spalte in jeder blutigen Abfrage immer wieder neu zu aliasen. Wenn Sie eine Möglichkeit haben möchten, PK in einer Tabelle zu kennzeichnen, machen Sie sie zur ersten Spalte. Die Bezeichnung von FKs in den Namen von Spalten ist für mich ein weiteres absolut böses Anti-Muster.
ErikE

2
Schauen Sie sich diese Antwort an .
PerformanceDBA

Antworten:


315

Ich empfehle, die SQL Server-Beispieldatenbanken von Microsoft zu überprüfen: https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks

Das AdventureWorks-Beispiel verwendet eine sehr klare und konsistente Namenskonvention, die Schemanamen für die Organisation von Datenbankobjekten verwendet.

  1. Singularnamen für Tabellen
  2. Singuläre Namen für Spalten
  3. Schemaname für Tabellenpräfix (zB: SchemeName.TableName)
  4. Pascal-Hülle (auch bekannt als oberes Kamelgehäuse)

14
wilsonmar.com/sql_adventureworks.htm ist eine hervorragende Analyse des AdventureWorks-Schemas.
Daniel Trebbien

209
Ich würde mich bei keinem Standard auf Microsoft verlassen. Wenn Sie sich die Nordwind-Datenbank ansehen, werden Sie feststellen, dass sie mehrere Tabellen, einzelne Spaltennamen, Schema-Präfixe für Tabellen, Tabellenpräfixe für Primärschlüsselspalten, ungarisch anmutende Einschränkungspräfixe und das Schlimmste verwenden aller SPACES "" für Tabellennamen mit mehreren Wörtern. Zusätzlich verwenden Systemtabellen für SQLServer Pluralformen, sodass AdventureWorks anscheinend das schwarze Schaf in diesem Haufen war.
Marcus Pope

63
Ich denke, das Hauptproblem hierbei ist, dass die Menge der Singular-Tabellennamen die Tabelle eher als Entität zu betrachten scheint als die Zeile in der Tabelle, die die Plural-Menge tut. Sie müssen sich fragen, was es ist. Wenn die Tabelle nur ein Container mit Zeilen ist, ist es nicht logischer, mehrere Namen zu verwenden? Sie würden niemals eine Sammlung im Code Singular benennen. Warum würden Sie dann die Tabelle Singular benennen? Warum die Inkonsistenz? Ich höre alle Argumente darüber, wie sie in Verknüpfungen sortiert und verwendet werden, aber diese scheinen alle sehr schwache Argumente zu sein. Wenn es auf die Präferenz ankommt, werde ich mit der Konsistenz gehen und pluralisieren.
Jason

4
Überlegen Sie auch, in welche Richtung die Flut geht. Es scheint in Richtung mehrerer Tabellennamen zu gehen, zumal alle Systemtabellen in SQL Server alle plural sind und die Standardeinstellung für Entity Framework standardmäßig plural ist. Wenn das die Haltung von Microsoft ist, möchte ich in die Richtung gehen, in der wir in 20 Jahren sein werden. Sogar die Datenbankkonventionen von Oracle enthalten mehrere Tabellennamen. Stellen Sie sich vor, wie viele C # -Entwickler das Schlüsselwort "var" bei seiner Einführung gehasst haben. Jetzt ist es die allgemein akzeptierte Methode, Variablen zu definieren.
Jason

7
@Jasmine - Ich sehe Ihren Standpunkt, obwohl ich denke, dass Sie Ihre Beispieltabelle versehentlich rückwärts benannt haben. "TableOfInvoices" sollte zu "Invoices" gekürzt werden, was ich bevorzuge. Sie meinten wahrscheinlich stattdessen "InvoiceTable", was sinnvoll ist, um "Invoice" zu kürzen.
Derek

279

Späte Antwort hier, aber kurz:

  1. Ich bevorzuge den Plural
  2. Ja
  3. Tabellen : * Normalerweise * sind keine Präfixe am besten. Spalten : Nein.
  4. Sowohl Tabellen als auch Spalten: PascalCase.

Ausarbeitung:

(1) Was müssen Sie tun? Es gibt sehr wenige Dinge, die Sie jedes Mal auf eine bestimmte Weise tun müssen , aber es gibt einige.

  • Benennen Sie Ihre Primärschlüssel im Format "[singularOfTableName] ID". Das heißt, unabhängig davon, ob Ihr Tabellenname Kunde oder Kunden ist , sollte der Primärschlüssel CustomerID sein .
  • Außerdem müssen Fremdschlüssel in verschiedenen Tabellen konsistent benannt werden. Es sollte legal sein, jemanden zu verprügeln, der dies nicht tut. Ich würde behaupten, dass definierte Fremdschlüsseleinschränkungen oft wichtig sind, aber eine konsistente Benennung von Fremdschlüsseln immer wichtig ist
  • Ihre Datenbank muss interne Konventionen haben . Obwohl Sie in späteren Abschnitten sehen werden, dass ich sehr flexibel bin , muss die Benennung innerhalb einer Datenbank sehr konsistent sein. Ob Ihre Tabelle für Kunden Kunden oder Kunden heißt, ist weniger wichtig, als dass Sie dies in derselben Datenbank auf dieselbe Weise tun. Sie können eine Münze werfen, um zu bestimmen, wie Unterstriche verwendet werden sollen, aber dann müssen Sie sie auf die gleiche Weise weiter verwenden . Wenn Sie dies nicht tun, sind Sie eine schlechte Person, die ein geringes Selbstwertgefühl haben sollte.

(2) Was Sie wahrscheinlich tun sollten.

  • Felder, die dieselbe Art von Daten in verschiedenen Tabellen darstellen, sollten den gleichen Namen haben. Keine Postleitzahl auf einem Tisch und Postleitzahl auf einer anderen.
  • Verwenden Sie PascalCasing, um Wörter in Ihren Tabellen- oder Spaltennamen zu trennen. Die Verwendung von camelCasing wäre an sich nicht problematisch, aber das ist nicht die Konvention und es würde lustig aussehen. Ich werde gleich auf Unterstriche eingehen. (Möglicherweise verwenden Sie ALLCAPS nicht mehr wie früher. OBNOXIOUSTABLE.ANNOYING_COLUMN war vor 20 Jahren in DB2 in Ordnung, aber jetzt nicht mehr.)
  • Kürzen oder kürzen Sie Wörter nicht künstlich. Es ist besser, wenn ein Name lang und klar ist als kurz und verwirrend. Ultrakurznamen sind ein Überbleibsel aus dunkleren, wilderen Zeiten. Cus_AddRef. Was um alles in der Welt ist das? Referenzadresse des Verwalters? Zusätzliche Rückerstattung durch den Kunden? Überweisung von benutzerdefinierten Adressen?

(3) Was Sie beachten sollten.

  • Ich denke wirklich, Sie sollten Pluralnamen für Tabellen haben; Einige denken einzigartig. Lesen Sie die Argumente an anderer Stelle. Spaltennamen sollten jedoch singulär sein. Selbst wenn Sie mehrere Tabellennamen verwenden, befinden sich Tabellen, die Kombinationen anderer Tabellen darstellen, möglicherweise im Singular. Zum Beispiel, wenn Sie eine haben Promotions und einen Artikel Tabelle, eine Tabelle , die ein Element ein Teil einer Werbeaktion sein Promotions_Items sein könnte, aber es könnte auch legitim Promotion_Items sein Ich denke , (die die Eins-zu-viele - Beziehung).
  • Verwenden Sie Unterstriche konsequent und für einen bestimmten Zweck. Nur allgemeine Tabellennamen sollten mit PascalCasing klar genug sein. Sie brauchen keine Unterstriche, um Wörter zu trennen. Speichern Sie die Unterstriche entweder (a), um eine assoziative Tabelle anzugeben, oder (b), um Präfixe zu erstellen, auf die ich im nächsten Punkt eingehen werde.
  • Das Präfix ist weder gut noch schlecht. Es ist normalerweise nicht das Beste. In Ihrer ersten oder zweiten Datenbank würde ich nicht empfehlen, Präfixe für die allgemeine thematische Gruppierung von Tabellen zu verwenden. Tabellen passen am Ende nicht leicht zu Ihren Kategorien, und es kann tatsächlich schwieriger sein, Tabellen zu finden. Mit Erfahrung können Sie ein Präfixschema planen und anwenden, das mehr nützt als schadet. Ich arbeitete in einem db einmal , wo Datentabellen mit begannen Tabl , Config - Tabellen mit LBTE , Ansichten mit VEW , proc des sp und UDF fnund einige andere; es wurde akribisch und konsequent angewendet, so dass es gut funktionierte. Das einzige Mal, dass Sie Präfixe benötigen, ist, wenn Sie wirklich separate Lösungen haben, die sich aus irgendeinem Grund in derselben Datenbank befinden. Das Präfixieren kann beim Gruppieren der Tabellen sehr hilfreich sein. Das Präfixieren ist auch für spezielle Situationen in Ordnung, z. B. für temporäre Tabellen, die Sie hervorheben möchten.
  • Sehr selten (wenn überhaupt) möchten Sie Spalten voranstellen.

11
"Felder, die dieselbe Art von Daten in verschiedenen Tabellen darstellen, sollten den gleichen Namen haben. Keine Zip in einer Tabelle und kein ZipCode in einer anderen." Ja ja eine Million mal ja. Können Sie sagen, dass unsere Datenbank nicht so gestaltet wurde? Auf eine Person kann auf eine von zwölf verschiedenen Arten Bezug genommen werden, was sehr ärgerlich zu pflegen ist. Ich habe mich in jeder Datenbank, in der ich die Kontrolle hatte, immer an diese Regel gehalten, und das macht das Leben viel einfacher.
HLGEM

87
Ich denke, der Primärschlüssel sollte nur "ID" sein. Eine solch einfache Konvention macht den Primärschlüssel vorhersehbar und schnell identifizierbar. Ich würde jedoch den Tabellennamen ("PersonID") voranstellen, wenn er in anderen Tabellen als Fremdschlüssel verwendet wird. Diese Konvention könnte dazu beitragen, zwischen einem Primärschlüssel und Fremdschlüsseln in derselben Tabelle zu unterscheiden.
Triynko

55
@Tryinko Die Verwendung von ID überall ist LIVING HELL für alle, die Verknüpfungen mehrerer Tabellen durchführen. Es gibt keine Möglichkeit, dass der leichte Vorteil, dies zu wissen, die PK ist, den unglaublichen Ärger überwiegt, die Dang-ID-Spalte in jeder blutigen Abfrage immer wieder neu zu aliasen. Wenn Sie eine Möglichkeit haben möchten, PK in einer Tabelle zu kennzeichnen, machen Sie sie zur ersten Spalte. Die Bezeichnung von FKs in den Namen von Spalten ist für mich ein weiteres absolut böses Anti-Muster.
ErikE

18
@Triynko Wenn Sie nur "ID" verwenden, wird es auch programmatisch unmöglich, die Tabelle zu bestimmen, zu der es gehört. Mit dem Tabellennamenpräfix können Sie einfach die letzten beiden Ziffern eines Primärschlüssels abschneiden und den Tabellennamen, zu dem er gehört, über Code kennen. IT- und DBA-Mitarbeiter erkennen häufig nicht, dass Programmierer Vorteile beim Entwerfen von Datenbanken auf bestimmte Weise haben.
Dallas

16
@ErikE Ich meine, Sie wissen nicht, ob CustomerIDes sich um den Primärschlüssel aus der CustomerTabelle oder um einen Fremdschlüssel in einer anderen Tabelle handelt. Es ist ein kleines Problem. Warum sollten Sie schlechte Namen wie verwenden wollen c? CustomerID = Customer.IDist sehr deutlich darin, dass Sie sehen, dass Sie einen Fremdschlüssel mit einem Primärschlüssel verbinden; es ist nicht redundant, da die beiden Seiten zwei verschiedene Dinge sind. Die Benennung einzelner Zeichen ist IMO eine schlechte Praxis.
Dave Cousineau

100

Ok, da wir mit der Meinung abwägen:

Ich glaube, dass Tabellennamen Plural sein sollten. Tabellen sind eine Sammlung (eine Tabelle) von Entitäten. Jede Zeile repräsentiert eine einzelne Entität, und die Tabelle repräsentiert die Sammlung. Also würde ich eine Tabelle mit Personenentitäten Personen (oder Personen, was auch immer Ihnen gefällt) nennen.

Für diejenigen, die einzelne "Entitätsnamen" in Abfragen sehen möchten, würde ich Tabellenaliasnamen verwenden für:

SELECT person.Name
FROM People person

Ein bisschen wie LINQs "von Person in Personen wählen Person.Name".

Was 2, 3 und 4 betrifft, stimme ich @Lars zu.


17
@Emtucifor: Auf Englisch sagen wir nicht "Schau dir die ganze Person da draußen in dieser Menschenmenge an!" Es ist zu erwarten, dass ein konzeptionelles Problem mit Dingen vorliegt, auf die durch ein einzelnes Wort mehrfach Bezug genommen wird. Es ist weder üblich noch richtig. "Daten" sind außergewöhnlich und werden häufig verwendet, um sich auf ein Stück eines Substanzvolumens zu beziehen, ähnlich wie "Kuchen". "Möchtest du ein Stück Kuchen?" Die Benennung einer Tabelle "Personen", da sie Informationen zu mehreren Personen enthält, ist weitaus sinnvoller als die Bezeichnung "Person". Eine Datenklasse mit dem Namen "Person" für die ROW ist ebenso sinnvoll wie einzelne Spaltennamen.
Triynko

6
@Emtucifor: Letztendlich ist jede Sprache willkürlich und konventionell. Ich habe nur argumentiert, dass wir herkömmlicherweise eine Sammlung von Gegenständen als den Plural des darin enthaltenen Gegenstandstyps bezeichnen. Eine Sammlung von Zeilen, in denen jede Zeile Informationen über eine einzelne Person enthält, wird daher als Sammlung von Personen bezeichnet. Wenn Sie es jedoch als eine Sammlung von Personen bezeichnen möchten, fahren Sie fort.
Triynko

3
@Emtucifor: Ja, lol. Die Benennung der Tabelle "PersonCollection" entspricht der Benennung als "Personen". Vergleichen Sie das mit der Benennung einer solchen Sammlung nur "Person", was keinen Sinn
ergibt

4
@Emtucifor: Dann betrachten wir es aus einem anderen Blickwinkel, um die Namenskonvention in einen Kontext zu stellen. Angenommen, Sie haben Objektklassen, um sowohl die Zeile als auch die Tabelle darzustellen. "Person" ist offensichtlich sinnvoll für die Klasse, die eine Datenzeile darstellt. Wenn Ihre Tabelle auch "Person" heißt, liegt möglicherweise ein Namenskonflikt oder eine gewisse Verwirrung vor. Ich denke nur, dass es sinnvoller ist, Objekte mit genauer Pluralität zu benennen. Eine Zeile mit Daten über eine Person sollte Person genannt werden, und eine Tabelle mit Informationen über Personen oder mehrere Personen heißt Personen, Personensammlung, Personen usw.
Triynko

5
@ Josh M. Nun, nicht so oder so. Wenn Sie meinen Weg gehen, können Sie die Personentabelle als "Person" aliasen und SELECT person.Name haben. Problem gelöst. ;-)
Matt Hamilton

73

Ich arbeite in einem Datenbank-Support-Team mit drei Datenbankadministratoren. Folgende Optionen werden in Betracht gezogen:

  1. Jeder Namensstandard ist besser als kein Standard.
  2. Es gibt keinen "einen wahren" Standard, wir haben alle unsere Vorlieben
  3. Wenn bereits ein Standard vorhanden ist, verwenden Sie ihn. Erstellen Sie keinen anderen Standard und trüben Sie die vorhandenen Standards nicht.

Wir verwenden singuläre Namen für Tabellen. Tabellen werden in der Regel der Name des Systems (oder dessen Akronym) vorangestellt. Dies ist nützlich, wenn der Systemkomplex, da Sie das Präfix ändern können, um die Tabellen logisch zu gruppieren (dh reg_customer, reg_booking und regadmin_limits).

Für Felder erwarten wir, dass Feldnamen das Präfix / Acryonm der Tabelle enthalten (dh cust_address1), und wir bevorzugen auch die Verwendung eines Standardsatzes von Suffixen (_id für die PK, _cd für "Code", _nm für "Name" ", _nb für" Nummer ", _dt für" Datum ").

Der Name des Foriegn-Schlüsselfelds sollte mit dem Primärschlüsselfeld übereinstimmen.

dh

SELECT cust_nm, cust_add1, booking_dt
FROM reg_customer
INNER JOIN reg_booking
ON reg_customer.cust_id = reg_booking.cust_id

Wenn Sie ein neues Projekt entwickeln, empfehlen wir Ihnen, alle bevorzugten Entitätsnamen, Präfixe und Akronyme aufzuschreiben und dieses Dokument Ihren Entwicklern zu geben. Wenn sie sich dann entscheiden, eine neue Tabelle zu erstellen, können sie sich auf das Dokument beziehen, anstatt zu "raten", wie die Tabelle und die Felder heißen sollen.


9
Speziell für Nummer 3 hatten wir eine Gruppe von Leuten, die alle von derselben Firma eingestellt wurden, und sie versuchten, ihren alten Namensstandard (den keiner von uns anderen verwendete) für alles aufzuzwingen, was sie taten. Sehr nervig.
HLGEM

40
Sicher macht das SQL unlesbar; aber ich denke ich kann übersetzen. cust_nm sollte CustomerName sein , booking_dt sollte BookingDate sein . reg_customer, nun ich habe keine ahnung was das ist.
Ian Boyd

3
@ Ian. Die Absicht ist, dass Sie sich an die gewohnte Namenskonvension halten und sie konsistent halten. Ich weiß IMMER, dass jedes Datumsfeld _dt ist, jedes Namensfeld _nm. 'reg' ist ein Beispiel für ein "Registrierungs" -System (Buchungen, Kunden usw.), und alle zugehörigen Tabellen hätten das gleiche Präfix. Aber jeder für sich ...
Guy

7
Ich stimme zu, dass ein bestimmter Standard nicht so wichtig ist wie ein einheitlicher Standard. Einige Standards sind jedoch falsch. DB2- und Spaltennamen wie CSPTCN, CSPTLN, CSPTMN, CSDLN. Die Leute sollten lernen, dass lange Namen erfunden wurden - wir können es uns leisten, Dinge lesbar zu machen.
Ian Boyd

17
Im Laufe der Jahre habe ich in der von mir entwickelten und vermarkteten App am Ende meiner Tabellen neue Spalten hinzugefügt. Manchmal verwende ich englische Namen in meinen Spalten, manchmal verwende ich Spanisch und manchmal verwende ich Spalten für etwas anderes wieder, anstatt sie zu löschen und eine neue Spalte mit einem geeigneten beschreibenden Namen für das, was verwendet wird, hinzuzufügen. Ich habe dies absichtlich getan, um meinen Quellcode zu OBFUSZIEREN, falls jemand anderes versucht, meinen Code zu hacken oder zurückzuentwickeln. Nur ich kann es verstehen, jemand anderes wird frustriert sein! Auf diese Weise müssen sie sich immer auf mich verlassen!
Frank R.

47
  1. Nein. Eine Tabelle sollte nach der Entität benannt werden, die sie darstellt. Person, nicht Personen ist, wie Sie sich auf denjenigen beziehen würden, den einer der Datensätze darstellt.
  2. Wieder das Gleiche. Die Spalte Vorname sollte eigentlich nicht Vorname heißen. Es hängt alles davon ab, was Sie mit der Spalte darstellen möchten.
  3. NEIN.
  4. Ja. Fall es für Klarheit. Wenn Sie Spalten wie "Vorname" benötigen, erleichtert das Gehäuse das Lesen.

OK. Das sind meine $ 0,02


5
Hinzufügen von Klarheit zu Nummer 3 - Präfixe sind eine Möglichkeit, Metadaten in den Spaltennamen einzubetten. Dies sollte in keiner modernen DB aus den gleichen Gründen wie bei (übermäßiger Verwendung) der ungarischen Notation erforderlich sein.
Mark McDonald

21
`Top 15 aus Bestellung auswählen 'oder' Top 15 aus Bestellung auswählen '? Letzteres ist meine (menschliche) Präferenz.
Ian Boyd

8
@ Ian Boyd: Ja: SELECT TOP 100 * FROM Report R INNER JOIN VisitReport VR ON R.ReportID = VR.ReportID. Es hängt alles davon ab, wie Sie darüber denken. Wenn Sie ein Bild einer Zitrone auf einen Kanister legen, wissen Sie, dass sich darin Zitronen befinden, ohne dass zwei Zitronen außen erforderlich sind, um anzuzeigen, dass es sich um Plural handeln könnte. Sicher, Sie könnten es mit dem geschriebenen Wort "Zitronen" beschriften. Aber es könnte genauso gut "Zitrone" sein. Um die Ressource "Zitrone" zu erhalten, klicken Sie hier.
ErikE

6
Fügen Sie $ 0,01 für die Verwendung von UpperCase in Spaltennamen und weitere $ 0,01 für die Verwendung von Unterstrichen in Spaltennamen hinzu, damit Spaltennamen in der Übersicht leichter unterschieden werden können. Gesamt = Meine Spende von 0,02 USD an Sie!
Frank R.

6
"Eine Tabelle sollte nach der Entität benannt werden, die sie darstellt." Eine Tabelle ist eine Sammlung von Entitäten. Während eine Tabelle auch eine Entität ist, ist sie eine Entität vom Typ "Tabelle", deren Hinzufügen zu ihrem Namen sinnlos ist.
Trisped

34

Ich bin auch für eine Namenskonvention im ISO / IEC 11179-Stil, da es sich eher um Richtlinien als um Vorschriften handelt.

Siehe Datenelementname auf Wikipedia :

"Tabellen sind Sammlungen von Entitäten und folgen den Richtlinien für die Benennung von Sammlungen. Im Idealfall wird ein Sammelname verwendet: z. B. Personal. Plural ist auch korrekt: Mitarbeiter. Zu den falschen Namen gehören: Mitarbeiter, tblEmployee und EmployeeTable."

Wie immer gibt es Ausnahmen von Regeln, z. B. eine Tabelle, die immer genau eine Zeile enthält, kann mit einem singulären Namen besser sein, z. B. eine Konfigurationstabelle. Und Konsistenz ist von größter Bedeutung: Überprüfen Sie, ob Ihr Einkauf eine Konvention hat, und befolgen Sie diese gegebenenfalls. Wenn es dir nicht gefällt, mache einen Business Case, um es ändern zu lassen, anstatt der einzige Ranger zu sein.


-1: Der referenzierte Text hat nichts mit ISO / IEC 11179 zu tun. Der referenzierten Wikipedia-Seite sollte nicht vertraut werden. Lesen Sie stattdessen den aktuellen Standard ( metadata-standards.org/11179/#A5 )
mkadunc

@onedaywhen: Ich weiß nicht genug über das Thema, um die Wikipedia-Seite zu korrigieren. Außerdem ist die Wikipedia-Seite nicht so sehr falsch als irreführend - sie besagt nicht ausdrücklich, dass ISO / IEC 11179 die Datenbankbenennungskonventionen enthält, sondern nur, dass "ISO / IEC 11179 beim Benennen von Tabellen und Spalten in a anwendbar ist relationale Datenbank". Anschließend wird ein Beispiel für Namenskonventionen bereitgestellt, die für relationale Datenbanken verwendet werden können. Es lässt Sie denken, dass das Beispiel etwas ist, das dem Standard entnommen ist, wenn es wirklich etwas ist, das vom Verfasser des Wikipedia-Artikels erfunden wurde.
mkadunc

27

Ich höre die ganze Zeit das Argument, dass es eine Frage des persönlichen Geschmacks ist, ob ein Tisch pluralisiert ist oder nicht, und es gibt keine bewährten Verfahren. Ich glaube nicht, dass das stimmt, besonders als Programmierer im Gegensatz zu einem DBA. Soweit mir bekannt ist, gibt es keine legitimen Gründe, einen Tabellennamen zu pluralisieren, außer "Es macht für mich nur Sinn, weil es sich um eine Sammlung von Objekten handelt", während Code durch singuläre Tabellennamen legitime Vorteile bringt. Zum Beispiel:

  1. Es vermeidet Fehler und Irrtümer, die durch Mehrdeutigkeiten im Plural verursacht werden. Programmierer sind nicht gerade für ihre Rechtschreibkenntnisse bekannt, und das Pluralisieren einiger Wörter ist verwirrend. Endet das Pluralwort beispielsweise mit 'es' oder nur mit 's'? Sind es Personen oder Personen? Wenn Sie mit großen Teams an einem Projekt arbeiten, kann dies zu einem Problem werden. Zum Beispiel eine Instanz, in der ein Teammitglied die falsche Methode verwendet, um eine von ihm erstellte Tabelle zu pluralisieren. Wenn ich mit dieser Tabelle interagiere, wird sie überall in Code verwendet, auf den ich keinen Zugriff habe oder dessen Behebung zu lange dauern würde. Das Ergebnis ist, dass ich daran denken muss, die Tabelle jedes Mal falsch zu buchstabieren, wenn ich sie benutze. Mir ist etwas sehr Ähnliches passiert. Je einfacher Sie es jedem Mitglied des Teams machen können, die exakten, einfachen und konsistenten Werte zu verwenden, Umso besser ist es, Tabellennamen ohne Fehler zu korrigieren oder ständig nach Tabellennamen suchen zu müssen. Die singuläre Version ist in einer Teamumgebung viel einfacher zu handhaben.

  2. Wenn Sie die singuläre Version eines Tabellennamens verwenden UND dem Primärschlüssel den Tabellennamen voranstellen, haben Sie jetzt den Vorteil, dass Sie einen Tabellennamen einfach aus einem Primärschlüssel ermitteln können oder umgekehrt, nur über Code. Sie können eine Variable mit einem Tabellennamen erhalten, "Id" bis zum Ende verketten und haben jetzt den Primärschlüssel der Tabelle per Code, ohne eine zusätzliche Abfrage durchführen zu müssen. Oder Sie können "Id" am Ende eines Primärschlüssels abschneiden, um einen Tabellennamen per Code zu ermitteln. Wenn Sie "id" ohne Tabellennamen für den Primärschlüssel verwenden, können Sie den Tabellennamen nicht über Code aus dem Primärschlüssel ermitteln. Darüber hinaus verwenden die meisten Personen, die Tabellennamen pluralisieren und PK-Spalten den Tabellennamen voranstellen, die singuläre Version des Tabellennamens in der PK (z. B. statuses und status_id).

  3. Wenn Sie Tabellennamen singulär machen, können Sie sie mit den Klassennamen übereinstimmen lassen, die sie darstellen. Dies kann wiederum den Code vereinfachen und es Ihnen ermöglichen, wirklich nette Dinge zu tun, z. B. eine Klasse zu instanziieren, indem Sie nur den Tabellennamen haben. Es macht auch nur Ihren Code konsistenter, was zu ...

  4. Wenn Sie den Tabellennamen singulär machen, wird Ihr Namensschema an jedem Ort konsistent, organisiert und einfach zu pflegen. Sie wissen, dass in jeder Instanz Ihres Codes, ob in einem Spaltennamen, als Klassenname oder als Tabellenname, genau derselbe Name angegeben ist. Auf diese Weise können Sie globale Suchvorgänge durchführen, um zu sehen, wo immer Daten verwendet werden. Wenn Sie einen Tabellennamen pluralisieren, wird es Fälle geben, in denen Sie die singuläre Version dieses Tabellennamens verwenden (die Klasse, in die er im Primärschlüssel umgewandelt wird). Es ist nur sinnvoll, einige Fälle nicht zu haben, in denen Ihre Daten als Plural und einige als Singular bezeichnet werden.

Zusammenfassend lässt sich sagen, dass Sie beim Pluralisieren Ihrer Tabellennamen alle möglichen Vorteile verlieren, wenn Sie Ihren Code intelligenter und einfacher zu handhaben machen. Es kann sogar Fälle geben, in denen Sie Nachschlagetabellen / Arrays benötigen, um Ihre Tabellennamen in Objekt- oder lokale Codenamen zu konvertieren, die Sie hätten vermeiden können. Singuläre Tabellennamen bieten, obwohl sie sich anfangs vielleicht etwas seltsam anfühlen, erhebliche Vorteile gegenüber pluralisierten Namen, und ich glaube, sie sind bewährte Methoden.


26

unsere Präferenz:

  1. Sollten Tabellennamen Plural sein?
    Noch nie. Die Argumente dafür, dass es sich um eine Sammlung handelt, sind sinnvoll, aber Sie wissen nie, was die Tabelle enthalten wird (0,1 oder viele Elemente). Mehrere Regeln machen die Benennung unnötig kompliziert. 1 Haus, 2 Häuser, Maus gegen Mäuse, Person gegen Menschen, und wir haben uns noch nicht einmal eine andere Sprache angesehen.

    Update person set property = 'value'wirkt auf jede Person in der Tabelle.
    Select * from person where person.name = 'Greg'Gibt eine Sammlung / ein Rowset von Personenzeilen zurück.

  2. Sollten Spaltennamen singulär sein?
    Normalerweise ja, außer wenn Sie gegen Normalisierungsregeln verstoßen.

  3. Soll ich Tabellen oder Spalten voranstellen?
    Meistens eine Plattformpräferenz. Wir bevorzugen es, Spalten den Tabellennamen voranzustellen. Wir stellen keine Präfixtabellen vor, aber wir machen Präfixansichten (v_) und gespeicherte_Verfahren (sp_ oder f_ (Funktion)). Das hilft Leuten, die versuchen möchten, v_person.age zu aktualisieren, was eigentlich ein berechnetes Feld in einer Ansicht ist (das sowieso nicht UPDATEd sein kann).

    Dies ist auch eine gute Möglichkeit, um eine Keyword-Kollision zu vermeiden (Delivery.from Pausen, Delivery_from jedoch nicht).

    Der Code wird dadurch ausführlicher, die Lesbarkeit wird jedoch häufig verbessert.

    bob = new person()
    bob.person_name = 'Bob'
    bob.person_dob = '1958-12-21'
    ... ist sehr lesbar und explizit. Dies kann jedoch außer Kontrolle geraten:

    customer.customer_customer_type_id

    Gibt eine Beziehung zwischen dem Kunden und der Tabelle customer_type an, gibt den Primärschlüssel in der Tabelle customer_type (customer_type_id) an. Wenn beim Debuggen einer Abfrage jemals 'customer_customer_type_id' angezeigt wird, wissen Sie sofort, woher diese stammt (Kundentabelle).

    oder wenn Sie eine MM-Beziehung zwischen customer_type und customer_category haben (für bestimmte Kategorien stehen nur bestimmte Typen zur Verfügung)

    customer_category_customer_type_id

    ... ist ein wenig (!) auf der langen Seite.

  4. Sollte ich bei der Benennung von Elementen einen Fall verwenden? Ja - Kleinbuchstaben :), mit Unterstrichen. Diese sind sehr gut lesbar und plattformübergreifend. Zusammen mit 3 oben macht es auch Sinn.

    Die meisten davon sind jedoch Vorlieben. - Solange Sie konsistent sind, sollte es für jeden vorhersehbar sein, der es lesen muss.


1
SELECT * FROM people AS person WHERE person.name = 'Greg'klingt für mich am natürlichsten.
Kenmore

1
@Zuko Meistens lautet die Namenskonvention für den Tabellenprimärschlüssel <table name><id>beispielsweise PersonIDoder Person_IDusw. Daher ist es sinnvoller, dass Sie Ihre Tabellen NICHT im Plural benennen, da jeder Datensatz eine separate Person und keine Personen ist.
Mr. Blond


15

Ich weiß, dass dies zu spät zum Spiel kommt, und die Frage wurde bereits sehr gut beantwortet, aber ich möchte meine Meinung zu # 3 bezüglich des Präfixes von Spaltennamen abgeben.

Alle Spalten sollten mit einem Präfix benannt werden, das für die Tabelle, in der sie definiert sind, eindeutig ist.

Beispiel: Bei den angegebenen Tabellen "Kunde" und "Adresse" verwenden wir die Präfixe "cust" bzw. "addr". "customer" würde "cust_id", "cust_name" usw. enthalten. "address" würde "addr_id", "addr_cust_id" (FK zurück zum Kunden), "addr_street" usw. enthalten.

Als mir dieser Standard zum ersten Mal vorgestellt wurde, war ich absolut dagegen. Ich hasste die Idee. Ich konnte die Idee dieser zusätzlichen Eingabe und Redundanz nicht ertragen. Jetzt habe ich genug Erfahrung damit, dass ich nie mehr zurückkehren würde.

Das Ergebnis ist, dass alle Spalten in Ihrem Datenbankschema eindeutig sind. Dies hat einen großen Vorteil, der alle Argumente dagegen übertrifft (meiner Meinung nach natürlich):

Sie können Ihre gesamte Codebasis durchsuchen und zuverlässig jede Codezeile finden, die eine bestimmte Spalte berührt.

Der Nutzen von # 1 ist unglaublich groß. Ich kann eine Spalte veralten und weiß genau, welche Dateien aktualisiert werden müssen, bevor die Spalte sicher aus dem Schema entfernt werden kann. Ich kann die Bedeutung einer Spalte ändern und weiß genau, welcher Code überarbeitet werden muss. Oder ich kann einfach feststellen, ob Daten aus einer Spalte überhaupt in einem bestimmten Teil des Systems verwendet werden. Ich kann nicht zählen, wie oft dies aus einem potenziell großen Projekt ein einfaches gemacht hat oder wie viele Stunden wir in der Entwicklungsarbeit gespart haben.

Ein weiterer, relativ geringer Vorteil ist, dass Sie nur Tabellen-Aliase verwenden müssen, wenn Sie einen Self-Join durchführen:

SELECT cust_id, cust_name, addr_street, addr_city, addr_state
    FROM customer
        INNER JOIN address ON addr_cust_id = cust_id
    WHERE cust_name LIKE 'J%';

1
Dann kannst du nicht mehr reliably find every line of code that touches a particular column... Ist das nicht der Punkt?
Raveren

6
@ Raveren - Das kannst du immer noch. Wenn Sie nur "SELECT *" ausführen, ist die Abfrage für diesen Zweck irrelevant. Wenn / Wenn Sie später die Ergebnisse dieser Abfrage verwenden, müssen Sie den Spaltennamen verwenden, um etwas mit den Daten zu tun. Dies ist also der Ort, um den Sie sich in Ihrem Code kümmern müssen, nicht die SQL-Anweisung.
Granger

Ich bin gespannt, in welchen Situationen SELECT * erforderlich ist. Ich würde sicher nicht wollen, dass jemand das im Produktionscode verwendet. Ja, es ist nützlich für Ad-hoc-Abfragen und um herauszufinden, durch welche Daten Ihre Ergebnisse mit mehreren Join-Abfragen ungerade sind, aber ich kann mir keinen Ort im Produktionscode vorstellen, an dem dies erforderlich ist.
HLGEM

2
Wenn Sie nicht Ihre gesamte App in einer Nicht-OO-Sprache codieren, wird dieses Argument durch eine anständige ORM-Schicht überflüssig.
Adam

6
Aufgrund dieser Antwort habe ich mich entschlossen, Tabellenpräfixe für ein großes Projekt zu verwenden, und dachte, ich würde darüber Bericht erstatten. Das Refactoring von Tischen war extrem einfach, was großartig war! Es war jedoch ein größerer Schmerz als ich erwartet hatte. Unsere Datenbank hatte viele komplexe benannte Tabellen. Es ist leicht zu merken, dass Cust das Präfix für den Kunden ist, aber nicht so leicht, sich das Präfix für HazardVerificationMethod zu merken. Jedes Mal, wenn ich eine Tabelle oder ein Feld schrieb, musste ich innehalten, um über das Präfix nachzudenken. Am Ende entschied ich, dass Geschwindigkeit und Bequemlichkeit wichtiger sind als Suchbarkeit, aber ich fand, dass es eine wertvolle Erfahrung war.
Dallas

15

Meine Meinungen dazu sind:

1) Nein, Tabellennamen sollten singulär sein.

Während es für die einfache Auswahl ( select * from Orders) sinnvoll erscheint, ist es für das OO-Äquivalent ( Orders x = new Orders) weniger sinnvoll .

Eine Tabelle in einer Datenbank ist wirklich die Menge dieser Entität. Wenn Sie die Mengenlogik verwenden, ist dies sinnvoller:

select Orders.*
from Orders inner join Products
    on Orders.Key = Products.Key

Diese letzte Zeile, die eigentliche Logik des Joins, sieht mit mehreren Tabellennamen verwirrend aus.

Ich bin mir nicht sicher, ob ich immer einen Alias ​​verwenden soll (wie Matt vorschlägt), um das zu klären.

2) Sie sollten singulär sein, da sie nur 1 Eigenschaft besitzen

3) Niemals, wenn der Spaltenname mehrdeutig ist (wie oben, wo beide eine Spalte namens [Schlüssel] haben), kann der Name der Tabelle (oder ihr Alias) sie gut genug unterscheiden. Sie möchten, dass Abfragen schnell und einfach eingegeben werden können - Präfixe sorgen für unnötige Komplexität.

4) Was auch immer Sie wollen, ich würde CapitalCase vorschlagen

Ich glaube nicht, dass es eine absolute Richtlinie zu diesen gibt.

Solange alles, was Sie auswählen, in der gesamten Anwendung oder Datenbank konsistent ist, denke ich nicht, dass es wirklich wichtig ist.


3
Was zum Teufel ist das CapitalCase?
ViRuSTriNiTy

@ViRuSTriNiTy meinte er wahrscheinlichpascal case
März

Keith, auf Nummer 3 mache ich beides und bin inkonsistent (aber ich schweife ab), aber ich verstehe nicht, warum es schlecht ist, einen beschreibenden Spaltennamen zu haben, solange er nicht über Bord geht, genau wie bei einer Tabelle, a Variable usw.
Johnny

@ Johnny Es ist nicht schlecht, als solches, nur nicht benötigt. Warum tippst du Sachen, die du nicht musst? Auch die meisten Intellisense verwenden hauptsächlich den Anfang des Namens, also wenn Sie habenProduct.ProductName , Product.ProductID, Product.ProductPriceetc Typisierung Product.Pgibt Ihnen alle voran Felder aus .
Keith

13

Meiner Meinung nach:

  1. Tabellennamen sollten Plural sein.
  2. Spaltennamen sollten singulär sein.
  3. Nein.
  4. Entweder CamelCase (meine bevorzugte) oder underscore_separated für Tabellennamen und Spaltennamen.

Wie bereits erwähnt, ist jede Konvention besser als keine Konvention. Unabhängig davon, wie Sie sich dafür entscheiden, dokumentieren Sie es so, dass zukünftige Änderungen denselben Konventionen folgen.


1
in Bezug auf # 4, PascalCase ... camelCase ... snake_case ...
Andrew

11

Ich denke, die beste Antwort auf jede dieser Fragen würden Sie und Ihr Team geben. Es ist weitaus wichtiger, eine Namenskonvention zu haben, als wie genau die Namenskonvention ist.

Da es keine richtige Antwort darauf gibt, sollten Sie sich etwas Zeit nehmen (aber nicht zu viel) und Ihre eigenen Konventionen wählen und - hier ist der wichtige Teil - daran festhalten.

Natürlich ist es gut, Informationen über Standards zu diesem Thema einzuholen, was Sie fragen, aber machen Sie sich keine Sorgen über die Anzahl der verschiedenen Antworten, die Sie möglicherweise erhalten: Wählen Sie diejenige, die für Sie besser erscheint.

Nur für den Fall, hier sind meine Antworten:

  1. Ja. Eine Tabelle ist eine Gruppe von Aufzeichnungen , Lehrern oder Schauspielern , also ... Plural.
  2. Ja.
  3. Ich benutze sie nicht.
  4. Die Datenbank, die ich häufiger benutze - Firebird - hält alles in Großbuchstaben, also spielt es keine Rolle. Wie auch immer, wenn ich programmiere, schreibe ich die Namen so, dass sie leichter zu lesen sind, wie zum Beispiel releaseYear .

11
  1. Halten Sie auf jeden Fall Tabellennamen singulär, Person nicht Personen
    1. Hier gilt das gleiche
    2. Nein. Ich habe einige schreckliche Präfixe gesehen, die so weit gehen, dass es sich um eine Tabelle (tbl_) oder eine Benutzerspeicherprozedur (usp_) handelt. Dies gefolgt vom Datenbanknamen ... Tu es nicht!
    3. Ja. Ich neige dazu, alle meine Tabellennamen zu PascalCase

28
OH MEIN GOTT. NEIN. Tabellennamen ENDGÜLTIG Plural. Es ist eine Sammlung. Es enthält mehrere Dinge. "Wählen Sie * von PEOPLE". Sie wählen nicht aus einer einzelnen Person, sondern aus mehreren MENSCHEN!
Triynko

4
Mir hat immer gefallen, wie die select-Anweisung im Plural besser klingt. SELECT id,name FROM contacts WHERE email_address LIKE '%gmail%'Tabellen Plural, Spalten Singular. Wieder immer eine Frage der persönlichen Meinung.
Scunliffe

Das Präfixieren von tbl, qry usw. kann beim Umgang mit Datenbankmetadaten äußerst nützlich sein. Wenn Sie das Objekt in einer Datenbank mit einer schnellen und einfachen Namenskonvention untersuchen, kann dies das Verständnis
erheblich

9

Mithilfe von Namenskonventionen kann das Entwicklungsteam die Auffindbarkeit und Wartbarkeit im Mittelpunkt des Projekts gestalten.

Eine gute Namenskonvention braucht Zeit, um sich zu entwickeln, aber sobald sie vorhanden ist, kann das Team mit einer gemeinsamen Sprache vorankommen. Eine gute Namenskonvention wächst organisch mit dem Projekt. Eine gute Namenskonvention kann Änderungen in der längsten und wichtigsten Phase des Software-Lebenszyklus - dem Service-Management in der Produktion - problemlos bewältigen.

Hier sind meine Antworten:

  1. Ja, Tabellennamen sollten Plural sein, wenn sie sich beispielsweise auf eine Reihe von Geschäften , Wertpapieren oder Gegenparteien beziehen .
  2. Ja.
  3. Ja. SQL-Tabellen werden mit dem Präfix tb_, Ansichten mit dem Präfix vw_, gespeicherten Prozeduren mit dem Präfix usp_ und Triggern mit dem Präfix tg_ gefolgt vom Datenbanknamen versehen.
  4. Der Spaltenname sollte durch einen Unterstrich in Kleinbuchstaben getrennt sein.

Das Benennen ist schwierig, aber in jeder Organisation gibt es jemanden, der Dinge benennen kann, und in jedem Softwareteam sollte es jemanden geben, der die Verantwortung für Benennungsstandards übernimmt und sicherstellt, dass Benennungsprobleme wie sec_id , sec_value und security_id frühzeitig gelöst werden, bevor sie in das Projekt integriert werden .

Was sind die Grundprinzipien einer guten Namenskonvention und guter Standards:

  • Verwenden Sie die Sprache Ihres Kunden und Ihrer Lösungsdomäne
  • Sei beschreibend
  • Seien Sie konsequent
  • Disambiguieren, reflektieren und umgestalten
  • Verwenden Sie keine Abkürzungen, es sei denn, sie sind allen klar
  • Verwenden Sie keine reservierten SQL-Schlüsselwörter als Spaltennamen

3
Tabellen sind per Definition Beziehungen. die in der Tat einzigartig sind. Präfixe saugen. Mussten Sie jemals eine Tabelle in eine Ansicht ändern oder umgekehrt? versuchen Sie das mit Präfixen. Welchen Unterschied macht es, wenn es sich um eine Ansicht oder eine Tabelle handelt?
William Jones

Das Präfix kann hilfreich sein, wenn wir für zwei Objekte denselben Namen haben - wie Funktion und gespeicherte Prozedur. Ich hätte eine Funktion mit dem Namen 'GetApproverList' und mit dem gleichen Namen möchte ich eine gespeicherte Prozedur erstellen, die diese Funktion intern aufruft. SQL erlaubt nicht die Erstellung von zwei Objekten mit demselben Namen.
Ravinder Singh


7
SELECT 
   UserID, FirstName, MiddleInitial, LastName
FROM Users
ORDER BY LastName

2
Beachten Sie die verwendeten Standards: Tabellen enthalten mehrere Elemente, Benutzer haben einen Vornamen, T-SQL-Schlüsselwörter in Großbuchstaben, Tabellendefinitionen in Pascal-Groß- und Kleinschreibung.
Ian Boyd

3
Tippfehler: Lastnamesollte seinLastName
aminimalanimal

1
Der Tabellenname sollte singulär sein, dh: Benutzer statt Benutzer
AZ_

Und beachten Sie, wie Tabellennamen Plural sind; wie sie Benutzer halten , nicht Benutzer .
Ian Boyd

5

Tabellennamen sollten immer singulär sein, da sie eine Reihe von Objekten darstellen. Wie Sie sagen, bezeichnet Herde eine Gruppe von Schafen oder Herde eine Gruppe von Vögeln. Keine Notwendigkeit für Plural. Wenn ein Tabellenname aus zwei Namen besteht und die Namenskonvention im Plural ist, wird es schwierig zu wissen, ob der Pluralname das erste Wort oder das zweite Wort oder beides sein sollte. Es ist die Logik - Object.instance, nicht objects.instance. Oder TableName.column, nicht TableNames.column (s). Microsoft SQL unterscheidet nicht zwischen Groß- und Kleinschreibung. Wenn Großbuchstaben verwendet werden, ist es einfacher, Tabellennamen zu lesen, um Tabellen- oder Spaltennamen zu trennen, wenn sie aus zwei oder mehr Namen bestehen.


2
Eine Herde ist eine Gruppe von Schafen . A Userist keine Benutzergruppe.
EricRobertBrewer

4

Tabellenname: Es sollte singulär sein, da es sich um eine singuläre Entität handelt, die ein Objekt der realen Welt darstellt, und keine Objekte, die singulär sind.

Spaltenname: Es sollte nur dann singulär sein, wenn es einen atomaren Wert enthält und die Normalisierungstheorie bestätigt. Wenn es jedoch n gleiche Eigenschaften gibt, sollten diese mit 1, 2, ..., n usw. versehen werden.

Präfixe Tabellen / Spalten: Es ist ein großes Thema, das später besprochen wird.

Gehäuse: Es sollte Kamel Fall sein

Mein Freund Patrick Karcher , ich bitte Sie, nichts zu schreiben, was jemanden beleidigen könnte, wie Sie geschrieben haben: "• Außerdem müssen Fremdschlüssel in verschiedenen Tabellen konsistent benannt werden. Es sollte legal sein, jemanden zu verprügeln, der dies nicht tut." mach das.". Ich habe diesen Fehler noch nie gemacht, mein Freund Patrick, aber ich schreibe allgemein. Was ist, wenn sie gemeinsam vorhaben, dich dafür zu schlagen? :) :)


2
Sie sagen also, die Tabelle ist die Entität? Oder ist die Zeile in der Tabelle die Entität? Für mich ist eine Tabelle eine Sammlung von Zeilen - daher eine Sammlung von Entitäten, die Plural impliziert.
Jason

4

Sehr spät zur Party, aber ich wollte immer noch meine zwei Cent über Spaltenpräfixe hinzufügen

Es scheint zwei Hauptargumente für die Verwendung des Namensstandards table_column (oder tableColumn) für Spalten zu geben, die beide auf der Tatsache beruhen, dass der Spaltenname selbst in Ihrer gesamten Datenbank eindeutig ist:

1) Sie müssen in Ihren Abfragen nicht immer Tabellennamen und / oder Spaltenaliasnamen angeben

2) Sie können ganz einfach Ihren gesamten Code nach dem Spaltennamen durchsuchen

Ich denke, beide Argumente sind fehlerhaft. Die Lösung für beide Probleme ohne Verwendung von Präfixen ist einfach. Hier ist mein Vorschlag:

Verwenden Sie immer den Tabellennamen in Ihrem SQL. Verwenden Sie beispielsweise immer table.column anstelle von column.

Es löst offensichtlich 2), da Sie jetzt einfach nach table.column anstelle von table_column suchen können.

Aber ich kann dich schreien hören, wie löst es 1)? Es ging genau darum, dies zu vermeiden. Ja, aber die Lösung war schrecklich fehlerhaft. Warum? Nun, die
Präfixlösung läuft auf Folgendes hinaus : Um zu vermeiden, dass bei Mehrdeutigkeiten table.column angegeben werden muss, benennen Sie alle Ihre Spalten table_column!
Dies bedeutet jedoch, dass Sie von nun an IMMER jedes Mal, wenn Sie eine Spalte angeben, den Spaltennamen schreiben müssen. Aber wenn Sie das trotzdem tun müssen, was ist der Vorteil, wenn Sie table.column immer explizit schreiben? Genau, es gibt keinen Vorteil, es ist genau die gleiche Anzahl von Zeichen, die eingegeben werden müssen.

edit: ja, mir ist bewusst, dass das Benennen der Spalten mit dem Präfix die korrekte Verwendung erzwingt, während mein Ansatz von den Programmierern abhängt


1
Wie Sie bereits erwähnt haben, können Sie sich nicht darauf verlassen, dass in jedem Fall table.column vorhanden ist. Programmierer werden an einem Ort vergessen und dann hat Ihr globales Suchen und Ersetzen Ihr gesamtes Programm kaputt gemacht. Oder Sie machen es zu einer Regel, und jemand glaubt, dass er die Regel erfüllt, indem er einen Alias ​​der Tabelle verwendet, wodurch ein globaler Fund erneut vereitelt wird. Wenn Sie Ihren Code mit einer Datenbankklasse organisieren möchten (wie es jeder gute Programmierer tun wird), wird es manchmal vorkommen, dass Sie nur einen Spaltennamen an eine Datenbankfunktion übergeben oder nur den Spaltennamen allein verwenden eine Variable.
Dallas

2
@janb: Ich unterstütze deine Antwort voll und ganz. Ich möchte auch hinzufügen, dass die Verwendung der Textsuche zum Auffinden von Abhängigkeiten eine barbarische Methode zum Navigieren im Code ist. Sobald die Leute diese barbarische Suchpraxis loswerden, werden sie gute Namen verwenden, nämlich table.column. Das Problem ist also nicht der Namensstil, sondern schlechte Werkzeuge für Barbaren.
Alpav

Ihr Argument ist fehlerhaft. Das Problem dabei ist, dass es in beide Richtungen funktioniert und keinen Vorteil bringt. Sie sagen, um dies zu lösen, schreiben Sie einfach immer table.column, da Sie bereits table_column schreiben. Nun, Sie können auch sagen, schreiben Sie einfach table_column, da Sie bereits table.column schreiben. Mit anderen Worten, es gibt keinen Unterschied zwischen Ihrer Antwort, außer dass sie mögliche Fehler einführt und keine Konventionen erzwingt . Aus diesem Grund haben wir ein "privates" Schlüsselwort. Wir könnten darauf vertrauen, dass Programmierer Klassenvariablen immer korrekt verwenden, aber das Schlüsselwort erzwingt dies und beseitigt mögliche Fehler.
Dallas

3

Grundlegende Konventionen (und Stil) für die Benennung von Datenbanken (klicken Sie hier, um eine detailliertere Beschreibung zu erhalten)

Tabellennamen wählen kurze, eindeutige Namen, wobei nicht mehr als ein oder zwei Wörter verwendet werden. Die Unterscheidung von Tabellen erleichtert die Benennung eindeutiger Feldnamen. Das Nachschlagen und Verknüpfen von Tabellen gibt Tabellen singuläre Namen, niemals Plural (Update: Ich stimme den angegebenen Gründen immer noch zu für diese Konvention, aber die meisten Leute mögen Plural-Tabellennamen wirklich, also habe ich meine Haltung aufgeweicht) ... folge bitte dem obigen Link


1
obwohl das, was Oracle vorschlägt, völlig entgegengesetzt ist, links oben zu verlinken. Finden Sie hier, was Oracle sagt. ss64.com/ora/syntax-naming.html
AZ_


Die Namenskonvention von Oracle war die lustigste von allen. e.g. PATIENTS would have a primary key called pa_patient_id_pk!!
Nawfal

2

Tabellennamen Singular. Angenommen, Sie haben eine Beziehung zwischen jemandem und seiner Adresse modelliert. Wenn Sie beispielsweise ein Datenmodell lesen, möchten Sie lieber, dass jede Person unter 0,1 oder vielen Adressen lebt. oder 'jedes Volk kann an 0,1 oder vielen Adressen wohnen.' Ich denke, es ist einfacher, Adressen zu pluralisieren, als Menschen als Person umformulieren zu müssen. Außerdem unterscheiden sich Sammelbegriffe häufig von der Singularversion.


-4

--Example SQL

CREATE TABLE D001_Students
(
    StudentID INTEGER CONSTRAINT nnD001_STID NOT NULL,
    ChristianName NVARCHAR(255) CONSTRAINT nnD001_CHNA NOT NULL,
    Surname NVARCHAR(255) CONSTRAINT nnD001_SURN NOT NULL,
    CONSTRAINT pkD001 PRIMARY KEY(StudentID)
);

CREATE INDEX idxD001_STID on D001_Students;

CREATE TABLE D002_Classes
(
    ClassID INTEGER CONSTRAINT nnD002_CLID NOT NULL,
    StudentID INTEGER CONSTRAINT nnD002_STID NOT NULL,
    ClassName NVARCHAR(255) CONSTRAINT nnD002_CLNA NOT NULL,
    CONSTRAINT pkD001 PRIMARY KEY(ClassID, StudentID),
    CONSTRAINT fkD001_STID FOREIGN KEY(StudentID) 
        REFERENCES D001_Students(StudentID)
);

CREATE INDEX idxD002_CLID on D002_Classes;

CREATE VIEW V001_StudentClasses
(
    SELECT
        D001.ChristianName,
        D001.Surname,
        D002.ClassName
    FROM
        D001_Students D001
            INNER JOIN
        D002_Classes D002
            ON
        D001.StudentID = D002.StudentID
);

Dies sind die Konventionen, die mir beigebracht wurden, aber Sie sollten sich an alle Verwendungszwecke anpassen, die Ihr Entwicklungsschlauch verwendet.

  1. Plural. Es ist eine Sammlung von Entitäten.
  2. Ja. Das Attribut ist eine Darstellung der singulären Eigenschaft einer Entität.
  3. Ja, der Präfix-Tabellenname ermöglicht die leicht nachverfolgbare Benennung aller Einschränkungsindizes und Tabellenaliasnamen.
  4. Pascal Groß- / Kleinschreibung für Tabellen- und Spaltennamen, Präfix + ALL-Großbuchstaben für Indizes und Einschränkungen.

6
ChristianName ... das ist eine seltsame Konvention.
BobbyShaftoe

3
Seriennummern auf Ihren Tischen? Hat jemand ernsthaft darüber nachdenken , das macht Sinn Werke für die Entwickler?
ErikE

Da dieses Beispiel es angesprochen hat ... Ich persönlich bin dagegen, Akronyme in Tabellen- oder Spaltennamen in Großbuchstaben zu setzen, da es meiner Meinung nach schwieriger zu lesen ist. In diesem Fall würde ich sagen, dass StudentId StudentID vorzuziehen ist. Keine große Sache, wenn das Akronym am Ende ist, aber ich habe unzählige Beispiele in meinem Job gesehen, bei denen Akronyme vorne oder in der Mitte des Namens standen, und es machte es schwieriger, in Ihrem Kopf zu analysieren. Beispiel: StudentABCSSN vs StudentAbcSsn.
redOctober13
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.