3

これはさまざまな DB で見たことがありますが、最新の例を使用します。AdventurWorks2012 DB には、

  • PurchaseOrderHeader
  • PurchaseOrderDetail

  • SalesOrderHeader
  • 販売注文詳細

すべての情報を 2 つではなく 1 つのテーブルに入れることができるのに、なぜこの設定を行うのかという概念を理解しようとしています。この種のセットアップに関する知識が不足していて申し訳ありません。新しいテーブルを作成するときに確認したいのですが、このタイプの設計では、ヘッダーと詳細を使用してデータ入力をテーブルに取り込むために組み込むものとどのように機能するのか、その理由とその理由.

例えば

  1. 現在の日付
  2. 今月
  3. 当会計年度
  4. 会社ID
  5. リビジョン番号
  6. サービス商品 1 金額
  7. サービス商品 2 金額
  8. サービス商品 3 金額
  9. サービス商品 4 金額
  10. サービス商品 5 金額
  11. 合計金額(上記項目6~10の合計)
  12. 認証日
  13. 認証担当者
  14. 提出日

私の質問が明確であることを願っています。

======================

@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 はオリジナルの提出物です。

これを正しく正規化していますか?

4

4 に答える 4

9

このタイプの関係は、1 対多の関係と呼ばれます。親レコードが1つ、子レコードが複数ある場合に使用します。そのような関係を使用してデータを正規化します

注文書の場合、注文番号と日付など、注文を説明するヘッダーが 1 つあります。この情報は、注文ごとに 1 セットしかありません。

次に、複数の項目があり、それぞれに独自の項目名、数量、および価格があります。各テーブルにはたくさんのアイテムがあります。

テーブルを 1 つだけ作成する場合は、各アイテムの請求書ヘッダーの情報を繰り返す必要があります。アイテムと同じ数の行で同じ注文日と番号が繰り返されます。

これにはいくつかの理由があります。

  • 不必要なスペースを取り、維持するのが難しい冗長なデータがあります (たとえば、ヘッダー内の 1 つの情報を更新する場合、複数のレコードを更新する必要があります)。
  • テーブルのクエリはより複雑です。たとえば、注文ヘッダーのリストを表示したい場合は、 を使用する必要がありますDISTINCT
  • 構造は標準的ではない (正規化されていない) ため、データベース設計に標準的なアプローチを期待する他の人にとっては読みにくいものです。
于 2013-11-13T20:39:18.933 に答える
0

これは、冗長なデータを減らすための正規化のプロセスとして行われると思います。

http://support.microsoft.com/kb/283878を参照してください。

于 2013-11-13T20:38:42.477 に答える
0

ヘッダーと詳細テーブルの概念は、SQL で正規化を実行するために使用されます。正規化は、データの冗長性を減らすプロセスです。データの冗長性を取り除くことはできません。ただし、データの冗長性を減らすことはできます。データの冗長性によりアイテムが重複しています。データの冗長性には、次のような問題があります。テーブルが適切に正規化されておらず、データの冗長性がある場合、余分なメモリ スペースを消費するだけではありません。しかし、データ損失に直面せずにデータベースを処理および更新することも困難になります。データベースが正規化されていない場合、挿入、更新、および削除の異常が非常に頻繁に発生します。

これらのリンクを参照して、正規化を学習できます。

https://www.studytonight.com/dbms/database-normalization.php

https://www.guru99.com/database-normalization.html

于 2018-06-11T19:29:56.827 に答える