サンプルデータベースでみる SQL Server のオブジェクトのネーミングルール

SQL Server では、Microsoft からいくつかのサンプルデータベースが提供されています。

- [SQL samples](https://docs.microsoft.com/en-us/sql/samples/sql-samples-where-are?view=sql-server-ver15)
- [Azure Data SQL Samples Repository](https://github.com/microsoft/sql-server-samples)
- [AdventureWorks Sample Databases](https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/ms124501(v=sql.100))
- [Wide World Importers sample databases for Microsoft SQL](https://docs.microsoft.com/en-us/sql/samples/wide-world-importers-what-is?view=sql-server-ver15)

現在、サンプルとして利用される機会の多いデータベースは「AdventureWorks」「WideWorldImporters」の 2 種類となりますが、これらのデータベースでは、どのようなネーミングルール (命名規則) が使用されているのかを確認してみました。

最新のサンプル DB は WideWorldImporters ですので、こちらの規則のほうが最新なのかもしれませんね。

SQL Server ではポリシーベースの管理を行うことができ、次のドキュメントでは機能を使用して命名規則を設定しています。
- [レッスン 2: 名前付け基準ポリシーの作成と適用](https://docs.microsoft.com/ja-jp/sql/relational-databases/policy-based-management/lesson-2-create-and-apply-a-naming-standards-policy?view=sql-server-ver15)

ポリシーのサンプルは次のリポジトリでも公開されています。
(SSMS をインストールしている環境であれば、C:\Program Files (x86)\Microsoft SQL Server\140\Tools\Policies あたりにも入っているかと)

- [Policy-Based Management Sample Policies](https://github.com/microsoft/sql-server-samples/tree/master/samples/features/epm-framework/sample-policies)

策定したネーミングルールはこのようなポリシー機能を使って強制をすることも考慮できるのではないでしょうか。

# ネーミングルール
## 命名の基本
- パスカルケース (アッパーキャメルケース) を利用 (WideWorldImporters / CustomerCategories)

## データベース
- パスカルケース (アッパーキャメルケース) を利用 (WideWorldImporters/ CustomerCatAdventureWorks2017gories)

## テーブル
- AdventureWorks : プレフィックスは使用しない (Department)
- WideWorldImporters : プレフィックスは使用しない (SupplierTransactions)

## ビュー 
- AdventureWorks : プレフィックスとして v を使用 (vSalesPerson)
    - v<ビュー名>
- WideWorldImporters : プレフィックスは使用しない (Customers)


## ストアドプロシージャ
- AdventureWorks : プレフィックスとして usp を使用 (uspLogError)
    - usp<ストアドプロシージャ名>
- WideWorldImporters  : プレフィックスは使用しない (SearchForPeople)

## 関数
- AdventureWorks : プレフィックスとして ufn を使用 (ufnGetAccountingEndDate)
    - ufn<関数名>
- WideWorldImporters : プレフィックスは使用しない (CalculateCustomerPrice)

## トリガー
- AdventureWorks : プレフィックスとしてトリガーの対象 (i / u / d ) を使用 (uWorkOrder / dVendor / iduSalesOrderDetail)
    - <トリガーの処理対象 (複数ある場合は、idu を順に記載><テーブル名>
- WideWorldImporters : トリガーが存在しない


## チェック制約
- AdventureWorks : プレフィックスとして CK_ を使用 (CHECK_CONSTRAINT)
    - CK_<テーブル名>_<列名>
- WideWorldImporters : プレフィックスとして CK_ を使用 (CK_Sales_Invoices_ReturnedDeliveryData_Must_Be_Valid_JSON)
    - CK_<スキーマ名>_<テーブル名>_<列名>_<制約の説明>

## デフォルト制約
- AdventureWorks : プレフィックスとして DF_ を使用 (DF_EmployeeDepartmentHistory_ModifiedDate)
    - DF_<テーブル名>_<列名>
- WideWorldImporters : プレフィックスとして DF_ を使用 (DF_Sales_BuyingGroups_BuyingGroupID)
    - DF_<スキーマ名>_<テーブル名>_<列名>

## 外部キー制約
- AdventureWorks : プレフィックスとして FK_ を使用 (FK_Store_SalesPerson_SalesPersonID)
    - FK_<ベーステーブル名>_<ベーステーブル列名>_<参照先テーブル名>_<参照先テーブル列名>
    - インデックスを作成する場合は、IX_<ベーステーブル名>_<ベーステーブル列名> を作成
- WideWorldImporters : プレフィックスとして FK_ を使用 (FK_Purchasing_PurchaseOrders_ContactPersonID_Application_People)
    - FK_<ベーステーブルスキーマ名>_<ベーステーブル名>_<ベーステーブル列名>_<参照先テーブルスキーマ名>_<参照先テーブル名>
    - インデックスを作成する場合は、FK_<ベーステーブルスキーマ名>_<ベーステーブル名>_<ベーステーブル列名> を作成

## プライマリキー制約
- AdventureWorks :  プレフィックスとして PK_ を使用 (PK_PersonPhone_BusinessEntityID_PhoneNumber_PhoneNumberTypeID)
    - PK_<テーブル名>_<列名>
- WideWorldImporters : プレフィックスとして PK_ を使用 (PK_Sales_Invoices)
    - PK_<スキーマ名>_<テーブル名>

## クラスター化インデックス
- AdventureWorks : PK = クラスター化インデックスとなっている
- WideWorldImporters : プレフィックスとして CX を使用(CX_Sales_CustomerTransactions)
    - CX_<スキーマ名>_<テーブル名>

## 非クラスター化インデックス
- AdventureWorks : プレフィックスとして IX_ を使用 (IX_EmployeeDepartmentHistory_DepartmentID)
    - IX_<テーブル名>_<列名>
- WideWorldImporters : プレフィックスとして IX_ を使用 (IX_Application_People_FullName)
    - IX_<スキーマ名>_<テーブル名>_<列名>

## ユニークキー制約 (一意インデックス)
- AdventureWorks : プレフィックスとして UQ_ を使用 (UQ__Document__F73921F7C5112C2E)
    - UQ_テーブル名_<?>
- WideWorldImporters : プレフィックスとして UQ_ を使用 (UQ_Sales_CustomerCategories_CustomerCategoryName)
    - UQ_<スキーマ名>_<テーブル名>_<列名>
   
## シーケンス
- AdventureWorks : 未使用
- WideWorldImporters : プレフィックスは使用しない (StateProvinceID)


   
# 参考資料
[予約済みキーワード (Transact-SQL)](https://docs.microsoft.com/ja-jp/sql/t-sql/language-elements/reserved-keywords-transact-sql?view=sql-server-ver15)
[Database Naming Conventions by Microsoft?](https://stackoverflow.com/questions/3593582/database-naming-conventions-by-microsoft)
[SQL Server Name Convention and T-SQL Programming Style](https://github.com/ktaranov/sqlserver-kit/blob/master/SQL%20Server%20Name%20Convention%20and%20T-SQL%20Programming%20Style.md)