4.0 KiB
4.0 KiB
| description | applyTo |
|---|---|
| SQLステートメントとストアドプロシージャ生成のガイドライン | **/*.sql |
SQL開発
データベーススキーマ生成
- すべてのテーブル名は単数形にする
- すべての列名は単数形にする
- すべてのテーブルは
idという名前の主キー列を持つべき - すべてのテーブルは作成タイムスタンプを格納するための
created_at列を持つべき - すべてのテーブルは最終更新タイムスタンプを格納するための
updated_at列を持つべき
データベーススキーマ設計
- すべてのテーブルに主キー制約を設ける
- すべての外部キー制約には名前を付ける
- すべての外部キー制約はインラインで定義する
- すべての外部キー制約には
ON DELETE CASCADEオプションを設ける - すべての外部キー制約には
ON UPDATE CASCADEオプションを設ける - すべての外部キー制約は親テーブルの主キーを参照する
SQLコーディングスタイル
- SQLキーワード(SELECT、FROM、WHERE)には大文字を使用する
- ネストしたクエリや条件には一貫したインデントを使用する
- 複雑なロジックを説明するためのコメントを含める
- 読みやすさのため長いクエリを複数行に分割する
- 句を一貫して整理する(SELECT、FROM、JOIN、WHERE、GROUP BY、HAVING、ORDER BY)
SQLクエリ構造
- SELECT *の代わりにSELECTステートメントで明示的な列名を使用する
- 複数のテーブルを使用する際は、列名をテーブル名またはエイリアスで修飾する
- 代わりに結合を使用できる場合はサブクエリの使用を制限する
- 結果セットを制限するためにLIMIT/TOP句を含める
- 頻繁にクエリされる列に適切なインデックスを使用する
- WHERE句のインデックス列に関数を使用することを避ける
ストアドプロシージャ命名規則
- ストアドプロシージャ名に'usp_'のプレフィックスを付ける
- ストアドプロシージャ名にはPascalCaseを使用する
- 目的を示す説明的な名前を使用する(例:usp_GetCustomerOrders)
- 複数レコードを返す場合は複数名詞を含める(例:usp_GetProducts)
- 単一レコードを返す場合は単数名詞を含める(例:usp_GetProduct)
パラメータ処理
- パラメータに'@'のプレフィックスを付ける
- パラメータ名にはcamelCaseを使用する
- オプションパラメータにはデフォルト値を提供する
- 使用前にパラメータ値を検証する
- パラメータをコメントで文書化する
- パラメータを一貫して配置する(必須を最初、オプションを後)
ストアドプロシージャ構造
- 説明、パラメータ、戻り値を含むヘッダーコメントブロックを含める
- 標準化されたエラーコード/メッセージを返す
- 一貫した列順序で結果セットを返す
- ステータス情報を返すためにOUTPUTパラメータを使用する
- 一時テーブルに'tmp_'のプレフィックスを付ける
SQLセキュリティベストプラクティス
- SQLインジェクションを防ぐためすべてのクエリをパラメータ化する
- 動的SQLを実行する際にはプリペアドステートメントを使用する
- SQLスクリプトに認証情報を埋め込まない
- システム詳細を公開しない適切なエラーハンドリングを実装する
- ストアドプロシージャ内での動的SQLの使用を避ける
トランザクション管理
- 明示的にトランザクションを開始しコミットする
- 要件に基づいて適切な分離レベルを使用する
- テーブルをロックする長時間実行されるトランザクションを避ける
- 大容量データ操作にはバッチ処理を使用する
- データを変更するストアドプロシージャにはSET NOCOUNT ONを含める