0

インポート用の小さなSQL SERVER 2000データベースがあります。商品を取引し、新しい機能を拡張します。正しい PK - FK 関係を実装するのに混乱しています。

次の 3 つのテーブルがあります。

Contract (ContractID (PK), SupplierID (FK), ProductID(FK), Date, Quantity, Price )

SupplierInvoice ( SupplierInvoiceID (PK), ContractID (FK) , ImportID (FK) , InvoiceNo, Date,Quantity )

Import ( ImportID (PK) , Date )

Truck ( TruckID (PK), ImportID (FK), CustomerID (FK), Date, Quantity)

説明 :

これらはバルク製品であり、パッケージはありませんが、数量のみです。

  • すべての PK は代理 (自動増分) です。
  • 1 つの契約で 0 から多くの請求書を持つことができ、1 つの請求書は 1 つの契約に属することができます。( 0 件の請求書が数日で 1 件になります)
  • 1 対多の請求書では、0 対 1 のインポートを行います。(0 のインポートは 1 になり、数日で 1 つだけになります) (多くの請求書は、部分的な契約の終了と開始が存在する可能性があることを意味します。)
  • 数量 : 1 つの契約の合計請求書数量は、契約数量を超えることはできません。これを制御するためのトリガーを構築します。インポート数量は請求書数量とまったく同じです。

質問:

  1. このモデル (PK と FK の) は正しいですか)? どう思いますか?
  2. 輸入後は輸入したものをトラックに積み込みますので、どの仕入先からどの商品を積み込みたいかを入力します。JOINを取得するまで、トラック テーブルから契約テーブルへのクエリを開始するProductIDSupplierID、非常に長いクエリになります。どう思いますか?
  3. 数量管理についてどう思いますか?在庫は、レポートの計算フィールドで計算されます。

質問 1 と 2 は、さらに先に進むために非常に重要です。あなたの助けに感謝します。

4

1 に答える 1

1

あなたの説明から、請求書とインポート テーブルの関係を変更する必要があるようです (「1 対多の請求書で 0 対 1 のインポートを行う」)。請求書テーブルにインポートIDをFKとして持っていますが、実際に必要なのは、インポートごとに多くの請求書を関連付けることができるように、請求書とインポートの間の結合テーブルとの多対多の関係であると確信しています.

また、契約ごとに複数の製品を持つことができる場合、製品と契約の間に多対多の関係を作成できるようにするために、契約テーブルと製品テーブルの間に結合テーブルが必要になります。言い換えれば、あなたは複数の契約に同じ製品を使用しており、それらの契約の少なくともいくつかは複数の製品に関係している可能性があると思いますか?

いくつかの結合についてはあまり心配しません。数十のテーブルなどを結合するところまで来たら、スキーマの非正規化を検討する前に、クエリを簡素化するために戦略的なビューを 1 つまたは 2 つ作成することを検討します。

結合のパフォーマンスが心配な場合(この少数のテーブルでは心配ありません)、SQL Server で多くのインデックス チューニングを行うことができます。データベース ビューにインデックスを配置できます。SQL Server 2000 は、マテリアライズド ビューもサポートしています。マテリアライズド ビューは、実行するクエリごとにビュー定義の結合をリアルタイムで実行する必要がないように、基本的に SQL Server にビューの形でテーブルを構築 (および動的に維持) するように指示します。 . 更新可能なビューを作成することもでき、データベース トリガーのサブセットをビューに配置することもできます。したがって、データの整合性を保つために、適切に正規化されたスキーマを使用します。クエリの複雑さと結合のパフォーマンスの問題に対処するためのソリューションはたくさんあると思います。

編集:これは、契約と製品の両方の間、および請求書とインポートの間の多対多の関係を示す更新された ER 図の例です。

契約と製品の間、および請求書とインポートの間の多対多の関係を示すスキーマ

于 2013-04-17T06:14:52.473 に答える