2009-03-10 17 views
3

私は製品データベースを設計しており、設計上の質問があります。繰り返しデータの設計

書籍、ビデオゲーム、家電、ペット用品など、さまざまなカテゴリの商品があります。共通するものがいくつかあり、製造元や価格などがありますが、他のものはそれぞれのカテゴリに固有のもので、消費電力などがあります。

個々の製品は定期的に更新され、価格は変動する可能性がありますが、メーカーはかなり一定に保たれます(メーカーが別の会社で買収され、ブランド名が購入会社に吸収されたとします)。更新は時間単位で行われる可能性があります。各製品のリクエストは頻繁に行うことができます(クライアントの数に応じて制限されません)。

私はデータへの更新を行うカム速度のために私よりも私はずっと心配のクライアントのためのデータへのアクセス速度としています。より多くの意味と、各カテゴリの場合はnullであることを許さ列を持つすべてのカテゴリについて、なぜ?:

  • つのテーブル(例えばペット用品は、電力消費のためにヌル必要があります)
  • つのテーブルを作成

    列が繰り返しと共通の特徴(価格、製造者、など)のため

  • つのテーブル(例えば、価格は各テーブルにあるであろう)、及び独特の特性のための1つのテーブル

答えて

2

私は共通の特徴のための1つのテーブルを、そしてユニークな特性を持つもう1つのテーブルを言うでしょう。

あなたは余分なプロパティは、単に製品に関連付けられたタグされDecoratorパターン、のようなものをシミュレートすることができます。

新しい製品を簡単に追加できるように、タグのグループ化が必要になるでしょう。

は、上記の構成で、あなたはおそらく、それが簡単に新しいタグを拡張するために見つけるだろう、と分類の変化に応じてタグを追加/削除します。


他のアプローチでは、次の問題が発生しました。すべてが一つのテーブルにあった場合

あなたは、フロントまですべてを知っているし、常に新しい分野を思いついたように、テーブルを変更して、NULLとして多くの分野を残していると思います。

カテゴリごとのテーブルでは、あなたはそれが維持するのは難しいかもしれません、製品の種類ごとに、さまざまなクエリを作成したと前進終わると思います。

3

一歩を踏み出し、頭をデータベースから引き出します。アプリケーションでこれをどのように解決しようとしていますか?通常、継承を使用します。スーパークラスは共通プロパティを定義し、サブクラスは特別な特性を定義します。

だからあなたの質問はのように書き換えることができます:どのように私は、データベース内の継承を実装していますか?

まず、データの重複を避けるようにしてください。取引(コード内)で簡単な間違いを犯すと、データが矛盾し、正しい価格が誰になるかわかりません。

最終的に新しい機能を追加したいので、1つの大きなテーブルはおそらく良い解決策ではありません。これにより、データベースに無駄なスペースが増えます。さらに、クラスごとにクエリを作成するか、DBから多くのNULLを取得する必要があります。

これは、マルチテーブルapporachにつながります。共通基底クラスは、インスタンスにIDを与える中央テーブルにマップされます。すべてのサブクラスは、基底クラスから塗りつぶされたID列を持つより小さな特殊なテーブルを使用します。

データをロードするときは、クラスのすべてのテーブルをまとめて結合し、すべてのデータをすべてのテーブルのIDを使用して一度にロードします。これは、データ検索が一意の主キーを超え、単純なID = ID結合にはコストがかからないため、非常に効果的です。