2011-08-02 3 views
3

現在の顧客プロジェクトでは、の製品を格納するCMSを開発しました。MySQL製品のプロパティテーブルの設計

製品など &、しかし、いくつかのクライアントは価格のような異なる特性を持つようにしたいタイトルのようないくつかのproperitiesを持つエントリ、テキスト &など
ある

私がしようコードをできるだけ一般的にとするため、コードを変更したくないので、
を各顧客に割り当ててください。

私の質問:
どのように私はそのようなデータベースを設計できますか?製品は無限の複数の特性を持つことができますか?
このような異なるデザインのフォームを作成/生成するにはどうすればよいですか?

お読みいただきありがとうございます。最初のテーブルは、第二の表は、各製品に関する独自のIDとそれらの共通の特性

-------------------------------------------------------- 
| id |  name  | other common properties... 
-------------------------------------------------------- 
| 1 |  apple  | ... 
| 2 |  bentley | 
| 3 |  ...  | 
| ... |  ...  | 

で行ごとに一つの製品が含ま

CREATE TABLE products(product_id INT, product_name VARCHAR, ...); 
CREATE TABLE product_properties(product_id INT, property_name VARCHAR, property_value VARCHAR); 

:2つのテーブルを持っている必要が

+0

これはよくある質問です。ここから始めて、http:// stackに従ってくださいoverflow.com/questions/6768074/extendable-database-schema-how-to-store-the-extendable-attribute-values/6768919#6768919 –

答えて

4

その非共通の特性へ:

---------------------------------------------------- 
| id | property_name | property_value | 
---------------------------------------------------- 
| 1 | color   | red    | 
| 1 | size   | large    | 
| 2 | wheel count  | 4     | 
| 2 | top speed  | 200    | 
| 2 | airbags   | yes    | 
| ... | ...    | ...    | 

あなたが共通の特性を得る最初の、2つのクエリで、製品の情報を取得する:あなたはプロパティのテーブルとのためのテーブルを持つことができます

SELECT property_name, property_value FROM product_properties WHERE product_id = 2 
+0

いくつかのサンプルデータといくつかのクエリで回答を延長してください。非常に役に立ちます。ありがとうございます – Herr

+0

@HerrKaleunそこに行きます。より多くの情報が必要ですか? – nobody

+1

デザインに冗長性がたくさんあります。 – Saeed

7

SELECT product_name, ... FROM products WHERE product_id = 2 

、非共通プロパティを財産を所有しているので、あなたのテーブルのスキーマは次のようになります。

製品(ID、タイトル、テキスト、...)

プロパティ(ID、名前)

Product_Properties(のProductIdPropertyId、値)

ですから、プロパティテーブルの上に所望の特性のリストを定義し、Product_Propertiesにタプルを挿入することにより、製品に割り当てます。

製品(ID

A: 180, Red, 200$ 
B: 170, Blue, 270$ 

あなたのテーブルはこれらのタプルを持つことになります。このよう高さ、色、価格:あなたはあなたのケースでは、これらの特性を有する2つの製品(AとB)を持って考えてみましょう、タイトル、テキスト):

(1,"A","desc1") 
(2,"B","desc2") 


プロパティ( ID、名前)

(1,"height") 
(2,"color") 
(3,"price") 


Product_Properties( のProductIdPropertyId、値)

(1,1,"180") 
(2,1,"179") 
(1,2,"Red") 
(2,1,"Blue") 
(1,3,"200") 
(2,3,"270") 



そして、ここの製品を取得するクエリは '200' に等しい '価格' を聖霊降臨祭:

SELECT P.title 
FROM Product P,Properties Pr,Product_Properties PP 
WHERE P.id=PP.ProductId AND PP.PropertyId=Pr.id AND Pr.name='height' AND PP.value='200' 
+0

良いですが、この方法では、製品のすべてのバリエーションに対して1つの価格があります。多くの企業では、物件ごとに異なる料金を請求する必要があります。サイズ:大型商品は小サイズ商品より高価です。 – Ozzy

関連する問題