ストアドプロシージャに名前を付けるためのさまざまなルールを見てきました。
Sproc名の先頭にusp_を付ける人もいれば、アプリ名の略語を付ける人もいれば、所有者名を付ける人もいます。意図しない限り、SQL Serverでsp_を使用しないでください。
動詞(Get、Add、Save、Remove)でproc名を開始するものもあります。その他は、エンティティ名を強調します。
数百のsprocがあるデータベースでは、既に存在すると思われる場合にスクロールして適切なsprocを見つけるのは非常に困難です。命名規則により、sprocを簡単に見つけることができます。
命名規則を使用していますか?それを説明し、他の選択肢よりもそれを好む理由を説明してください。
返信の概要:
私がした答えを選んだ理由: SOたくさんの良い回答があります。ありがとうございます!ご覧の通り、1つだけを選ぶのは非常に難しいでしょう。私が選んだものは私に共鳴しました。私は彼が説明したのと同じ道をたどりました-動詞+名詞を使おうとして、顧客に当てはまるすべてのsprocを見つけることができませんでした。
既存のsprocを見つけることができるか、存在するかどうかを判断できることが非常に重要です。誰かが誤って別の名前で重複したsprocを作成すると、深刻な問題が発生する可能性があります。
私は通常、数百のsprocを持つ非常に大きなアプリで作業しているため、見つけやすい命名方法を好みます。小規模なアプリの場合、メソッド名の一般的なコーディング規則に従って、動詞+名詞を推奨します。
また、あまり役に立たないusp_の代わりに、アプリ名をプレフィックスとして付けることも推奨しています。複数の人が指摘したように、データベースには複数のアプリのsprocが含まれている場合があります。そのため、アプリ名を接頭辞として付けると、sprocを分離しやすくなり、DBAなどがsprocを使用するアプリを決定するのに役立ちます。
私の最後のプロジェクトでは、usp_ [Action] [Object] [Process]を使用したため、たとえばusp_AddProductまたはusp_GetProductList、usp_GetProductDetailを使用しました。ただし、データベースのプロシージャは700個以上になり、特定のオブジェクトですべてのプロシージャを見つけるのは非常に難しくなります。たとえば、製品の追加には50個の奇数の追加手順を、取得などには50個の奇数を検索する必要があります。
私の新しいアプリケーションでは、オブジェクトごとにプロシージャ名をグループ化することを計画しているため、プロシージャを伝えること以外に、やや冗長であると感じているため、uspも削除します。プロシージャ自体。
新しい形式は次のとおりです
[App]_[Object]_[Action][Process]
App_Tags_AddTag
App_Tags_AddTagRelations
App_Product_Add
App_Product_GetList
App_Product_GetSingle
特に大量のsprocがある場合に、後で見つけやすいようにグループ化するのに役立ちます。
複数のオブジェクトが使用される場所に関して、ほとんどのインスタンスにはプライマリおよびセカンダリオブジェクトがあるため、プライマリオブジェクトは通常のインスタンスで使用され、セカンダリはプロセスセクションで参照されます(例:App_Product_AddAttribute)。
SQL Serverのsp_プレフィックスの問題に関する説明をいくつか示します。
プレフィックスsp_で名前が付けられたストアドプロシージャは、Masterデータベースに格納されたシステムsprocです。
Sprocにこのプレフィックスを付けると、SQL Serverは最初にMasterデータベースで検索し、次にコンテキストデータベースで検索するため、不必要にリソースを浪費します。また、ユーザーが作成したsprocがシステムのsprocと同じ名前の場合、ユーザーが作成したsprocは実行されません。
Sp_プレフィックスは、sprocがすべてのデータベースからアクセス可能であるが、現在のデータベースのコンテキストで実行する必要があることを示します。
Here's パフォーマンスヒットのデモを含むニースの説明。
Here's Antがコメントで提供している別の役立つソース。
Systems Hungarian (上記の「usp」プレフィックスのように)身震いします。
構造が類似したさまざまなデータベース間で多くのストアドプロシージャを共有しているため、データベース固有のものについては、データベース名自体のプレフィックスを使用します。共有プロシージャにはプレフィックスがありません。別のスキーマを使用することは、そのようなややいプレフィックスを完全に取り除くための代替手段かもしれないと思います。
接頭辞の後の実際の名前は、関数の命名とほとんど変わりません。通常、「追加」、「設定」、「生成」、「計算」、「削除」などの動詞の後に、「ユーザー」などのより具体的な名詞が続きます。 「」、「DailyRevenues」など。
Antのコメントへの応答:
ストアドプロシージャ名をwithsp_
は、システムsprocがすべてsp_で始まるため、SQL Serverでは不適切です。一貫した命名(hobgoblin-domの範囲まで)は、データディクショナリに基づいて自動化されたタスクを容易にするため便利です。 SQL Server 2005では、スキーマがサポートされているため、プレフィックスの有用性がやや劣ります。スキーマは、名前のプレフィックスが使用される方法でさまざまな種類の名前空間に使用できます。たとえば、スタースキーマでは、dimおよびfactスキーマを使用して、この規則で表を参照できます。
ストアドプロシージャの場合、システムsprocからアプリケーションsprocを識別するためにプレフィックスを使用すると便利です。 up_
vs. sp_
を使用すると、データディクショナリから非システムストアドプロシージャを比較的簡単に識別できます。
私は長年にわたってほとんどすべての異なるシステムを使用してきました。私はついにこれを開発し、今日も使用し続けています。
プレフィックス:
アクション指定子:
Ins - INSERT
Sel - SELECT
Upd - UPDATE
Del - DELETE
(プロシージャが多くのことを行う場合、全体的な目標を使用してアクション指定子を選択します。たとえば、顧客のINSERTにはかなりの準備作業が必要な場合がありますが、全体的な目標はINSERTであるため、「Ins」が選択されます。
オブジェクト:
Gen(CRUD)の場合、これは影響を受けるテーブルまたはビューの名前です。 rpt(レポート)の場合、これはレポートの短い説明です。 tsk(タスク)の場合、これはタスクの短い説明です。
オプションのクラリファイヤー:
これらは、手順の理解を深めるために使用されるオプションの情報です。例には、「By」、「For」などが含まれます。
フォーマット:
[プレフィックス] [アクション指定子] [エンティティ] [オプションのクラリファイヤー]
プロシージャ名の例:
genInsOrderHeader
genSelCustomerByCustomerID
genSelCustomersBySaleDate
genUpdCommentText
genDelOrderDetailLine
rptSelCustomersByState
rptSelPaymentsByYear
tskQueueAccountsForCollection
TableName_WhatItDoes
Comment_GetByID
Customer_List
UserPreference_DeleteByUserID
プレフィックスなしまたは愚かなハンガリーのナンセンス。最も密接に関連付けられているテーブルの名前と、その機能の簡単な説明。
上記の1つの注意点:個人的には常に、自動生成されたすべてのCRUDにzCRUD_をプレフィックスとして付けて、リストの最後まで並べ替える必要がないようにします。
現在、次のような形式を使用しています
表記法:
[前書き] [アプリケーション] [モジュール] _ [名前]
例:
P_CMS_USER_UserInfoGet
私はいくつかの理由でこの表記法が好きです:
ストアドプロシージャは常にpackagesでカプセル化しています(職場でOracleを使用しています)。これにより、個別のオブジェクトの数が減り、コードの再利用が促進されます。
命名規則は好みの問題であり、プロジェクト開始時に他のすべての開発者と同意する必要があります。
小さなデータベースの場合、uspTableNameOperationNameを使用します。 uspCustomerCreate、uspCustomerDeleteなど。これにより、「メイン」エンティティによるグループ化が容易になります。
大規模なデータベースの場合、スキーマまたはサブシステム名を追加します。グループ化を維持するための受信、購入など(SQLサーバーはアルファベット順に表示するのが好きなので)
わかりやすくするために、名前の略語を避けるようにしています(プロジェクトの新しい人は、sprocの名前がuspUsingNoAbbreviationsIncreasesClarityForEveryoneであるため、「UNAICFE」が何を表しているのかを気にする必要はありません)
私はいつも使用します:
usp [テーブル名] [アクション] [追加の詳細]
「tblUser」というテーブルがある場合、次のようになります。
プロシージャは、テーブル名と機能ごとにアルファベット順にソートされているため、特定のテーブルに対してできることは簡単にわかります。接頭辞「usp」を使用すると、他のプロシージャ、複数のテーブル、関数、ビュー、サーバーとやり取りする1000行のプロシージャを(たとえば)書いている場合に、何を呼び出しているかを知ることができます。
SQL ServerのエディターIDEがVisual Studioと同等になるまで、プレフィックスを保持します。
関係するデータベースオブジェクトのapplication prefix_ operation prefix_ description(アンダースコア間のスペースを除く-表示するためにスペースを入れる必要がありました)。
使用する操作プレフィックス-
e.g
wmt_ ins _ customer _details
「従業員管理ツール、顧客表に詳細を挿入」
利点
同じアプリケーションに関連するすべてのストアドプロシージャは、名前でグループ化されます。グループ内では、同じ種類の操作(挿入、更新など)を実行するストアドプロシージャがグループ化されます。
このシステムは、私たちにとってうまく機能します。私の頭上にある1つのデータベースに1000個のストアドプロシージャがあります。
これまでのところ、このアプローチの欠点に遭遇したことはありません。
GetXXX-@IDに基づいてXXXを取得します
GetAllXXX-すべてのXXXを取得します
PutXXX-@IDが-1の場合、XXXを挿入します。他の更新
DelXXX-@IDに基づいてXXXを削除します
SQlサーバーでsp_ *を使用しないでください。システムに保存されているすべての手順はsp_で始まるため、システムは名前に対応するオブジェクトを見つけることが難しくなります。
したがって、sp_以外のものから始めると、物事が簡単になります。
そのため、最初に一般的なProc_という名前を使用します。これにより、1つの大きなスキーマファイルが提供されている場合、プロシージャを簡単に識別できます。
それとは別に、関数を識別するプレフィックスを割り当てます。好む
Proc_Poll_Interface, Proc_Inv_Interface
など.
これにより、POLLの仕事をするすべてのストアドプロシージャとInventoryなどを見つけることができます。
とにかくプレフィックスシステムは問題のドメインに依存します。しかし、alは、人々が編集用のexplorerドロップダウンでストアドプロシージャを簡単に見つけられるようにするだけであっても、同様の何かが存在するはずだと言って実行しました。
他の例の機能。
Proc_Order_Place
Proc_order_Delete
Proc_Order_Retrieve
Proc_Order_History
私たちは関数ベースの命名規則に従いましたProcsは、テーブルのような静的オブジェクトではなく、コード/関数に似ています。 Procsが複数のテーブルで動作する可能性はありません。
Procが単一の名前で処理できるよりも多くの機能を実行した場合、それは、procが必要以上に多くのことを行っていること、およびそれらを再び分割する時間を意味します。
お役に立てば幸いです。
スレッドに遅れて参加しましたが、ここに返信を入力します。
私の最後の2つのプロジェクトでは、次のような異なる傾向があります。
データを取得するには:s <tablename> _G
データを削除するには:s <tablename> _D
データを挿入するには:s <tablename> _I
データを更新するには:s <tablename> _U
この命名規則は、フロントエンドでもWordの前に付けられます。 dt。
例:
exec sMedicationInfo_G
exec sMedicationInfo_D
exec sMedicationInfo_I
exec sMedicationInfo_U
アプリケーションで上記の命名規則を使用することで、覚えやすい名前を使用できます。
2番目のプロジェクトでは、同じ命名規則を使用しましたが、lilは異なります。
データを取得するには:sp_ <tablename> G
データを削除するには:sp_ <tablename> D
データを挿入するには:sp_ <tablename> I
データを更新するには:sp_ <tablename> U
例:
exec sp_MedicationInfoG
exec sp_MedicationInfoD
exec sp_MedicationInfoI
exec sp_MedicationInfoU
Usp_の命名規則は役に立たないと思います。
以前は、CRUD操作にGet/Update/Insert/Deleteプレフィックスを使用していましたが、Linq to SQLまたはEFを使用してほとんどのCRUD作業を行っているため、これらは完全になくなりました。新しいアプリケーションにはストアドプロシージャがほとんどないので、命名規則は以前のように重要ではなくなりました;-)
現在作業中のアプリケーションには、アプリケーション名を識別するプレフィックス(4つの小文字)があります。これは、アプリケーションが同じデータベース内のレガシーアプリケーションと共存できる必要があるため、プレフィックスが必須であるためです。
レガシー制約がなかった場合、プレフィックスを使用しないと確信しています。
プレフィックスの後に、通常、SP nameを、プロシージャの動作を説明する動詞で開始し、次に操作するエンティティの名前を入力します。エンティティ名の複数形化は許可されます-読みやすさを強調するため、名前だけから手順が何をするのかが明らかです。
チームの典型的なストアドプロシージャ名は次のとおりです。
shopGetCategories
shopUpdateItem
あなたが論理的で一貫している限り、あなたのプレフィックスが何であるかは正確に重要ではないと思います。個人的に使用します
spu_ [アクションの説明] [プロセスの説明]
ここで、アクションの説明は、get、set、archive、insert、deleteなどの典型的なアクションの小さな範囲の1つです。プロセスの説明は、短いが説明的なものです。たとえば、
spu_archiveCollectionData
または
spu_setAwardStatus
同様に関数に名前を付けますが、接頭辞udf_を付けます
私は、プロシージャの命名に疑似ハンガリー記法を使用しようとする人々を見てきましたが、私の意見では、それが明らかにする以上のものを隠しています。私の手順をアルファベット順にリストしている限り、機能別にグループ化されていることがわかります。それは、私にとって、順序と不必要な厳密さのスイートスポットのようです