0

銃器や関連商品を販売するオンラインストアを作成しています。データベース(MySQL)がサイトのバックボーンになるので、私はデータベース(MySQL)の完成に取り組んできました。私の問題は、正規化を優先したまま、データベースのレイアウト方法に頭を悩ませることができないことです。このサイトには多くの製品があり、ほとんどが同じ情報を持っていますが、多くは微妙な違いがあります。

たとえば、弾薬の場合、4つのカテゴリがあり、4つのうち3つは同じ情報を持ち、最後は違いがあります。同じ3つのテーブル用に1つのテーブルを作成し、情報が異なるテーブル用に別のテーブルを作成しますか?または、テーブルを作成して、その製品の違いを含む配列またはJSON文字列を格納できる列を作成しますか?

同じ問題を抱えている製品がたくさんあることを覚えておいてください。私は仕事を恐れていません。正しい道を進んでいることを確認したいだけです。

私のカテゴリの簡単なレイアウトを示しましょう。

• Firearms
    • handguns (unique characteristics)
    • centerfire rifles (unique characteristics)
    • rimfire rifles (same as above)
• Ammunition
    • rifle ammo (unique characteristics)
    • handgun ammo (same as above)
    • rimfire ammo (same as above)
    • shotgun ammo (unique characteristics)
• Shooting Accessories
    • there are many products here with unique characteristics
• Optics
    • there are many products here with unique characteristics
• MANY MORE ...

製品という1つのテーブルを作成し、それらをすべてそのテーブルに配置したいと思いますが、微妙な違いがあるため、それは不可能だと確信しています。

*編集*

これが私が持つ属性の違いの例です:

• Rifle Ammunition
  • manufacturer
  • model
  • caliber
  • bullet weight
  • bullet type
  • number of rounds
  • price
  • description
  • sku
  • rating

• Handgun Ammunition
  • SAME AS ABOVE

• Rimfire Ammunition
  • SAME AS ABOVE

• Shotgun Ammunition
  • manufacturer
  • model
  • gauge
  • shell length
  • shot weight
  • shot size
  • velocity
  • price
  • description
  • sku
  • rating

ライフル、ハンドガン、リムファイアは同じ量の属性を持ちます(10)。Shotgunには(11)属性があり、この問題のようなインスタンスは他にもたくさんあります。

見てくれてありがとう:)

4

3 に答える 3

3

私はこのようなことをします:

製品テーブルはかなり基本的なもので、主な製品の詳細は次のとおりです。

create table products
(
  id int,
  name varchar(50)
);

insert into products values
(1, 'rifle ammunition'),
(2, 'handgun ammo');

私は個人的に次のようなモデルを使用します。

製品テーブルはかなり基本的なもので、主な製品の詳細は次のとおりです。

create table product
(
  part_number int, (PK)
  name varchar(10),
  price int
);
insert into product values
(1, 'product1', 50),
(2, 'product2', 95.99);

次に、さまざまな属性のそれぞれを格納するための属性テーブル。

create table attributes
(
  id int,
  attribute_name varchar(10),
  attribute_value varchar(10)
);

insert into attributes values
(1, 'manufacturer', 'test'),
(2, 'model', 'blah'),
(3, 'bullet weight', '10'),
(4, 'bullet type', 'metal'),
(5, 'price', '50');

最後に、product_attributeテーブルを、各製品とそれに関連付けられた属性の間のJOINテーブルとして作成します。このテーブルでは、製品と属性ごとに複数のエントリを使用できます。したがって、1つの製品に10個の属性がある場合、10個のエントリがあります。別の属性が2つの場合、2つのエントリがあります。

create table products_attributes 
(
  product_id int,
  attribute_id int
);

insert into products_attributes values
(1,  1),
(1,  2),
(1,  3),
(1,  4),
(2,  1),
(2,  2),
(2,  3);

これにより、複数の属性またはカテゴリを持つ多くの製品を柔軟に使用できます。次に、いくつかの結合を使用してクエリを実行するだけで簡単になります(SQL Fiddle With Demoを参照)。

select *
from products p
left join products_attributes pa
  on p.id = pa.product_id
left join attributes a
  on pa.attribute_id = a.id;

クエリの結果は次のようになります。

ID | NAME              | PRODUCT_ID | ATTRIBUTE_ID | ATTRIBUTE_NAME | ATTRIBUTE_VALUE
-------------------------------------------------------------------------------
1  | rifle ammunition  | 1          | 1            | manufacturer   | test
1  | rifle ammunition  | 1          | 2            | model          | blah
1  | rifle ammunition  | 1          | 3            | bullet weight  | 10
1  | rifle ammunition  | 1          | 4            | bullet type    | metal
2  | handgun ammo      | 2          | 1            | manufacturer   | test
2  | handgun ammo      | 2          | 2            | model          | blah
2  | handgun ammo      | 2          | 3            | bullet weight  | 10
于 2012-09-26T15:29:50.867 に答える
2

シンプルなデザインは次のとおりです。

製品

  • 製品番号
  • 商品名

製品カテゴリ

  • 製品番号
  • category_id

カテゴリー

  • category_id
  • 種別名

この設計では、各製品に複数のカテゴリを含めることができます。テーブルにを追加するcategory_parentと、Categoryサブカテゴリを持つことができます。

アップデート1

「categories」の代わりに「attributes」を使用し、属性に値を追加します。

製品

  • 製品番号
  • 商品名

Product_Attribute

  • 製品番号
  • attribute_id
  • attribute_value

属性

  • attribute_id
  • 属性名
于 2012-09-26T15:29:25.327 に答える
0

これを行うには多くの方法があります。おそらく他の答えが最善ですが、私の頭に浮かんだ最初のことは、次のようなことをすることです。

CREATE TABLE ammunition (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
    -- any columns that are common across ALL categories of ammo,
    PRIMARY KEY (id)
);

CREATE TABLE rifleHandgunRimfireAmmo (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
    -- any columns that are exclusive to rifle/handgun/rimfire ammo,
    fkAmmoID INTEGER UNSIGNED NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (fkAmmoID) REFERENCES ammunition (id)
);

CREATE TABLE shotgunAmmo (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
    -- any columns that are exclusive to shotgun ammo,
    fkAmmoID INTEGER UNSIGNED NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (fkAmmoID) REFERENCES ammunition (id)
);

基本的にはOOPのようなものです。ammunitionすべての一般的な情報を保持する基本テーブル(基本クラスのようなもの)があります。次に、extendそのベーステーブルに子テーブル(子クラスなど)を追加します。これらの子テーブルは、その特定のオブジェクトタイプに固有の情報を保持します。

私が言ったように、これがそれを行うための最良の方法であるかどうか、または他のポスターによる解決策がよりうまくいくかどうかはわかりませんが、それは私の頭に浮かんだものです。

于 2012-09-26T15:41:52.900 に答える