この特集のトップページへ
Chapter 3:データストア層の構築

head2.gif 3.2.3 伝票情報テーブル
 伝票情報テーブルは,営業部が起票した伝票を格納するためのテーブルである。この伝票が,営業部から製品管理部へ,さらに経理部へと,順に回ることになる。

 伝票をデータベーステーブルとして表現するのは,やや難しい。まずは,一般的な伝票について考えてみる。一般的に伝票は,Fig.3-4に示すように,取引先の顧客名や製品の発送先,納期,合計額といった伝票全体にかかわる部分と,実際にどの製品をいくつ注文してその価格はいくらであるかといった明細にかかわる部分とに分けることができる。

Fig.3-4 伝票
fig3_04.gif

 こういった形式のデータをデータベースで管理する場合には,2つのデータベーステーブルに分け,互いに繋がりを持たせるようにする。ここでは,伝票全体を保存するテーブルを「伝票情報テーブル」,明細の各行を保存するテーブルを「明細情報テーブル」として作成することにする。

○伝票情報テーブル

 伝票情報テーブルには,伝票全体の情報,すなわち取引先となる顧客,製品の発送先,納期,合計額などを保持するフィールドが必要である。ただし,取引先となる顧客を表すフィールドには,顧客名を文字列として保存するのではなく,顧客情報テーブルに格納されている各顧客に対して唯一無二に割り当てた顧客番号(顧客情報テーブルのIDフィールドに格納される値)を格納する。そうしておけば,将来顧客名が変更されても,伝票はその影響を受けずにすむ(Table 3-3Fig.3-5)。

Table 3-3 伝票情報テーブル

フィールド名

サイズ

NULL

解説

ID

数値型
(オートナンバー)

不可

伝票を識別するための唯一無二の番号。伝票番号として使われる

CUSTOMERID

数値型

不可

この伝票の対象となる顧客を示す顧客番号。顧客情報テーブルのIDフィールドに格納されているいずれかの値が格納される

MADEDATE

日付型

不可

伝票の起票日

DIVISION 文字型 64 顧客側の部署名
PERSON 文字型 64 顧客側の担当者名
DELIVERDATE 日付型 不可 納入予定日
SENT_ADDR 文字型 255 発送先の住所。製品管理部が製品をこの住所に発送する
SENT_TEL 文字型 32 発送先の電話番号。製品管理部が製品発送の際の連絡先として用いる

SUBTOTAL

金銭型

不可

小計。この伝票に含まれるすべての注文の金額(税抜)を加えたもの

TAX

金銭型

不可

消費税。現状では,小計×1.05

TOTAL

金銭型

不可

合計(税込金額)。小計+消費税

MEMO 文字型 80 摘要
Fig.3-5 伝票情報テーブルと顧客情報テーブルとの関連づけ
fig3_05.gif

○明細情報テーブル

 次に,伝票の明細を記録するテーブルについて考える。Fig.3-4にも示したように,伝票の明細の各行には,「製品名」「数量」「単価」「金額」などを格納できるフィールドを定義すればよい。ただし,伝票情報テーブルにおける顧客の表現と同様に,製品を表現するためには,製品名を格納するのではなく,各製品に対して唯一無二に割り当てた製品番号(製品情報テーブルのIDフィールドに格納される値)を格納する。そうすることで,将来製品名が変わっても,明細まで影響を受けることはない(Table 3-4Fig.3-6)。

Table 3-4 明細情報テーブル

フィールド名

サイズ

NULL

解説

ID

数値型
(オートナンバー)

不可

明細を識別するための唯一無二の番号

PRODUCTID

数値型

不可

この明細の対象となる製品を示す製品番号。製品情報テーブルのIDフィールドに格納されているいずれかの値が格納される

NUMBER

数値型

不可

注文された製品の数量

UNITPRICE 金銭型 不可 製品の単価。通常は,製品情報テーブルのPRICEフィールドの値と同じものが格納される
PRICE 金銭型 不可 価格。注文された個数(NUMBER)×製品の単価(UNITPRICE)が格納される
MEMO 文字型 80 摘要
Fig.3-6 明細情報テーブルと製品情報テーブルとの関連づけ
fig3_06.gif

○伝票情報テーブルと明細情報テーブルの連結

 上記した伝票情報テーブルと明細情報テーブルには何の関係もないため,各明細がどの伝票に含まれるものなのかがわからない。そこで,明細情報テーブルに伝票番号を格納するフィールドを用意し,そこに明細が含まれる伝票番号を格納できるようにする。これによって,伝票と明細が連結できるようになる(Table 3-5Fig.3-7)。

Table 3-5 伝票番号を格納するフィールドを追加した明細情報テーブル

フィールド名

サイズ

NULL

解説

ID

数値型
(オートナンバー)

不可

明細を識別するための唯一無二の番号

PRODUCTID

数値型

不可

この明細の対象となる製品を示す製品番号。製品情報テーブルのIDフィールドに格納されているいずれかの値が格納される

NUMBER

数値型

不可

注文された製品の数量

UNITPRICE 金銭型 不可 製品の単価。通常は,製品情報テーブルのPRICEフィールドの値と同じものが格納される
PRICE 金銭型 不可 価格。注文された個数(NUMBER)×製品の単価(UNITPRICE)が格納される
MEMO 文字型 80 摘要
SLIPID 数値型 不可 この明細を含んでいる伝票の伝票番号。伝票情報テーブルのIDフィールドに格納されているいずれかの値が格納される
Fig.3-7 伝票情報テーブルと明細情報テーブルとの関連づけ
fig3_07.gif

 Table 3-5のように伝票情報テーブルと明細情報テーブルを連結させることで,伝票内にどのような明細が含まれているのかを知ることができる。たとえば,伝票番号(伝票情報テーブルのIDフィールド)が1番の伝票に含まれるすべての明細を取得したい場合には,次のようなSELECT文を発行すればよい。

   SELECT * FROM 明細情報テーブル WHERE SLIPID = 1

○伝票の全体図

 以上で説明したように,1枚の伝票は,伝票情報テーブルと明細情報テーブルで管理する。伝票情報テーブルは,顧客を特定するために顧客情報テーブルに格納されている顧客番号を参照する。そして,明細情報テーブルは,製品を特定するために製品情報テーブルに格納されている製品番号を参照する。たとえば,Fig.3-4に示したような伝票のテーブル間の連結状態を図示すると,Fig.3-8のようになる。

Fig.3-8 1枚の伝票をデータベーステーブルで表現する
fig3_08.gif
prevpg.gif Chapter 3 6/22 nextpg.gif