it-swarm-eu.dev

Warum wird das Präfixieren von Spaltennamen als schlechte Praxis angesehen?

Laut ein beliebter SO Beitrag wird es als schlechte Praxis angesehen, Tabellennamen voranzustellen. In meiner Firma jeder Spalte wird ein Tabellenname vorangestellt. Dies ist für mich schwer zu lesen. Ich bin mir nicht sicher, warum, aber diese Benennung ist tatsächlich der Unternehmensstandard. Ich kann die Namenskonvention nicht aushalten, aber ich habe Keine Dokumentation, um meine Argumentation zu stützen.

Ich weiß nur, dass das Lesen von AdventureWorks viel einfacher ist. Im diese In unserer Firmen-DB sehen Sie eine Tabelle, Person und möglicherweise einen Spaltennamen:

Person_First_Name
oder vielleicht sogar
Person_Person_First_Name (frag mich nicht, warum du Person 2x siehst)

Warum wird es als schlechte Praxis angesehen, Spaltennamen vorab festzulegen? Werden Unterstriche auch in SQL als böse angesehen?


27
P.Brian.Mackey

Unterstriche sind nicht böse, nur schwerer zu tippen. Was schlecht ist, ist das Ändern von Standards im Midstream, ohne alle vorhandenen Objekte zu reparieren. Jetzt haben Sie personId, Person_id usw. und können sich nicht erinnern, welche Tabelle die Unterstriche verwendet oder nicht. Konsistenz bei der Benennung (auch wenn Sie die Namen persönlich nicht mögen) erleichtert das Codieren.

Persönlich ist der einzige Ort, an dem ich den Tabellennamen in einer Spalte verwenden muss, die ID-Spalte (die Verwendung von nur ID ist ein Antimuster im Datenbankdesign, wie jeder, der umfangreiche Berichtsabfragen durchgeführt hat, Ihnen sagen kann. Das Umbenennen macht so viel Spaß Jedes Mal, wenn Sie einen Bericht schreiben, 12 Spalten in Ihrer Abfrage.) Dies erleichtert auch das sofortige Erkennen der FKs in anderen Tabellen, da diese denselben Namen haben.

In einer ausgereiften Datenbank ist es jedoch mehr Arbeit als es wert ist, einen vorhandenen Standard zu ändern. Akzeptieren Sie einfach, dass dies der Standard ist, und fahren Sie fort. Es gibt weitaus kritischere Dinge, die zuerst behoben werden müssen.

45
HLGEM

Ein Argument für das Präfix des Spaltennamens würde verhindern, dass beim Zusammenfügen mehrerer Tabellen "Kollisionen" auftreten UND der Abfrageersteller keine Aliase verwendet.

SELECT person.name, company.name FROM person JOIN company ON ...

SELECT * FROM person JOIN company ON ...

Beide Abfragen hätten zwei "Name" -Spalten (Name_1, Name_2), ohne "zu sagen", zu welcher Entität sie gehört. Und Sie können sich der generierten Spaltennamen nie sicher sein (wird es name_2 oder name_3 oder ... sein). Wenn Sie das Präfix für Tabellennamen verwenden, lauten die Spaltennamen Personenname, Firmenname, sodass Sie jeden Namen kennen, zu welcher Entität er gehört, und dass die Spaltennamen erhalten bleiben Konstante (wenn Sie sie beispielsweise mit JDBC in Java erhalten).

Beide Argumente können ignoriert werden, wenn Sie Aliasing verwenden. Ich denke jedoch, dass die meisten in Unternehmen erzwungenen Codierungskonventionen darauf zurückzuführen sind, dass viele (Junior-) Programmierer keine bewährten Methoden befolgen. In diesem Fall kann beispielsweise die Verwendung des Platzhalters in einer SELECT-Anweisung Probleme ohne das Namenspräfix verursachen.

Der Unterstrich in Tabellen- und Spaltennamen wird häufig verwendet, da ich nur Kleinbuchstaben in Namen plus Unterstrich als Trennzeichen verwende. Wenn Sie nur Kleinbuchstaben verwenden, können Sie Bezeichner von SQL-Schlüsselwörtern unterscheiden (die ich in Großbuchstaben eingebe):

SELECT person_name, COUNT(bought_product) FROM bought_products WHERE person_name LIKE 'A%'
18
Nicolae Albu

Durch Hinzufügen dieser Art von Präfixen zu Spaltennamen wird die Entwicklung einer Tabelle schwieriger. Als Beispiel: Wenn Sie irgendwann feststellen, dass Sie den Tabellennamen ändern möchten/müssen, müssen Sie Ihre gesamte Tabellenstruktur ändern (d. H. Nicht nur den Namen der Tabelle, sondern den Namen aller ihrer Spalten). Dies würde auch die Aktualisierung der Tabellenindizes und des Codes der Clients, die sie abfragen, erschweren.

9
Sergio

Es gibt Ausnahmen, wenn sie mit Bedacht verwendet werden (gemäß der Antwort von Patrick Karcher auf Ihrem Link) für allgemeine Spaltennamen (normalerweise nur ID, manchmal Name), die nicht eindeutig sind zu oft.

Eine weitere bewährte Methode besteht darin, Spalten und Objekte in Ihren Abfragen immer zu qualifizieren. So werden Spaltenpräfixe strittig und überladen Ihren Code.

Vergleichen Sie diese: Was ist am einfachsten für das Auge?

SELECT P.name, P.Salary FROM dbo.Person P

SELECT Person.Name, Person.Salary FROM dbo.Person Person

SELECT dbo.Person.name, dbo.Person.Salary FROM dbo.Person

SELECT Person.Person_name, Person.Person_Salary FROM dbo.Person Person
5
gbn

Im Allgemeinen scheint es wirklich keine allgegenwärtigen Standards zu geben. Die Frage, mit der Sie verlinkt haben, hat mehrere Antworten mit hohen Stimmen und völlig unterschiedlichen Konventionen. Natürlich wird jeder seine eigenen Standards verteidigen, und es ist weitaus wichtiger, in einem Projekt einheitliche Konventionen einzuhalten.

Das Präfixieren von Spaltennamen scheint jedoch übertrieben zu sein. Sie wissen bereits, mit welcher Tabelle Sie arbeiten, und eine Situation mit zwei Spalten aus verschiedenen Tabellen mit demselben Namen kann mithilfe von Tabellen- oder Spaltenaliasnamen problemlos behoben werden.

3
Dan Simon

In TSQL können Sie auf Felder in der Form TableName.FieldName verweisen, wenn Sie Mehrdeutigkeiten vermeiden möchten. Wenn Sie also Feldnamen zu Tabellennamen hinzufügen, wird die Lesbarkeit beeinträchtigt, sodass TableName.TableName_FieldName oder ähnliches angezeigt wird. Ich denke, Unterstriche zu verwenden oder nicht, ist eher eine persönliche Entscheidung. Ich bevorzuge CamelCase und verwende _, wenn ich ein Suffix oder ähnliches hinzufügen möchte, z. TableName_Temp, aber das bin nur ich.

2
Ben Robinson

Ich habe einmal an einem System gearbeitet, bei dem wir uns entschieden haben, den Spalten Kurzcodes vorangestellt zu haben. Die PK-Felder verwendeten den "vollständigen Tabellennamen" als Präfix, und alle anderen Spalten verwendeten konsistent 2-4 Zeichen als Präfix. Jede Spalte verwendete auch eine Datendomäne als Suffix. Wenn es konsequent gemacht wird, kann es sehr schön und sauber sein. Es ist Unsinn, dass ein Namensstandard des einen oder anderen Typs eine schlampige Codierung impliziert. Das Vorhandensein eines einheitlichen Standards ist wichtig. Ich habe eine Reihe von Datenbanken gesehen, die inkonsistent sind, weil es keinen klaren Standard gibt und die mir mehr als alles andere anzeigen würden, dass es Probleme in den Datenstrukturen geben könnte. Wenn der Designer einer Datenbank Objekte und ihre Kinder nicht einmal konsistent benennen kann, warum sollte ich dann glauben, dass das zugrunde liegende Datenmodell, die Beziehungen, Einschränkungen, die Integrität usw. konsistent oder nachdenklich sind?

2
Tom

Das Präfixieren ist eine schlechte Praxis, da es das Problem verursacht, das verhindert werden soll. Wie Sie sagten, ist es sehr schwer, vorangestellte Spalten zu lesen. Wenn Sie in einer Abfrage, in der Sie zwei Tabellen verknüpfen, doppelte Spaltennamen haben, können Sie diese auflösen oder es handelt sich um eine Ansicht, eine gespeicherte Prozedur oder eine tabellarische benutzerdefinierte Funktion, die dies für Sie erledigt, wenn Sie ständig bestimmte Tabellen verknüpfen.

Soweit die Verwendung in einem Tabellennamen unterstrichen ist, ist dies ein religiöses Argument. Am Ende erhöht sich die Sichtbarkeit und macht es einfacher. Ich würde im Allgemeinen niemals Leerzeichen oder Tabellen in einer Spalte oder einem Tabellennamen haben. Ich kann jedoch eine Ausnahme für Tabellen oder Ansichten machen, die nur von einem Berichtspaket verwendet oder in eine CSV-Datei exportiert wurden.

1
Justin Dearing

In vielen Datenbanken ist die Anzahl der Zeichen in einem Spaltennamen (d. H. Oracle) streng begrenzt.

Wenn Sie mit einer Datenbank arbeiten, die lange Spaltennamen zulässt, aber später entscheiden, dass Sie diese Struktur auf ein anderes Datenbanksystem migrieren möchten, erhöhen die Präfixe die Wahrscheinlichkeit, dass Ihre Spaltennamen ungültig sind.

Obwohl Sie jetzt mit SQL Server arbeiten, kann niemand die Zukunft vorhersagen, und es ist möglich, dass Ihre Software in Zukunft auf mehreren Datenbanken arbeiten muss.

1
Britt Wescott

Erwägen Sie das Schreiben eines Datenwörterbuchs (oder einer "Registrierung"). Damit meine ich ein Dokument, das alle Datenelemente in Ihrem Modell enthält: Name, Beschreibung usw. Es sollte unabhängig von der Implementierung des Modells sein, z. sollte keine Tabellennamen erwähnen. Wie würden Sie Namen wie "ID", "Typ" und "Code" unterscheiden?

Ein Ansatz besteht darin, den Richtlinien der internationalen Norm zu folgen ISO/IEC 11179 - warum das Rad neu erfinden? Die Grundstruktur ist:

[Object] [Qualifier] Property RepresentationTerm

mit Trennzeichen zwischen den Elementen: SQL spielt nicht gut mit Leerzeichen in Spaltennamen und Unterstrich funktioniert visuell gut.

Ich habe das Gefühl, dass jemand in Ihrer Organisation versucht hat, diese Richtlinien zu befolgen, als er Elementnamen wie Person_Person_First_Name.

Das Beispiel, das ich gerne zeigen möchte, ist das Datenwörterbuch des UK Nation Health Service (NHS) .

Ich denke also nicht, dass die Namenskonvention, mit der man arbeiten muss, zu schlecht klingt.

Bei der Implementierung, z. In SQL möchten einige Leute die Unterelemente Object, Qualifier und Property weglassen, wenn der Tabellenname den Kontext bereitstellt, z. person_first_name wird first_name in der Tabelle Person usw. Die Faustregel, dass ein Datenelement seinen Namen nicht einfach aufgrund seiner Position im physischen Modell ändern sollte, scheint jedoch gut zu sein. Jeder, der der Meinung ist, dass es keine gute Idee ist, diese Regel zu befolgen, sollte die Aufgabe erhalten, alle von ihm verwendeten Namensvarianten zu dokumentieren :)

Eine schöne Zusammenfassung von ISO 11179 finden Sie im Buch Joe Celkos Programmierstil , einschließlich Nachweisen dafür, dass Unterstriche als Trennzeichen in Spaltennamen bevorzugt werden.

0
onedaywhen

Einige finden es im Code einfacher zu wissen, aus welcher Tabelle die Daten stammen. Wenn Sie jedoch von einem objektorientierten System sprechen, sollten Sie den Kontext des Namens verwenden, um zu wissen, woher sie stammen, in diesem Fall den Tabellennamen.

Persönlich ist das Präfixieren von Tabellennamen ein Hinweis darauf, dass die Entwickler nicht sehr geschickt sind. Wenn Sie tiefer graben, werden Sie viele andere schlechte Codierungskonventionen finden, und wenn ich raten müsste, dass die App zu viele Tabellen hat, fehlerhaft ist usw.

0
Bill Leeper