2012-03-06 15 views
1

印刷会社のWebアプリケーションを構築していて、自分のデータベースに最適なデザインを決定しようとしています。この注文状況のデータベーステーブルを設定するには

私はordersテーブルを持っています。各orderには多くの証明があります。しかし、電子証明と物理証明の2種類の証明があります。さらに、電子証拠であれば、イメージソースを保管する必要があります。その証拠があれば、追跡番号を保管する必要があります。

すべての証拠には、多くのコメントが関連付けられています。

proofsテーブルと1つのcommentsテーブルを持つことができればいいですが、プルーフタイプに基づいてイメージソースとトラッキング番号を追跡する最良の方法は何ですか?

私はelectronic_proofsphysical_proofsのための別々のテーブルを作成すると考えられてきたが、それは別のelectronic_proof_commentsテーブルとphysical_proof_commentsテーブルを作る必要であろう。

もう1つのオプションは、proofsという単一のテーブルを持つことです。この場合、単一のcommentsテーブルを持つことができます。しかし、それを見ると、それは3つのサポートテーブルproof_types,image_sources、およびtracking_numbersを必要とします。

この問題を解決する最善の方法についてのご意見はありますか?

+0

引用:「electronic_proofsとphysical_proofsのテーブルを別々に作成することを検討しましたが、別のelectronic_proof_commentsテーブルとphysical_proof_commentsテーブルを作成する必要があります。なぜそれをしないのですか?最も簡単な解決策のようです。 – Msonic

+2

@Msonic:それには[多形連想](http://guides.rubyonrails.org/association_basics.html#polymorphic-associations)を使うことができます。 –

+0

@Msonicこれについてもっと良い方法があるようです。私はそれをやっているように感じるので、必要なテーブルの数が多くなりすぎると面倒になります –

答えて

4

別の回答に記載されているとおり、テーブルは1つだけ必要で、タイプに応じてフィールドの1つを空白のままにしておくだけです。しかし、私の答えの違いは、注文の詳細(または例の注文項目)の証明ではなく、注文の詳細を証明に関連付けることです。このようにすると、注文明細ごとに複数の校正を行うことができます。

これは、私はあなたがいた場合、私はそれを設定する方法を示します。

ORDERS

  • 受注コード(PK)
  • 得意先(FK)
  • 等...

ORDERDETAILS

  • OrderDetailsID(PK)
  • 受注コード(FK)
  • のProductID? (FK)
  • 等...

証明

  • ProofID(PK)
  • OrderDetailsID(FK)
  • ProofType
  • のImagePath(単にパスではなく、画像)
  • トラッキング番号
  • その他...

コメント

  • CommentID(PK)
  • ProofID(FK)
  • コメント
  • 等...

おそらくまたProofTypeを破るために賢明だろうそれ自体のテーブルには、しかし、仕事なしで動作します。これを行う場合は、ProofTypeテーブルを作成し、新しい "ProofType"テーブルの "ProofTypeID"フィールドを参照する外部キーに "Proofs"テーブルの "ProofType"フィールドを変更します。

希望すると便利です。がんばろう!

+0

Order DetailテーブルにProof IDを含めると、多対多の関係*が*あります。プルーフテーブルに注文詳細IDを含める必要はありません。 –

+0

しかし、私の答えのコメントで言ったように、真の関係が3レベル(順序>行>証明)であれば、これはより良い解決策になります。 –

+0

私が理解したように、それは3レベルになり、それは印刷会社にとって一般的なことです。注文テーブルには一般注文情報が格納されます。注文の詳細には、さまざまなアイテム(名刺、フライヤー、ポストカード)とその属性が保持されます。そして、それらのそれぞれは複数の証明を持つことができます。 – Ricketts

0

校正タイプはアイテムの属性に過ぎないと思いますが、追跡番号と画像ソースは正しいですか?

いくつかのアイテムがサイズになる可能性がありますが、そのアイテムの種類に関係のない属性は設定しないでください。

また、2つの異なる「証明」テーブルを使用すると、オーダー明細テーブルで2つの異なるエンティティを処理する必要があります。このような

何かが基本的な使用のためになんとかする必要があります...

ORDERS 
Order ID (PK) 

ORDER ITEM 
Order Item ID (PK) 
Order ID (FK) 
Proof ID (FK) 

PROOF 
Proof ID (PK) 
Proof Name 
Proof Type 
Tracking Number 
Image Source 

COMMENTS 
Comment ID (PK) 
Proof ID (FK) 
Comment Text 

必要に応じて証拠のタイプ、追跡番号、およびイメージソースのルックアップテーブルを作成することができます。現実をリレーショナル理論とどのようにマッチさせたいと思っていますか?

+1

これは、注文アイテムが多くの証明を持つことを許可していません。できることが必要です –

+0

はい、あります。ORDER ITEMテーブルは、ORDERSテーブルとPROOFテーブルの多対多の関係です。 –

+0

実際に3つのレベルの関係がない限り、各注文には多数の注文アイテム(または「注文された製品」など)があり、それらの「注文商品」はそれぞれ複数のプルーフから構成されます。あなたの質問は、各*注文*には各注文項目ではなく、複数の証明があることを意味します。 –

1

@Ricketts(+1)に同意します。トリッキーな部分は、校正テーブルに列ImagePathTrackingNumberを持つかどうか、またはそれらを別々のテーブルに正規化するかどうかです。 (正規化は、主キーに依存しないため、主キー+プルーフタイプの列に依存します。)これらがプルーフタイプ固有の唯一の2つの列である場合は、、おそらくです。それらを単一のテーブルに格納しています...しかし、ImagePathは私を緊張させます。特にイメージではなく、実際にはかなりの大きさのバイナリデータの場合です。そのデータを独自のテーブルに個別に格納する理由はいくつかありますが、TrackingNumberも移動しないことは理にかなっています。

その他の考慮事項:プルーフタイプの比はどのくらいですか?パフォーマンスがどのように機能するか(特にデータ要求にBLOBが含まれている場合は特にそうです)最終的な決定を下す前に、これらの考慮事項を体重測定し、おそらくテストする必要があります。

+1

私の例では、バイナリデータをデータベース自体に格納しないことをお勧めしました。私はプリントデザインとウェブ開発(明らかに)会社を所有しており、多くのプリンタを取り扱っています。私が今までに見たことのあるすべてのプリンタは、PDF形式またはJPG形式のプルーフを提供します。私が彼に勧めたのは、証明書がサーバーのファイルシステムに保存されていて、その文書へのパスがImagePathに保存されているということです。その後、アプリケーションでは、バイナリデータ自体を解析するのではなく、証明のパスを参照するだけです。 – Ricketts

+0

私はその近くのどこにも行っていませんでした - その件に関しては、その件に関して十数の質問がありますが、白黒の答えはめったにありません。 (基本的な質問:DBにファイルパスがあるのに何らかの理由でファイルが見つからない場合はどうしますか?)あるいは、Filestreamデータ型を使用したことがありますか?私はまだ、持っていない。 –

+0

@Rickettsソリューションを実装しましたが、TrackingNumberImagePathを別々のテーブルに正規化することも決定しました。イメージパスだけも保存しています。入力をありがとう(+1)。 –

関連する問題