web-dev-qa-db-ja.com

ストアドプロシージャの命名規則は何ですか?

ストアドプロシージャに名前を付けるためのさまざまなルールを見てきました。

Sproc名の先頭にusp_を付ける人もいれば、アプリ名の略語を付ける人もいれば、所有者名を付ける人もいます。意図しない限り、SQL Serverでsp_を使用しないでください。

動詞(Get、Add、Save、Remove)でproc名を開始するものもあります。その他は、エンティティ名を強調します。

数百のsprocがあるデータベースでは、既に存在すると思われる場合にスクロールして適切なsprocを見つけるのは非常に困難です。命名規則により、sprocを簡単に見つけることができます。

命名規則を使用していますか?それを説明し、他の選択肢よりもそれを好む理由を説明してください。

返信の概要:

  • 誰もが命名の一貫性を主張しているようです。誰もが特定の命名規則よりも同じ命名規則を使用することがより重要であるかもしれない。
  • プレフィックス:多くの人がusp_または類似のもの(ただしsp_はめったにありません)を使用していますが、他の多くの人はデータベース名またはアプリ名を使用しています。ある巧妙なDBAは、gen、rpt、およびtskを使用して、一般的なCRUD sprocsをレポートまたはタスクに使用されるものと区別します。
  • 動詞+名詞は、名詞+動詞よりも若干人気があるようです。動詞にSQLキーワード(選択、挿入、更新、削除)を使用する人もいれば、GetやAddなどの非SQL動詞(またはそれらの略語)を使用する人もいます。単数名詞と複数名詞を区別して、1つまたは複数のレコードが取得されているかどうかを示します。
  • 必要に応じて、最後に追加のフレーズが提案されます。 GetCustomerById、GetCustomerBySaleDate。
  • 名前セグメントの間にアンダースコアを使用する人もいれば、アンダースコアを避ける人もいます。 app_ Get_CustomerとappGetCustomer-読みやすさの問題だと思います。
  • Sprocの大規模なコレクションは、Oracleパッケージ、Management Studio(SQL Server)ソリューションおよびプロジェクト、またはSQL Serverスキーマに分離できます。
  • わかりにくい略語は避けてください。

私がした答えを選んだ理由: SOたくさんの良い回答があります。ありがとうございます!ご覧の通り、1つだけを選ぶのは非常に難しいでしょう。私が選んだものは私に共鳴しました。私は彼が説明したのと同じ道をたどりました-動詞+名詞を使おうとして、顧客に当てはまるすべてのsprocを見つけることができませんでした。

既存のsprocを見つけることができるか、存在するかどうかを判断できることが非常に重要です。誰かが誤って別の名前で重複したsprocを作成すると、深刻な問題が発生する可能性があります。

私は通常、数百のsprocを持つ非常に大きなアプリで作業しているため、見つけやすい命名方法を好みます。小規模なアプリの場合、メソッド名の一般的なコーディング規則に従って、動詞+名詞を推奨します。

また、あまり役に立たないusp_の代わりに、アプリ名をプレフィックスとして付けることも推奨しています。複数の人が指摘したように、データベースには複数のアプリのsprocが含まれている場合があります。そのため、アプリ名を接頭辞として付けると、sprocを分離しやすくなり、DBAなどがsprocを使用するアプリを決定するのに役立ちます。

118
DOK

私の最後のプロジェクトでは、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)。

65
dnolan

SQL Serverのsp_プレフィックスの問題に関する説明をいくつか示します。

プレフィックスsp_で名前が付けられたストアドプロシージャは、Masterデータベースに格納されたシステムsprocです。

Sprocにこのプレフィックスを付けると、SQL Serverは最初にMasterデータベースで検索し、次にコンテキストデータベースで検索するため、不必要にリソースを浪費します。また、ユーザーが作成したsprocがシステムのsprocと同じ名前の場合、ユーザーが作成したsprocは実行されません。

Sp_プレフィックスは、sprocがすべてのデータベースからアクセス可能であるが、現在のデータベースのコンテキストで実行する必要があることを示します。

Here's パフォーマンスヒットのデモを含むニースの説明。

Here's Antがコメントで提供している別の役立つソース。

34
DOK

Systems Hungarian (上記の「usp」プレフィックスのように)身震いします。

構造が類似したさまざまなデータベース間で多くのストアドプロシージャを共有しているため、データベース固有のものについては、データベース名自体のプレフィックスを使用します。共有プロシージャにはプレフィックスがありません。別のスキーマを使用することは、そのようなややいプレフィックスを完全に取り除くための代替手段かもしれないと思います。

接頭辞の後の実際の名前は、関数の命名とほとんど変わりません。通常、「追加」、「設定」、「生成」、「計算」、「削除」などの動詞の後に、「ユーザー」などのより具体的な名詞が続きます。 「」、「DailyRevenues」など。

Antのコメントへの応答:

  1. テーブルとビューの違いは、データベーススキーマを設計する人に関係し、その内容にアクセスまたは変更する人には関係ありません。まれにスキーマの詳細が必要な場合、見つけるのは簡単です。カジュアルなSELECTクエリの場合、それは無関係です。実際、テーブルとビューを同じように扱うことができるのは大きな利点だと思います。
  2. 関数やストアドプロシージャとは異なり、テーブルやビューの名前が動詞で始まったり、1つ以上の名詞以外の名前になることはほとんどありません。
  3. 関数を呼び出すには、スキーマプレフィックスが必要です。実際、呼び出し構文(とにかく使用する)は、関数とストアドプロシージャで大きく異なります。しかし、そうでなかったとしても、1と同じことが当てはまります。関数とストアドプロシージャを同じように扱うことができるのであれば、なぜそうすべきではないのでしょうか。
16
Sören Kuklau

ストアドプロシージャ名をwithsp_は、システムsprocがすべてsp_で始まるため、SQL Serverでは不適切です。一貫した命名(hobgoblin-domの範囲まで)は、データディクショナリに基づいて自動化されたタスクを容易にするため便利です。 SQL Server 2005では、スキーマがサポートされているため、プレフィックスの有用性がやや劣ります。スキーマは、名前のプレフィックスが使用される方法でさまざまな種類の名前空間に使用できます。たとえば、スタースキーマでは、dimおよびfactスキーマを使用して、この規則で表を参照できます。

ストアドプロシージャの場合、システムsprocからアプリケーションsprocを識別するためにプレフィックスを使用すると便利です。 up_ vs. sp_を使用すると、データディクショナリから非システムストアドプロシージャを比較的簡単に識別できます。

私は長年にわたってほとんどすべての異なるシステムを使用してきました。私はついにこれを開発し、今日も使用し続けています。

プレフィックス:

  • gen-一般:CRUD、主に
  • rpt-レポート:説明不要
  • tsk-タスク:通常、手続き型ロジックを使用して、スケジュールされたジョブで実行します

アクション指定子:

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
9
Pittsburgh DBA

TableName_WhatItDoes

  • Comment_GetByID

  • Customer_List

  • UserPreference_DeleteByUserID

プレフィックスなしまたは愚かなハンガリーのナンセンス。最も密接に関連付けられているテーブルの名前と、その機能の簡単な説明。

上記の1つの注意点:個人的には常に、自動生成されたすべてのCRUDにzCRUD_をプレフィックスとして付けて、リストの最後まで並べ替える必要がないようにします。

9
Jason Kester

現在、次のような形式を使用しています

表記法:

[前書き] [アプリケーション] [モジュール] _ [名前]

例:

P_CMS_USER_UserInfoGet

私はいくつかの理由でこの表記法が好きです:

  • 非常に単純なプレフィックスで開始すると、プレフィックスで始まるオブジェクトのみを実行するコードを記述できます(たとえば、SQLインジェクションを減らすため)
  • 大規模な環境では、複数のチームが同じデータベースアーキテクチャを実行する異なるアプリで作業しています。アプリケーション表記は、SPを所有するグループを指定します。
  • 「モジュール」セクションと「名前」セクションは、単純に階層を完成させます。すべての名前は、階層からグループ/アプリ、モジュール、機能に一致できる必要があります。
4
pearcewg

ストアドプロシージャは常にpackagesでカプセル化しています(職場でOracleを使用しています)。これにより、個別のオブジェクトの数が減り、コードの再利用が促進されます。

命名規則は好みの問題であり、プロジェクト開始時に他のすべての開発者と同意する必要があります。

4

小さなデータベースの場合、uspTableNameOperationNameを使用します。 uspCustomerCreate、uspCustomerDeleteなど。これにより、「メイン」エンティティによるグループ化が容易になります。

大規模なデータベースの場合、スキーマまたはサブシステム名を追加します。グループ化を維持するための受信、購入など(SQLサーバーはアルファベット順に表示するのが好きなので)

わかりやすくするために、名前の略語を避けるようにしています(プロジェクトの新しい人は、sprocの名前がuspUsingNoAbbreviationsIncreasesClarityForEveryoneであるため、「UNAICFE」が何を表しているのかを気にする必要はありません)

4
Steven A. Lowe

私はいつも使用します:

usp [テーブル名] [アクション] [追加の詳細]

「tblUser」というテーブルがある場合、次のようになります。

  • uspUserCreate
  • uspUserSelect
  • uspUserSelectByNetworkID

プロシージャは、テーブル名と機能ごとにアルファベット順にソートされているため、特定のテーブルに対してできることは簡単にわかります。接頭辞「usp」を使用すると、他のプロシージャ、複数のテーブル、関数、ビュー、サーバーとやり取りする1000行のプロシージャを(たとえば)書いている場合に、何を呼び出しているかを知ることができます。

SQL ServerのエディターIDEがVisual Studioと同等になるまで、プレフィックスを保持します。

2
Ant

関係するデータベースオブジェクトのapplication prefix_ operation prefix_ description(アンダースコア間のスペースを除く-表示するためにスペースを入れる必要がありました)

使用する操作プレフィックス-

  • get” –レコードセットを返します
  • ins」–データを挿入
  • upd」–データを更新
  • del」–データを削除

e.g

wmt_ ins _ customer _details

「従業員管理ツール、顧客表に詳細を挿入」

利点

同じアプリケーションに関連するすべてのストアドプロシージャは、名前でグループ化されます。グループ内では、同じ種類の操作(挿入、更新など)を実行するストアドプロシージャがグループ化されます。

このシステムは、私たちにとってうまく機能します。私の頭上にある1つのデータベースに1000個のストアドプロシージャがあります。

これまでのところ、このアプローチの欠点に遭遇したことはありません。

2
Russ Cam

GetXXX-@IDに基づいてXXXを取得します

GetAllXXX-すべてのXXXを取得します

PutXXX-@IDが-1の場合、XXXを挿入します。他の更新

DelXXX-@IDに基づいてXXXを削除します

2
tsilb

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が必要以上に多くのことを行っていること、およびそれらを再び分割する時間を意味します。

お役に立てば幸いです。

1
computinglife

スレッドに遅れて参加しましたが、ここに返信を入力します。

私の最後の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
1
Gaurav Aroraa

Usp_の命名規則は役に立たないと思います。

以前は、CRUD操作にGet/Update/Insert/Deleteプレフィックスを使用していましたが、Linq to SQLまたはEFを使用してほとんどのCRUD作業を行っているため、これらは完全になくなりました。新しいアプリケーションにはストアドプロシージャがほとんどないので、命名規則は以前のように重要ではなくなりました;-)

1
Dave Markle

現在作業中のアプリケーションには、アプリケーション名を識別するプレフィックス(4つの小文字)があります。これは、アプリケーションが同じデータベース内のレガシーアプリケーションと共存できる必要があるため、プレフィックスが必須であるためです。

レガシー制約がなかった場合、プレフィックスを使用しないと確信しています。

プレフィックスの後に、通常、SP nameを、プロシージャの動作を説明する動詞で開始し、次に操作するエンティティの名前を入力します。エンティティ名の複数形化は許可されます-読みやすさを強調するため、名前だけから手順が何をするのかが明らかです。

チームの典型的なストアドプロシージャ名は次のとおりです。

shopGetCategories
shopUpdateItem
1
driis

あなたが論理的で一貫している限り、あなたのプレフィックスが何であるかは正確に重要ではないと思います。個人的に使用します

spu_ [アクションの説明] [プロセスの説明]

ここで、アクションの説明は、get、set、archive、insert、deleteなどの典型的なアクションの小さな範囲の1つです。プロセスの説明は、短いが説明的なものです。たとえば、

 spu_archiveCollectionData 

または

 spu_setAwardStatus 

同様に関数に名前を付けますが、接頭辞udf_を付けます

私は、プロシージャの命名に疑似ハンガリー記法を使用しようとする人々を見てきましたが、私の意見では、それが明らかにする以上のものを隠しています。私の手順をアルファベット順にリストしている限り、機能別にグループ化されていることがわかります。それは、私にとって、順序と不必要な厳密さのスイートスポットのようです

1
Cruachan