2010-12-28 42 views
11

SQL Serverの関数名に接頭辞(fn_GetNameなど)を使用する正当な理由の例を示します。それは通常、その使用の文脈がそれが機能であることを明らかにするので、それは不必要であるように見えるであろう。私は関数に接頭辞が必要な他の言語を使用していないので、なぜSQLが異なるのかを示す良いシナリオは考えられません。なぜSQL関数名の接頭辞はありますか?

私の唯一の考えは、古いIDEの場合、データベースオブジェクトがすべてリストされているときに機能をまとめてグループ化するのに便利だったと思いますが、現代IDEではすでに何が機能であるかを明確にしています。

答えて

14

は、SQL ServerのEnterprise Managerの(SQL Server 2000および7.0)を使用して権限を修正しようと、それが権限を表示しようとしている完全な時間を浪費しました。あなたがufnまたはuspまたはvwを持っていたなら、GUIがデータをどのように提示したかによって、物事をまとめるほうが簡単になりました。

あなたがSELECT * FROM Thingを持っている場合、それは何ですか?ビューやテーブル?開発者としてはうまくいくかもしれませんが、テーブル自体にアクセス権を与えないため、デプロイ時にクラッシュします。ビューやprocsだけです。確かにvwThingはあなたの血圧を下げます...?

スキーマを使用する場合、スキーマは無関係になります。あなたはあなたのオブジェクトの名前空間を作ることができます。

機能:たとえば、他のスキーマ内のクライアントごとに「データ」のテーブルやその他のオブジェクトはWebGUI

編集を例えば。あなたはテーブル値関数とスカラー関数を持っています。あなたがコード "VerbNoun"のコンセプトを守っているなら、どのようなことが他の手がかりなしにどのように分かっているのでしょうか。 (オブジェクト名は一意であるため、当然のことながら、この現象が発生することはできません)

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

あなたがテーブル値関数を示すために複数を使用している場合、これはあまり曖昧であるのに対し、これは

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

間違いなく悪化しています、いくつかの民衆には攻撃的ではありますが;-)

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

スキーマを使用しています。名前のあいまいさもありません。

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

「その他の言語」のコメントは適用されません。 SQLは、C#、Java、f#、Ada(OK、PL/SQLの可能性があります)、VBAなどのような構造ではありません。オブジェクトや名前空間の階層はありません。いいえObject.DoStuffメソッドのもの。

プレフィックスは正気あなたを維持するだけのものになるかもしれませんね...すべての命名規則と同様に

+0

はい、私はそれが有用である意見に同意します。私は特に機能について尋ねています。ありがとう。 – AaronLS

+0

私はCのような言語の行に沿ってもっと考えていましたが、オブジェクトには付けられていない関数があるかもしれませんが、それは明らかに使い方の文脈からの関数です。しかし、いずれにせよ、テーブル値とスカラー値の良い点は、単一のfn_接頭辞だけではほとんど達成できないということです。実際に必要とされるのは、そのシナリオが懸念される場合、デモンストレーションした2つの接頭辞です。 – AaronLS

+0

@AaronLS:Cも例です。 SQLはほとんどのクライアント言語に似ておらず、「従来の」前提が当てはまらないかもしれません。私はそれが理にかなっていると言っているわけではありませんが、あなたのコードを追跡するだけで便利です。すべての関数FWIWにスキーマを使用します。関数を動詞で区切ります。 "Calc" =スカラー、 "Get" =テーブルなど – gbn

5

fn_の前に関数名の接頭辞を付ける必要はありません。接頭辞テーブル名にはt_を付ける必要があります(私が見てきた慣例)。このような体系的な接頭辞は、言語にまだ慣れていない人や、コードを理解するための特別な助けとして慣習を必要とする人が使用する傾向があります。

2

私はプレフィックスのファンではありませんが、おそらく1つの利点は、これらのプレフィックスによって、特定の機能が組み込みではなくユーザー定義であることを容易に識別できることです。

+1

明示的なスキーマ参照(主にdbo)で使用する必要があるため、スカラーUDFを認識しません。 –

+1

@bernd_k:そこにはポイントがありますが、他のDBMSでは常にそうではありません...プレフィックスSQL Server以外のデータベースでその区別を明確にすることができます。 –

+0

私はすべてのDBMSは、我々は簡単に数をremenberできることを、私たちは非常に少ないの機能を与えていると思います。 –

4

。存在しないプレフィックス

を使用する 良い理由を例示したシナリオとは何ですか。人々はいつもそうしていたので、あらゆる種類のものをやっています。そして、かなりの数の悪い習慣が何年も間違っている古代の知識で説明されています。

2

私たちはこれについて私たちの会社で多くの苦しい会合を持っていました。 IMOでは、オブジェクト名に接頭辞は必要ありません。ただし、ビューの名前が基になるテーブル名と競合する可能性がある場合は、それらをビューに配置する引数を使用できます。

いずれにしても、プレフィックスを使用するSQL要件はなく、率直に言ってIMOでは実際の価値はありません。

1

私が考えることができる唯一のメリットは、関連する機能が自動的にグループ化されているため、結果的にプレフィックススキームがintellisense/autocompleteを簡単に使用できるということです。

+1

私は正反対であると言うでしょう。 –

1

あなたが定義したシナリオには簡単に挑戦することができるので、必要に応じてルールを定義するルールはありません。しかし、同様に、それが不必要であるというルールはありません。すべての命名規則と同様、正当化ではなく一貫性のある使用法を持つことが重要です。あなたはDBAなどの古いIDEの

について正しい

+0

一貫性のある使用法に同意しますが、fn_を使用しないことを主張したくない場合、後でそれが大きな欠点となるケースがあることがわかります。 "簡単に挑戦する"私の意見:) – AaronLS

+0

私はそこにあるとは思わない。特定の命名規則のために提示された議論は、データの出所を特定することに繋がります(例えば、ビューや関数はテーブルとは異なり、出力に影響を与える何らかのロジックを持つことがあります)。そして、それらの議論は、 。 1つを選んで前進する。関数とビューのプレフィックスが好きな開発チーム(テーブルと区別するために)を使用している場合は、それらを使用してください。 –

4

は、ほとんどの規則が実際に何であるか重要ません。本当に重要なのは、が一貫してになることです。だから慣習が間違っていても、一貫性のためにそれに固執することはまだ重要です。はい、それは命名規則が間違っている場合は変更する必要がありますが、努力は多くを意味すると主張することがあります。すべてオブジェクト、ソースコードの変更、すべてのメンテナンス手順、新しいコンベンションすべてのサポートとオペレーション要員が新しいルールに従うようにします。大規模な組織では、確立された命名規則を変更しようとする努力は、単に圧倒的です。

あなたの状況はわかりませんが、「pretty」のために命名規則を変更することを提案する前に慎重に検討する必要があります。組織の既存の命名規則がどれほど悪い場合でも、それに固執し、命名の一貫性を無視して独自の命名を開始するよりもはるかに優れています。

もちろん、多くの場合、命名規則は悪くないだけでなく、また従わず、名前が矛盾しています。想像して、あなたには、いくつかのシステムテーブルとあなたからいくつかのオブジェクトIDを持っています。その場合は、私は最近、この質問つまずいたので

0

は、私は接頭辞の賛成で、以下の点を追加したい...あなたのことを吸いますそれは、関数のかどうかを確認したい、PROCなどを表示するには、当然の種類ごとにテストを実行することができ、それは、オブジェクト名からプレフィックスを抽出し、その作用してもはるかに簡単です。アンダースコアを使用してプレフィックスを名前から分離すると、これはさらに簡単になります。 uspFooではなくusp_Foo IMHOそれは愚かなIDEについてだけではありません。

関連する問題