2010-12-28 13 views
11

Was ist ein Szenario, das einen guten Grund für die Verwendung von Präfixen wie fn_GetName für Funktionsnamen in SQL Server darstellt? Es scheint, dass es unnötig wäre, da normalerweise der Kontext seiner Verwendung es klar machen würde, dass es eine Funktion ist. Ich habe keine andere Sprache verwendet, die Präfixe für Funktionen benötigt, und ich kann mir kein gutes Szenario vorstellen, das zeigen würde, warum SQL anders ist.Warum Präfix sql Funktionsnamen?

Mein einziger Gedanke ist, dass es vielleicht in älteren IDEs nützlich war, um Funktionen zusammen zu gruppieren, wenn die Datenbankobjekte alle zusammen aufgelistet wurden, aber moderne IDE's bereits klar machen, was eine Funktion ist.

Antwort

14

Sie sind richtig über ältere IDEs

Als DBA, versucht SQL Server Enterprise Manager (SQL Server 2000 und 7.0) zu beheben Berechtigungen verwenden, es war komplett bugger Berechtigungen anzeigen möchten. Wenn Sie ufn oder usp oder vw hatten, wurde es einfacher, Dinge zusammen zu gruppieren, weil die GUI die Daten präsentierte.

Zu sagen, wenn Sie SELECT * FROM Thing haben, was ist Thing? Eine Aussicht oder ein Tisch? Es kann für Sie als Entwickler funktionieren, aber es wird bei der Bereitstellung abstürzen, weil Sie keine Berechtigungen für die Tabelle selbst gewähren: nur Ansichten oder Prozesse. Sicher wird eine vwThing Ihren Blutdruck halten ...?

Wenn Sie Schemas verwenden, wird es irrelevant. Sie können Ihre Objekte "benennen".Zum Beispiel Tabellen in "Data" und andere Objekte, die pro Client in anderem Schema zB WebGUI

Edit:

Funktion. Sie haben Tabellenwert- und Skalarfunktionen. Wenn Sie mit dem Code "VerbNoun" -Konzept bleiben, woher wissen Sie dann, welches das ist, ohne einen anderen Hinweis? (Natürlich kann dies nicht passieren, weil Objektnamen eindeutig sind)

SELECT dbo.GetName() FROM MyTable 
SELECT * FROM dbo.GetName() 

Wenn Sie einen Plural verwenden, um eine Tabellenwertfunktion, um anzuzeigen, ist dies wohl schlimmer

SELECT dbo.GetName() FROM MyTable 
SELECT * FROM dbo.GetNames() 

Während dies weniger zweideutig wenn auch beleidigend für einige Leute ;-)

SELECT dbo.sfnGetName() FROM MyTable 
SELECT * FROM dbo.tfnGetName() 

Mit Schemas. Und keine Namenszweideutigkeit.

SELECT ScalarFN.GetName() FROM MyTable 
SELECT * FROM TableFN.GetName() 

Ihr Kommentar zu "jeder anderen Sprache" trifft nicht zu. SQL ist nicht wie C# strukturiert, Java, fis, Ada (OK, PL/SQL auch sein mag), VBA, was auch immer: Es gibt keine Hierarchie Objekt oder Namespace ist. No Object.DoStuff Methode Zeug.

Ein Präfix genau das Richtige sein kann, Sie gesund zu halten ...

+0

Ja, ich stimme zu, dass es sinnvoll ist. Ich frage jedoch speziell nach Funktionen. Vielen Dank. – AaronLS

+0

Ich dachte mehr entlang der Linien von sogar Sprachen wie C, wo Sie eine Funktion haben, die nicht an ein Objekt gebunden ist, es ist immer noch eindeutig eine Funktion aus dem Kontext der Verwendung. Aber wie auch immer, ein guter Punkt in Bezug auf Tabellenwert vs Skalarwert, was bedeutet, dass ein einzelnes Fn_ Präfix alleine wenig leistet, was wirklich benötigt wird, wenn dieses Szenario ein Problem ist, sind zwei verschiedene Präfixe, wie Sie gezeigt haben. – AaronLS

+0

@AaronLS: C könnte auch ein Beispiel sein. SQL ist nicht wie die meisten Clientsprachen und "konventionelle" Annahmen treffen möglicherweise nicht zu. Ich sage nicht, dass es Sinn macht oder gut ist, aber es ist nützlich, nur den Überblick über Ihren Code zu behalten. Wir verwenden ein Schema für alle Funktionen FWIW. Wir trennen Funktionen durch ihre Verben. "Calc" = skalar, "Get" = Tabelle usw. – gbn

5

Es gibt keine Notwendigkeit Funktionsnamen mit fn_ mehr Präfix als es notwendig ist Tabellennamen mit t_ (eine Konvention ich gesehen habe) voranzustellen. Diese Art von systematischer Präfix wird häufig von Personen verwendet, die sich mit der Sprache noch nicht auskennen und die Konvention als zusätzliche Hilfe zum Verständnis des Codes benötigen.

2

Ich bin kein Fan von Präfixen, aber vielleicht könnte ein Vorteil sein, dass diese fn_ Präfixe es einfacher machen könnten zu identifizieren, dass eine bestimmte Funktion benutzerdefiniert ist, anstatt eingebaut.

+1

Nein, Sie erkennen die skalaren UDFs, weil sie mit expliziter Schemareferenz verwendet werden müssen (meistens dbo.) –

+1

@bernd_k: Sie haben da einen Punkt, aber in anderen DBMS ist das nicht immer der Fall ... Also Präfix könnte diese Unterscheidung in anderen Datenbanken als SQL Server klarer machen. –

+0

Ich denke, alle DBMS uns so wenige Funktionen geben, dass wir leicht die wenigen remenber können. –

4

Was ist ein Szenario, das eine gutem Grund ein Beispiel für

Präfixe verwenden

gibt es keine. Die Leute machen alles Mögliche, weil sie das immer getan haben, und eine ganze Reihe schlechter Gewohnheiten werden mit altem Wissen erklärt, das seit vielen Jahren falsch ist.

2

Wir hatten viele schmerzhafte Meetings in unserem Unternehmen darüber. IMO, wir brauchen keine Präfixe für irgendwelche Objektnamen. Sie können jedoch ein Argument für das Einfügen von Sichten erstellen, wenn der Name der Sicht möglicherweise einen Konflikt mit dem zugrunde liegenden Tabellennamen verursacht.

In jedem Fall gibt es keine SQL-Anforderung, dass Präfixe verwendet werden, und ehrlich gesagt, IMO, sie haben keinen realen Wert.

1

Ein (und der einzige) Vorteil, den ich mir vorstellen kann, ist, dass ein konsequentes Präfixierungsschema die Verwendung von Intellisense/Autocomplete vereinfachen könnte, da verwandte Funktionen automatisch gruppiert werden.

+1

Ich würde sagen, das Gegenteil ist wahr –

1

Wie andere bemerkt haben, kann jedes Szenario, das Sie definieren, leicht in Frage gestellt werden, also gibt es keine Regel, die es als notwendig definiert; Es gibt jedoch auch keine Regel, die besagt, dass es unnötig ist. Wie bei allen Namenskonventionen ist eine konsistente Verwendung wichtiger als eine Rechtfertigung.

+0

Ich stimme konsistent zu konsumieren, aber ich möchte nicht befürworten nicht mit fn_ und dann später feststellen, dass es Fälle gibt, in denen das ein großer Nachteil sein wird, also frage ich nach diesen Beispielen, dass "leicht challenge" meine meinung :) – AaronLS

+0

ich glaube nicht, dass es sein wird; Jedes Argument, das für eine bestimmte Benennungskonvention präsentiert wird, läuft darauf hinaus, die Quelle der Daten zu identifizieren (z. B. können Ansichten und Funktionen eine Logik haben, die die Ausgabe im Gegensatz zu Tabellen beeinflusst), und diese Argumente können ohne echte Auflösung hin und her geworfen werden . Wähle einen aus und bewege dich vorwärts. Wenn Sie ein Entwicklungsteam haben, das Präfixe für Funktionen und Ansichten mag (um sie von Tabellen zu unterscheiden), verwenden Sie sie. –

4

Wie alle Namenskonventionen, zählt es kaum, was die Konvention tatsächlich ist. Was wirklich wichtig ist konsequent zu sein. Selbst wenn die Konvention falsch ist, ist es dennoch wichtig, sich aus Konsistenzgründen daran zu halten. Ja, kann man argumentieren, dass, wenn die Namenskonvention falsch ist, dann sollte es geändert werden, aber der Aufwand bedeutet eine Menge: umbenennen alle Objekte, Quellcode ändern, alle Wartungsprozeduren, erhalten die Entwickler-Team verpflichtet sich, die neue Konvention folgen , haben alle Support- und Operationsmitarbeiter die neuen Regeln usw. befolgen etc. Bei einer großen Organisation ist der Aufwand, eine gut etablierte Namenskonvention zu ändern, einfach überwältigend.

weiß ich nicht, was Ihre Situation ist, aber Sie sollten eine Namenskonvention vor schlägt Änderung nur aus Gründen der ‚ziemlich‘ sorgfältig prüfen. Ganz gleich, wie schlecht die bestehende Namenskonvention in Ihrer Organisation ist, es ist viel besser, sich daran zu halten und die Konsistenz der Namensgebung zu bewahren, als sie zu ignorieren und Ihre eigene zu erstellen.

Natürlich ist häufig die Namenskonvention nicht schlecht, wird auch nicht gefolgt und Namen sind inkonsistent. In diesem Fall, saugt, um Sie zu sein ...

0

Da ich vor kurzem über diese Frage stolperte, möchte ich den folgenden Punkt zugunsten Präfixe hinzufügen: Stellen Sie sich vor, Sie haben einige Objekt-ID aus einigen Systemtabelle und Sie wollen, um zu bestimmen, ob es eine Funktion, proc, Ansicht usw. Sie könnten natürlich einen Test für jede Art laufen, es ist viel einfacher, wenn das Präfix aus dem Objektnamen zu extrahieren und dann auf das, handeln. Dies wird noch einfacher, wenn Sie einen Unterstrich verwenden, um das Präfix vom Namen zu trennen, z. usp_Foo anstelle von uspFoo. IMHO geht es nicht nur um dumme IDEs.