販売系で頻繁に登場する事例が、受注伝票のデータモデル図です。おきまりのように受注エンティティと受注明細エンティティが親子構造で現れます。
受注明細エンティティのKEYは[受注番号、受注明細番号]あるいは[受注番号、受注商品コード]が典型的です。
この2つのKEYの違いはどこにあるのでしょう。
その答えは「受注明細が何別か」を確認するとわかります。
質問1:1件の受注で複数の商品を受注することがありますね。→yes
質問2:その時、受注明細は商品別になりますね。→yes
質問3:同じ商品コードをもつ受注明細行が2行発生することはありますか?
ポイントは質問3です。
同じ商品であっても、単価が異なる場合「販促用 10個 単価0円、通常販売用 100個 単価50円」、あるいは納入希望日が異なる場合など、明細が2行になる理由はいくつか見つかるでしょう。このような理由が見つかった場合、受注明細エンティティのKEYは、[受注番号、受注明細番号]となります。
納入希望日が異なるために受注明細を分けている例は、本来であれば納入予定エンティティを認識すべきかもしれません。受注明細エンティティに納入予定エンティティの一部の意味を紛れ込ませているのです。
ここで、主張したいことは[受注番号、受注商品コード]の方が[受注番号、受注明細番号]よりも、エンティティの意味が「濃い」ということです。エンティティの定義も「受注明細は品別明細である」と言い切れるでしょう。
一般に、新規業務設計の際、受注明細エンティティのKEYを[受注番号、受注明細番号]としておきます。[受注番号、受注商品コード]というKEYでは、将来、品明細とは別な意味を追加したい場合に対処しにくくなるからです。意味の「濃い」エンティティにするよりも適度な「あそび(自動車のハンドルのあそびからいただき)」を入れて、意味が「淡く」なる余裕を持たせておきます。
« 正規化は、データ項目の意味を頼りにKEYと全従属データ項目は等価か »

























