誰もがTSQLのコーディング標準を推奨できますか?


9

私たちには長い間、.Netコードのコーディング標準がありました。それらを適用する方法に関するアイデアについては、時間とともに進化する信頼できるソースがいくつかあるようです。

私たちの製品で使用するために記述されたSQLのいくつかの標準をまとめることができるようにしたいのですが、適切に記述されたSQLを決定するものについてコンセンサスに関するリソースがそこにないようです。


1
Pinal Daveは、自分のサイトにコーディング標準のリストを公開しています。それらは一連の基準の公正な基準のように見えます。
1


1
識別のみをカバーする@Scott。名前付け、カーソルの使用、ストアドプロシージャ、データ型の選択など、コードの品質に実際に影響するものは何もありません...
Rowland Shaw

1
正確に、それゆえ私がそれが「重複した」ではなく「関連した」と言った理由。
スコットウィットロック

回答:


6

私の経験では、主に次のことを探します。

  • テーブルと列の名前付け-IDタイプの列にID、参照、または番号を使用するか、名前に単数形または複数形を使用するかを確認します(複数形はテーブル名に共通-THINGS、列名には単数形-たとえばTHING_ID)。私にとってここで最も重要なことは、人々が時間を無駄にすることを回避する一貫性です(たとえば、テーブル名が単数であることを直感的に知っているため、誰かがTHINGをテーブル名として入力したタイプミスに遭遇しません)。

  • すべての作成には、ファイルの一部としてドロップ(存在するオブジェクトを条件とする)を含める必要があります。また、あなたに許可を与えることもできます。

  • 選択、更新、挿入、削除は、1つの列名、1つのテーブル名、1つのwhere句/ order by句を1行に1つずつ配置して、デバッグ中に一度に1つずつ簡単にコメント化できるようにする必要があります。

  • 特に混乱する可能性のあるオブジェクトタイプのプレフィックス(ビューのvが最も重要です)。それでも適用できるかどうかはわかりませんが、以前はシステムプロシージャ以外のストアドプロシージャがsp_を開始するには非効率でした。とにかく、それらを区別するためのベストプラクティスは、usp_が最近使用したものでした。

  • トリガーの名前に、それが更新/挿入/削除用かどうか、および適用されるテーブルを含める方法を示す標準。優先する基準はありませんが、これは重要な情報であり、簡単に見つけられるはずです。

  • SQL Serverの以前のバージョンのオブジェクトの所有権に関する基準、または2005年以降に存在するはずのスキーマ。それはあなたの呼び出しですが、何か/それがどこにあるかを誰が所有しているのか、そして可能であればスキーマ/所有者をCREATEスクリプトに含めて、誤って作成される可能性を最小限に抑えることを決して推測しないでください。

  • SELECT *を使用している人は誰でも自分の尿を1パイント飲むように指示されます。

  • 本当に正当な理由がない限り(これには、ユーザーの怠惰は含まれません)、最初から主キー/外部キーの関係を保持、強制、および維持します。これは、結局のところ、リレーショナルデータベースがフラットファイルではなく、孤立したレコードが、ある時点でサポートライフを地獄にしてしまうからです。また、あなたが今それをしなければ、あなたがデータを取得すると作業の10倍になるので、イベント後にそれを実装することは決してできないと約束できます(これは強制したことがないので少しねじ込まれます)関係)。

私は何かを逃したと確信していますが、私にとってそれらは、かなりの数の状況で実際に本当の利益を提供するものです。

しかし、すべての標準と同様に、少ないほど多くなります。コーディング標準が長いほど、人々がそれらを読んで使用する可能性は低くなります。十分な間隔を置いて配置されたページをいくつか通過したら、実際に実際に変化をもたらさないものをドロップしようとします。これは、ユーザーがそれを実行する可能性を減らすためです。

編集:2つの修正-所有権セクションのスキーマを含め、count(*)に関する誤ったヒントを削除します-以下のコメントを参照してください。


1
いくつかの奇妙な選択... "SELECT COUNT(*)"は悪いですか?スキーマ(所有者と同じではない)について聞いたことがありますか?他の人は良いです
gbn '17年

1
@ジョンホプキンス-私はなぜSELECT *を使うのが悪いのか知っています。SELECT COUNT(*)を使用するのが悪い理由をあなたが言うことができれば素晴らしいでしょう。
k25 25年

1
@gbn @ k25-数年前(2002年?)に、非常に熱心なDBA(*)がいましたが、質問に応えてグーグルで調べたところ、これは古くなっているようです(これが本当だった場合)。 sqlservercentral.com/articles/Performance+Tuning/adviceoncount/…(登録が必要です)。彼女は主にOracle DBAだったので、SQLオプティマイザーの問題でもあると彼女が想定した本当の問題であった可能性があります。
Jon Hopkins

1
@gbn-はい、あります。ただし、紹介されて以来、比較的手を差し伸べているため、自動反応はユーザーでした。スキーマをカバーするように回答を更新します。
Jon Hopkins

1
@ gbn、@ k25-count(*)をさらに掘り下げます。明らかにこれはOracle 7以前の問題であり、8i以降で修正されました。これがSQL Serverで問題になったことがあるかどうかは不明ですが、問題ではなくなっています。私のDBAは時代遅れのようでした。
Jon Hopkins

3

適切に記述されたSQLを決定するものについてのコンセンサスに関して、そこにリソースはないようです

それはコンセンサスがないからです。例として、私はジョンホプキンスのリストの少なくとも半分の項目について異なる答えを持っているでしょう、そして彼のリストの詳細の量に基づいて、私たち2人が生活のためにデータベースで作業していることは安全な推測です。

とは言っても、コーディング標準は依然として適切なものであり、チームの全員が理解して同意する標準の方が優れているため、その標準に準拠する可能性が高くなります。


1
+1。最も重要なことは、チーム間の一貫性があることです。
ディーンハーディング

1
興味を持ってあなたはどう違うのですか?それらは主に好みの問題(レイアウトなど)ですか、それとも「ハード」エラーですか?
Jon Hopkins

1
@ジョン:ハードエラーはなく、単数のテーブル名、トリガーの憎しみなどの主観的なものだけです。ところで、「EXISTS()」の内部では「SELECT *」で問題ありません。
ラリーコールマン

1
公正な例(そして私はEXISTSでそれを使用し、尿を強制的に飲まない)
ジョンホプキンス

1

ジョン・ホプキンスの答えに加えて...

  • 内部オブジェクトと外部オブジェクトを分離する

    • 制約、インデックスなどのIX、UQ、TRG、CKなど
    • usfThing_Addなどのクライアント向けの小文字またはCapsCase
  • 内部オブジェクトの場合、「デフォルト以外」の場合は明示的にします

    • UQ =一意制約
    • UQC =一意のクラスター化制約
    • PK =主キー
    • PKN =非クラスター化主キー
    • IX =インデックス
    • IXU =一意のインデックス
    • IXC =クラスタ化インデックス
    • IXCUまたはIXUC =一意のクラスター化インデックス
  • スキーマを使用して、名前と権限を簡素化します。例:

    • 内部プロシージャのHelper.xxx
    • udfsのHelperFn.xxx
    • 直面しているコードのWebGUI.xxx
    • テーブルのデータおよび/または履歴および/またはステージング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.