3

次のビジネス ロジックで構成される請求アプリケーションを構築しています。

a)顧客に新しい注文を出します。(注文は、見積書、請求書、注文書の 3 つの関連コンポーネントのグループです)

b)注文後、新しい見積もりを作成できます。1回のご注文で1回のお見積りとなります。

c)注文の見積もりを参照して。請求書を作成できます。請求書は価格の割引の対象となります。アイテムの詳細とは別に、請求書はいくつかの費用で構成されます。注文には 1 つの請求書のみを含めることができます

d)注文の請求書​​を参照して、PurchaseOrder を生成できます。PurchaseOrder は、ベンダーの購入に関するアイテム情報で構成されます。注文には複数の PurchaseOrder を含めることができます。

これが私が思いついたデータベーステーブルのデザインです。

ここに画像の説明を入力

すべてが良さそうに見えますが、注文の特定の見積もり、請求書、または注文書に属するアイテム リストをどこに保存するかを決めるのに苦労しています。

私はいくつかの解決策を考えていました。

アプローチ A :アイテム リストごとに異なるテーブルを作成します。(見積もり、請求書、注文書)
テーブル : estimate_item , .(このテーブルにはinvoice_itempurchaseorder_item上の画像の order_item と同様の列が含まれています)。
問題:このアプローチの問題は、3つのテーブルすべてが同一の情報を格納する同一の列で構成されていることです。唯一の違いは、格納される外部キーです。

アプローチ B:項目リスト テーブルorder_item
tablenameを 1 つ作成します。 order_item
問題:外部キーは 3 つの異なるテーブルから取得できるため、このテーブルに何を外部キーとして保存すればよいかわかりません。このテーブルで外部キーを処理するいくつかの方法を次のように考えました。

1)foreignKey テーブル参照列:タイプ (例の値: 見積もり、請求書、購入注文) ForeignKey 列: type_id (3 つのテーブルのいずれかのforeignKey で構成)
問題:列名の命名規則を使用していtablename_idます。外部キー。この方法はルールに違反しています。

2) 外部キー列: order_id , estimate_id, invoice_id, purchaseorder_id.
問題:不要な外部キー列が定義されています。

order_item外部キーをテーブルに保存して、注文と見積もり/請求書/購入注文も識別する方法を知りたいです。

テーブルの関係は次のとおりです。

idすべてのテーブルの主キーです

table name: order relates to (contact, estimate, invoice, shipment) tables.
column name: contact_id (foreign key(referring to id column of the contact table)).
column name: estimate_id (foreign key(referring to id column of the estimate table)).
column name: invoice_id (foreign key(referring to id column of the invoice table)).
column name: shipment_id (foreign key(referring to id column of the shipment table)).

tablename: purchaseorder (this have one to many relationship with order table)
column name: order_id (foreign key(referring to id column of the order table)).
column name: contact_id (foreign key(referring to id column of the contact table)).

問題は、order_item テーブルに外部キーを格納する方法についてです。

ありがとうございました。

更新 1:

estimate各テーブル、invoice およびpurchaseorderには独自のアイテムがあり、互いに関係がないことに注意してください。

4

2 に答える 2

1

こんにちは、関係がどのように起こるかわかりません。たとえば、「注文アイテム」を指している「見積もり」がありますが、その結合(またはルックアップ)を行うために必要なキーがわかりません。別の「注文」は「見積もり」を指していますが、これら2つはどのように結合されていますか? これらの両方のエンティティが持つ共有属性は見当たりません。

「id」は、特定の各テーブルの行を一意にするためのものであると想定していますが、アプリケーションにとって価値のある ID ではありません。そのため、「注文項目」テーブルに見積もり.参照番号を入れる必要があると思います。これはただのざっくりとしたコメントです。

また、キーが最初にリストされている場合は、明確にするのに役立ちます。したがって、「注文アイテム」には、他の属性のリストの最後に埋め込まれた属性「注文ID」(FKのように見える)があります。これを読みにくくします。

于 2012-04-28T07:33:33.527 に答える
0

私があなたを正しく理解している場合、注文に関連付けられている各ドキュメント(つまり、、estimateおよびpurchaseorder/またはinvoice)には、異なるアイテムのリストが含まれている可能性があります。

その場合は、おそらくDocuments次の行に沿ってテーブルを作成します。

CREATE TABLE Documents (
  DocumentId   INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  OrderId      INT NOT NULL,
  -- you can move any fields common to all document types here
  -- e.g. date created, reference #, etc.
  FOREIGN KEY (OrderId) REFERENCES order (id)
);

そして、、、、order_itemおよびテーブルはすべて、このテーブルの関連するエントリを参照しますestimatepurchaseorderinvoice

ALTER TABLE [tablename]
  ADD COLUMN DocumentId INT NOT NULL,
  ADD FOREIGN KEY (DocumentId) REFERENCES Documents (DocumentId)
);

これはあなたが求めているものですか?

于 2012-04-28T08:11:58.607 に答える