これはさまざまな DB で見たことがありますが、最新の例を使用します。AdventurWorks2012 DB には、
- PurchaseOrderHeader
- PurchaseOrderDetail
と
- SalesOrderHeader
- 販売注文詳細
すべての情報を 2 つではなく 1 つのテーブルに入れることができるのに、なぜこの設定を行うのかという概念を理解しようとしています。この種のセットアップに関する知識が不足していて申し訳ありません。新しいテーブルを作成するときに確認したいのですが、このタイプの設計では、ヘッダーと詳細を使用してデータ入力をテーブルに取り込むために組み込むものとどのように機能するのか、その理由とその理由.
例えば
- 現在の日付
- 今月
- 当会計年度
- 会社ID
- リビジョン番号
- サービス商品 1 金額
- サービス商品 2 金額
- サービス商品 3 金額
- サービス商品 4 金額
- サービス商品 5 金額
- 合計金額(上記項目6~10の合計)
- 認証日
- 認証担当者
- 提出日
私の質問が明確であることを願っています。
======================
@Szymonへの私の応答を介して、ヘッダー/詳細設定を使用する詳細な例を編集しました
上記の例では、ヘッダー/詳細設定としてレイアウトします。レコードが送信されると、ID が生成されるため、ヘッダー テーブルは次のようになります。
ヘッダー テーブル
1, '11/13/13',11,2013,'000001',0,10.00,'11/12/13','社長','チャック','11/12/13'
次に、詳細テーブルで ID も生成しますが、前のレコードを FK として使用すると、次のようになります... 1 (新しい ID)、1 (以前のヘッダー テーブルの FK)、2 (サービス製品 1 として) 、2 (サービス製品 2 として)、2 (サービス製品 3 として)、2 (サービス製品 4 として)、2 (サービス製品 5 として)
詳細表
1,1,2.00,2.00,2.00,2.00,2.00
==================================================
再改訂: より良いフォローアップの例を提供するため。
WKS_Header テーブル: (PK は WKS_Header_ID)
WKS_Header_ID [int] IDENTITY(1,1) NOT NULL,
Company_ID [varchar](6) NOT NULL,
Current_Date [DateTime] NOT NULL,
Current_Month [int] NOT NULL,
Current_Fiscal_Year [int] NOT NULL,
Revision_Number [int] NOT NULL,
Worksheet_ID [varchar] (13) NOT NULL,
Total_Amt [money] NOT NULL,
Certification_Date [DateTime] NOT NULL,
Certification_Officer [varchar] (50) NOT NULL,
Submission_Date [DateTime] NOT NULL
WKS_Header テーブルのサンプル レコード:
1,'000001','11/5/13',11,2013,0,'0000001111300',20.00,'11/1/13','Chuck','11/2/13'
2,'000001','11/7/13',11,2013,1,'0000001111301',10.00,'11/4/13','Chuck','11/5/13'
3,'000500','11/10/13',11,2013,0,'0005001111300',50.00,'11/5/13','Bob','11/7/13'
WKS_LineItems テーブル: (PK は WKS_LineItems_ID)
WKS_LineItems_ID [int] IDENTITY(1,1) NOT NULL,
LineItem_Description [varchar] (50) NOT NULL,
Create_User_ID [varchar] (50) NOT NULL,
Create_Date [datetime] NOT NULL,
Modify_User_ID [varchar] (50) NOT NULL,
Modify_Date [datetime] NOT NULL
WKS_LineItems テーブルのサンプル
1,'Service Product Widget A Amount','Admin','10/1/13',Null,Null
2,'Service Product Widget B Amount','Admin','10/1/13',Null,Null
3,'Service Product Widget C Amount','Admin','10/1/13',Null,Null
4,'Service Product Widget D Amount','Admin','10/1/13',Null,Null
5,'Service Product Widget E Amount','Admin','10/1/13',Null,Null
6,'Final Total Widgets Amount','Admin','10/1/13',Null,Null
WKS_Details テーブル: (PK は WKS_Details_ID、FK は WKS_Header テーブルの WKS_Header_ID)
WKS_Details_ID IDENTITY(1,1) NOT NULL,
WKS_Header_ID [int] NOT NULL,
WKS_LineItems_ID [int] NOT NULL,
WKS_Amount [decimal] (18,2) NOT NULL,
Create_User_ID [varchar] (50) NOT NULL,
Create_Date [datetime] NOT NULL
WKS_Details テーブルのサンプル
1,1,1,4.00,'Chuck','11/5/13'
2,1,2,0.00,'Chuck','11/5/13'
3,1,3,0.00,'Chuck','11/5/13'
4,1,4,5.00,'Chuck','11/5/13'
5,1,5,11.00,'Chuck','11/5/13'
6,1,6,20.00,'Chuck','11/5/13'
7,2,1,0.00,'Chuck','11/7/13'
8,2,2,0.00,'Chuck','11/7/13'
9,2,3,0.00,'Chuck','11/7/13'
10,2,4,0.00,'Chuck','11/7/13'
11,2,5,0.00,'Chuck','11/7/13'
12,2,6,10.00,'Chuck','11/7/13'
13,3,1,10.00,'Bob','11/10/13'
14,3,2,10.00,'Bob','11/10/13'
15,3,3,10.00,'Bob','11/10/13'
16,3,4,10.00,'Bob','11/10/13'
17,3,5,10.00,'Bob','11/10/13'
18,3,6,50.00,'Bob','11/10/13'
シナリオ: フォームから情報を入力します。WKS_Header テーブルに 3 つのレコードを作成し、関連する詳細レコードを WKS_Details テーブルに作成します。
レコード ID 1 はオリジナルの提出物であり、そのユーザーは番号を修正する必要があります。そのユーザーは別のレコードを入力します。これはレコード ID 2 であり、レコード ID 1 に取って代わる改訂された提出物です。レコード ID 3 はオリジナルの提出物です。
これを正しく正規化していますか?