DBオブジェクトの命名法と主キー
DBオブジェクトについて、Rails などのようにどうしても「外側から管理したい」と考える人たちは、言語側の命名法で処理したいと考えるようですが、DB側から見ると非常に使いにくいです。 そのため、弊社では以下のような命名法で用途に応じて別名を提供しています。
目次
RDBMS は階層構造やグループ化しにくい
RDBMS上のオブジェクトは基本的にフラットな関係になりますから、オブジェクト指向言語のように英語を基本とすると、とても管理しにくくなります。
ですから、名前順で並べても意味が分かるように接頭辞を付けるべきでしょう。
接頭辞と名称
弊社では、
- 1文字目:オブジェクトのタイプ
- 2文字目:大分類
- 3文字目:中分類
- 4文字目:(予備)
としています。
例えばテーブルでは、1文字目を以下のように設定しています。
- T:トランザクションテーブル
- M:マスタテーブル
- W:ワークテーブル
- P:パラメータテーブル
実際のテーブル名は以下のようになります。
- T100_Quote
- T110_QuoteDetail
- T200_Order
- T210_OrderDetail
- M100_Customer
- M200_Product
キーの命名
主キーはサロゲートキーですべて【ID】
主キーは基本的にサロゲートキー(代替キー)を使い、ナチュラルキー(業務上は意味を持つ値)は極力使いません。 すべての主キーは基本的に、【ID】で統一しています。 例えば、顧客IDは
- CustomerID
- CUSTOMER_ID
などとすることが多いと思いますが、弊社ではすべて【ID】のみです。
外部キーはテーブルの接頭辞+ID(+ 名前)
外部キーは、テーブルの接頭辞 + ID + 名前となります。 例えば、見積テーブルには、請求先IDと、納品先IDがあるとします。 いずれも、M100_Customer の外部キーになりますから
- 請求先ID:M100ID_Billing
- 納品先ID:M100ID_Delivery
とします。 また、見積明細テーブルには、当然、親となる見積テーブルのIDが入ります。 そう言うときはテーブルの接頭辞+IDとなります。
- 見積ID:T100ID
接頭辞をテーブルのエイリアスに
接頭辞をテーブルのエイリアスにすることで SQL が書きやすく読みやすくなります。 MySQL・PostgreSQLのときはテーブル名はスネークケース、SQLServerのときはパスカルケース、Oracleのときは大文字が多いが、プロジェクトによってケースバイケース。 ただし、テーブル名とエイリアスの一文字目は大文字小文字を逆にしています。
SELECT t100.ID , t100.QuoteDate , t100.M100ID_Billing , m100b.Name , t100.M100ID_Delivery , m100d.Name -- 中略 FROM T100_Quote t100 INNER JOIN T110_QuoteDetail t110 ON t100.ID = t110.T100ID INNER JOIN M100_Customer m100b ON t100.M100ID_Billing = m100b.ID INNER JOIN M100_Customer m100d ON t100.M100ID_Delivery = m100d.ID -- 後略
昨今、SQL向けの IDE も非常に充実していてインテリセンスも効きますから、接頭辞で覚えた方が速く書けるようになります。
顧客向けに
日本語(漢字)に直した(必要に応じて読み取り権限のみの)のビューを提供しましょう。 弊社ではテーブル定義をExcelで作り、テーブルのCreate文と、ビューのCreate文を同時に生成しています。
CREATE VIEW T100_見積 AS SELECT ID AS ID , QuoteDate AS 見積日 , M100ID_Billing AS 請求先ID , M100ID_Delivery AS 納品先ID -- 中略 FROM T100_Quote t100 -- 後略
この場合、インテリセンスが効く IDE で SQL を書いていれば、”T1” まで入力した時点で、候補に
- T100_Quote
- T100_見積
- T110_QuoteDetail
- T110_見積明細
と表示されますから、コーディング中も非常に分かりやすくなります。
オブジェクト指向言語向けに
接頭辞がどうしても嫌という人が出ます。 その場合、顧客向けと同じように接頭辞を外したビュー(キーの名称も直す)を提供するか、キーの名称まで文句を言わないならば、シノニム(SYNONYM)を設定して提供しましょう。
まとめ
DB側から見て使いやすい名前、オブジェクト指向言語で使いやすい名前、顧客にとって使いやすい名前が違います。 ビューやシノニムを利用すれば別名を付けることができるのですから、基本はDB側から見て使いやすい命名法にし、必要に応じて別名のものを提供すれば良いでしょう。