2010-11-30 11 views
4

私は、各商品に1つのカテゴリ(選択可能なカテゴリは数百種類)(例:「書籍」、「ポータブルDVDプレーヤー」など)があるオンラインストアを持っているとします。各カテゴリの説明フィールドを提供する必要がある場合(たとえば、「著者」が「ブック」カテゴリのフィールドになります)、これをデータベースで表現する最良の方法は何ですか?データベース設計:名前と値のペア - 良いか悪いですか?

オプション1(名前と値のペア):

=========================== 
field 
=========================== 
- field_id 
- category_id (FK, referring to category like "book") 
- name 
- value 

これは私がどのカテゴリに一つのテーブルに依存していることを意味します。私は、このデータを他の書籍と並べて表示するのに必要なピボット操作が潜在的な問題であると懸念しています。

オプション2(個々のテーブル):

=========================== 
book_field 
=========================== 
- book_field_id 
- book_id (FK, referring to the actual book) 
- author 
- title 
- publisher 
- date_published 
... 

これは私がカテゴリごとにテーブルを必要とすることを意味します。

注:重要なことではありませんが、カテゴリはカテゴリの階層(エレクトロニクス - > DVDプレーヤー - >ポータブルDVDプレーヤーなど)からのものです。

答えて

3

My $ 0.02 - カテゴリごとに1つのテーブル。物事が本当に異なっている場合は、それを受け入れ、それに応じてテーブルを設定します。

自然に一部のエンティティに共通のデータがある場合、抽象化/正規化することができますが、名前/値のペアオプションを使用すると、読みにくい/クエリのパフォーマンスに関する問題が発生する可能性があります。

+0

現実世界のノート - 私の仕事では、我々は非常に似ていますが、ユニークな特性であるフォームのいくつかのタイプを持っている - 私たちは、それぞれに固有のテーブルを使用する、ためのテーブルをいくつかの一般的な要素(名前、住所など)、およびこれらのオブジェクトをまとめて表示する必要があるときにそれらを集約するのに役立つビューがあります。 –

+0

ボブが言ったこと。また、「汎化特化関係モデリング」も検索してください。 –

+0

合意。名前と値のペアのシステムでは、各カテゴリ(BookID、Author、Titleなど)の列を持つ簡単なデータテーブルを返すのが難しくなります。 –

1

本当に1つのカテゴリに制限してもよろしいですか?つまり、商品が複数のカテゴリに属している場合がありますか?あなたはタイプが "ディレクター" と呼ばれている

UPDATE(いくつかの層が追加された)

======== 
products 
======== 
- product_id 
- name 

==================== 
categories_products 
==================== 
- category_product_id 
- product_id (FK) 
- category_id (FK) 

=========== 
categories 
=========== 
- category_id 
- name 

============================= 
products_detail_values_types 
============================= 
- product_detail_value_type_id 
- product_id (FK) 
- detail_value_type_id (FK) 

==================== 
detail_values_types 
==================== 
- detail_value_type_id 
- detail_value_id (FK) 
- detail_type_id (FK) 

=============== 
detail_values 
=============== 
- detail_value_id 
- value 

============= 
detail_types 
============= 
- detail_type_id 
- name 

detail_type: 
    detail_type_id: 100 
    name: "director" 

まあ、とにかく、ここであなたに役に立つかもしれない一つの解決策です

いくつかの値:

detail_value: 
    detail_value_id: 200 
    value: "James Cameron"  

型と値のマッピング:詳細は、製品に属し

detail_value_type: 
    detail_value_type_id: 300 
    detail_value_id: 200 
    detail_type_id: 100 

product_detail_value_type: 
    product_detail_value_type: 400 
    product_id: 500 
    detail_value_type_id: 300 

その後、我々はカテゴリがあります。

category: 
    category_id: 600 
    name: "movie" 

とカテゴリ - 製品マッピング:

category_product: 
    category_product_id: 700 
    product_id: 500 
    category_id: 600 

そして最後に、製品自体:

product: 
    product_id: 500 
    name: "Aliens" 
+0

@hade今、私は少し心配しています。製品は実際に2つのカテゴリーに分類できますか?私はAmazonをたくさん勉強してきました。私がこのような場合を見たかどうかは分かりません。私が間違っている? – StackOverflowNewbie

+0

@hade、このデザインは、私が複数の「James Cameron」を持つことを可能にします。これは正規化されていますか? – StackOverflowNewbie

+0

@StackOverflowNewbie:カテゴリMovieがあるとしましょう。 VHS、DVD、Blu-Rayなどのさまざまな形式の映画を楽しむことができます。どのように分類したいですか?彼らはすべて映画ですが、メディアの種類に合わせて分類するのもいいでしょう。 映画をBlu-Ray形式で検索したいとします。あなたは、映画カテゴリと青い線カテゴリの商品を検索することで簡単にこれを行うことができます。 – hade

0

私は、インターネットタグが基づいているいずれかであなたのデザインをベースに、あなたをお勧めします。

私はあなたを説明しましょう:あなたは4つのテーブルより、あなたの主な目的のテーブルが必要になります

最初のもの:これは基本的なテーブルIDです。オブジェクトの属性を格納する名前: "author"、 "size"、 "weight";オブジェクト

tag_table 
id varchar(36) 
tag varchar(36) 

を記述することができます何でも2つ目は:この表は、tag_table値に保存されているタグ名と値と一致します。どのタグである値を決定します。これは、1つ

value_table 
id varchar(36) 
value varchar(36) 

サード同じデザインを持っていません。

tag_value 
id_pair varchar(36) 
id_tag varchar(36) 
id_value varchar(36) 

第四1は:

object_tag_value 
id_object varchar(36) 
id_pair varchar(36) 

そして最後に、あなたのオブジェクト表にそれをcarectrizeそのデータをオブジェクトに参加します。多対について

object_relation 
id_parent varchar(36) 
id_son varchar(36) 

:一対多あるい​​は多対多階層は、2つのオブジェクトを関連付けるであろう余分なテーブルを実装するため

:階層システム実装

(たとえばmanager_idのEmployeeテーブル)をid_parentをオブジェクトのメンバーとして追加するだけです。

このスキーマを使用すると、スケーラビリティが向上し、オブジェクトは今まで以上に制限されない無限の特性を持つことができます。さらに、タグ名が一意であるため、データの冗長性を避けることができます。

私は十分に明確であり、それはあなたを助けますことを願って、

+0

階層についてはどうですか?あなたのソリューションには階層の概念はありません。 – StackOverflowNewbie

+0

階層1〜多対多の2つの概念があります。 1対多が必要な場合は、オブジェクトテーブルにparentIdを追加するのが簡単です。それが多対多であれば、他のオブジェクトの関係となる2つのvarchar(36)フィールドを持つテーブル階層を追加すると、無限の階層を持つことができます。 – Spredzy

+0

1から多くの階層が必要な場合は、提案されたソリューションをまだ使用する必要がありますか? – StackOverflowNewbie

関連する問題