2011-08-09 5 views
2

PHPとMySLを使用してオンラインストアを構築しており、大きなジレンマに遭遇しました。 ノートブック、ノートブック、ネットブックなどの8つのカテゴリーに分かれているノートブック、ネットブック、HDD、RAM、ソフトウェア、ゲームなどの約50のサブカテゴリーがあります。データベース構造(mysql)...私は手がかりがありません... ideeaが必要です

これで、すべての製品について、クライアントは仕様フィールドまたは属性を管理したいと考えました。しかし、互いに異なる50セットの仕様があります。 誰かが基本的にこれを行う方法の手がかりを持っていますか?

特定のフィールドを持つデータベースに50個のテーブルを作成する必要があると思いました。もう一つのアイデアは、すべての仕様項目がサブカテゴリに含まれる8つの大きな表を作成し、その仕様がその製品に適用されない場合は「null」で埋めることでした。これは間違っています。

仕様がどのように見える...誰かが私は感謝するでしょうすべてのサブカテゴリの仕様のセットを管理する方法についてのアイデアを持っている場合は、この

INSERT INTO table_name VALUES ('','','','','','some specification','','some specification'....etc)` 

を行うには、挿入手順を構築する方法がわかりませんこの:

  • メーカー:Sony
  • プロセッサ:インテルCore i3は
  • メモリ:3ギガバイトDDR3

仕様枚...彼はすべてのサブカテゴリの仕様を設定したい...店の所有者が作成する必要があります。ノートPCをこの仕様(製造元、プロセッサ、メモリ...など)を持っている必要があり、hddはこの仕様(容量、rpm、..など)を持つ必要があります...基本的に彼は仕様を作成したいと考えています。仕様が修正された場合、問題はなくなりました。

すべての製品は仕様が異なります(仕様の名前だけでなく、仕様自体のようにビデオカード、ラム、HDDなど)。

ありがとうございます。ちょうどそのよう、

create table attributes(
    id bigint not null AUTO_INCREMENT PRIMARY KEY, 
    attribute_name varchar(300), 
    #any other field definitions, like data type, allowed range, etc. 
) 

とリンクテーブルcategory_attribute:

+1

私はあなたが[データベースの正規化](http://databases.about.com/od/上に読むことをお勧め –

+0

私はどういうわけか、製品とその製品の仕様の構造との間の協議をしたいと思っています... :( – pufos

+0

あなたの例のようなすべての製品に利用できる仕様属性の固定リストがありますか?ソニー? –

答えて

3

は、私はそれがこのような個別の属性テーブルを持っている方が良いと思います

create table category_attribute(
    category_id int references category(id), 
    attribute_id int references attributes(id), 
    str_value varchar(1000), 
    #if you are going to have different data types for each attribute you'll add it here 
    #int_value int, 
    #date_value timestamp ... 
) 

のでyou'llhave非常に柔軟なアーキテクチャあなたにできるようになると属性の追加/削除/変更とカテゴリ=>属性の関係を簡単に実行できます。 ID = 1のカテゴリに適用されるすべての属性を取得するための

SQL:

select * 
from attributes a 
join category_attribute ca on ca.attribute_id = c.id 
join category c on c.id = ca.category_id 
where c.id = 1 #or any other condition here 

また、これは保存されたデータの量を削減します。

ライブの例(変更は明白である私は信じて、慎重にあなたの質問を読んで、少しスキーマを変更):

category(1,'Computers') 
category(2,'Cell Phones') 

attribute(1, 'Manufacturer') 
attribute(2, 'Cost') 
attribute(3, 'GSM standards') 
attribute(4, 'Hard Disk capacity') 

category_attribute(id=1,category=1,attribute==1) 
category_attribute(id=1,category=1,attribute==2) 
category_attribute(id=1,category=1,attribute==4) 
category_attribute(id=1,category=2,attribute==1) 
category_attribute(id=1,category=2,attribute==2) 
category_attribute(id=1,category=2,attribute==3) 

product(1, 'iMac', category = 1) 
product(2, 'iPhone', category = 2) 

product_attribute(product_id=1, category_attribute_id=1, 'Apple') 
product_attribute(product_id=1, category_attribute_id=2, '$300') 
product_attribute(product_id=1, category_attribute_id=4, '500Gb') 
product_attribute(product_id=2, category_attribute_id=1, 'Apple') 
product_attribute(product_id=2, category_attribute_id=2, '$200') 
product_attribute(product_id=2, category_attribute_id=3, 'GSM 900/1800/1900') 
+0

あなたは '( '1'、 'manufacturer')'と 'category_attribute( '12'、 '1'、 'sony')'のような擬似コードでライブサンプルを与えることができますか? – pufos

+0

カテゴリ( 'コンピュータ') – J0HN

+0

これはmysqlのパフォーマンスに影響します... 10000以上の製品をお持ちの場合? product_attributeには約1millionの行があるためですインデックスを定義することによってスピードを向上させることができますか?ありがとうございました... – pufos

0

最良の方法は、すべての異なる情報を格納するためのいくつかのテーブルを作成することです、持っています以下の実装を見て:

カテゴリ {idCetagory、 区分名}

SubCetagory { idSubCategory SubCategoryName 区分}

仕様{ idSpecification SpecificationName SubCategoryName}

商品 {idProduct 商品名SubCategroyID }

製品仕様 { idProductSpec SpecificationID 値 }

1

まず第一に、あなたはここで車輪の再発明なぜデータベースのコアスキーマを設計するために苦労している場合は?代わりに、多数のフリー/オープンソースの既製カートシステムを使用してみませんか?

私は個人的な経験から、CS-Cart Community Editionを見ることをお勧めしますが、そこから選択するのは良いものがたくさんあります。

これをやりたくない場合は、リレーショナルデータベースの設計の基本を読んでから始めることをお勧めします。

次に、現在のルートを固執してスキーマを単純にしたい場合は、情報をメタデータとして格納するテーブルを実装することができます。次のような表を作成します。

ID - used as the row primary key 
ProductID - foreign key to the product 
Title - the heading of the specification 
Value - the value of the specification 

これは明らかに非常に単純ですが、正しい方向を指す必要があります。定義された仕様を保持する小さなテーブルセットを作成する方が良いかもしれませんが、シンプルに保つ必要があるという印象を受けます。

+0

彼はどんなプラットフォームも使いたくないのですが(...、あなたは私が仕様のテーブルを持っていて、行ごとに入力すると言っていますか?)このように(1、50、Manufacturer、Sony)...(2、50、プロセッサ、Inter Core i5)...(3,50、Memory、2GB)?(50は製品のIDです) – pufos

+0

あなたはそれを持っています。非常に特殊なものが必要な場合を除いて、車輪を再発明する必要はありません。非常に強力で安全で柔軟なカートを持ち、数週間ではなく –

+0

ストアは非常に複雑です...ユーザーランキング、レビュー、エクセルからの製品の追加、同じ製品で異なるコードの500社のサプライヤ...しかし、あなたが言ったことを使って...どのように私は応募することができますか?フィルター?と再びフィルタは、すべての製品のサブカテゴごとに異なります.. – pufos

0

製品をコンポーネントに分割します。

Manufacturer (id, name) 
Processor (id, p_manufacturer_id, p_name, description) 
Harddisk (id, hdd_manufacturer_id, hdd_name, description) 
RAM (id, ram_manufacturer_id, ram_name, ram_size, ram_type, description) 

を...のように... その後、製品は次のようになります: だから例えば私が持っているでしょう

Product (id, manufacturer_id, processor_id, hdd_id, ram_id .. etc.) 

・ホープ、このことができます。これはもちろん「正規化」です! 震えが痛いかもしれないが、これは、例えば、ソニー製の4GB RAMを搭載したすべてのラップトップを見せてくれれば、IDである数字を比較するだけです。

+0

申し訳ありませんアリですが、それは貧弱なデザインで、正規化されてしまいます。あなたの考えに従えば、クライアントが追加したい属性の種類ごとにテーブルが作成されます。それはスケーラビリティではありません。 –

+0

テーブルは共通コンポーネント用にのみ作成され、他のコンポーネント用には、製造元のIDと関連する他のコンポーネントのIDを含む別のテーブルが同じ行にあり、独自の説明名などがあります。製品表には、OtherComponents表を持つManyToManyがあります。理論的には、OtherComponentsテーブルと他のテーブルManyToMany関係のみを持つことができます。 – Ali

1

私は、次の表の構造を使用することをお勧め:

category (id_category, name) 
subcategory (id_subcategory, id_category, name) 
subcategory_fields (id_subcategory, field_name, order) 
product (id_product, id_subcategory, product_details...) 
product_fields (id_product, field_name, field_value) 

これは、最も柔軟なアプローチだとあなたは、後で簡単にフィールドを追加/削除することができます。

例:

category: 
    1 "servers" 
subcategory: 
    12 1 "rackmountable" 
subcategory_fields: 
    12 "manufacturer" 
    12 "processors" 
    12 "rack units" 
    ... 
product 
    100 12 "HP DL380G6" 
product_fields 
    100 "manufacturer" "HP" 
    100 "processors" "1" 
    100 "rack units" "2" 
    ... 

製品のフィールドを取得するには:

SELECT pf.field_name, pf.field_value 
FROM product AS p 
LEFT JOIN subcategory_fields AS sf 
    ON sf.id_subcategory = p.id_subcategory 
LEFT JOIN product_fields AS pf 
    ON pf.id_product = p.id_product 
    AND pf.field_name = sf.field_name 
+0

subcategory_fieldsとproduct_fieldsの機能は何ですか?私はそれを理解できません – pufos

+0

@pufos: 'subcategory_fields'はフィールド定義/名前/キーを保持します。 'product_fields'は実際の値を保持します。 – Vlad

+0

しかし、どのようにsubcategory_fieldsとproduct_fieldsを同期するのですか? – pufos

関連する問題