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


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

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

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

SQL Server ではポリシーベースの管理を行うことができ、次のドキュメントでは機能を使用して命名規則を設定しています。
- レッスン 2: 名前付け基準ポリシーの作成と適用

ポリシーのサンプルは次のリポジトリでも公開されています。
(SSMS をインストールしている環境であれば、C:\Program Files (x86)\Microsoft SQL Server\140\Tools\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)
Database Naming Conventions by Microsoft?
SQL Server Name Convention and T-SQL Programming Style