3

私はPHP/データベースに不慣れです...しかし、私はそれをかなり迅速に拾い上げています。皆さんにお聞きしたいのはとても簡単です。私は自分のデータベースを正規化したいのですが、それをどうやって行うのか前向きではありません。私はその概念を理解しましたが、それを行うための複数の方法を見ています。図経験のある方にお願いします。

これが私のデータベースです(これまでのところ2つのテーブル):ブランド製品

***Brands Breakdown:***
1   id          int(6)
**Note:** Above, I will probably use 4-Letter codes for each brand instead of primary/int/auto.
2   name            text
3   logo            varchar(20)
4   phone           varchar(20)
5   website     varchar(30)
6   contact_name    text
7   contact_number  varchar(20)
8   contact_email   varchar(30)
9   warehouse       varchar(20)
10  pricing         varchar(15)
11  bio             varchar(300)

***Products Breakdown***
id (INT(6) / Auto_Increment)
brand (This is where I'll insert the four letter code for brand)
category (e.g. Brakes)
subCategory (e.g. Brake Rotors)
details (e.g. Drilled and Slotteed 'Razr')
sku (Part #)
minYear
maxyear
make (e.g. Subaru)
model (e.g. Impreza)
subModel (e.g. WRX STi)
description (Paragraph on part describing it)

specs (I imagine this can be expanded on. need cells somewhere for sizes / colors / engine codes / etc.)

msrp
jobber
price
cost
weight (of part)
warehouse (Could be moved to brand's table)
image (URL of image for the part)

だから私の主な質問は、各ブランドに現在の「製品」テーブルと同様の独自のテーブルを持たせるかどうかです。または「カテゴリ」テーブルがありますか?「サブカテゴリ」?このデータをどのように正規化しますか?

このようなことを学んでいる間、しっかりしたデータベースが欲しいので、正しい方法を学びます。何かアドバイスをいただければ幸いです。

更新:データベースの構造化の方法を学ぼうとしているこの質問に出くわした人にとって、これを尋ねたときに私が気づかなかった主要なことの1つは、「カーディナリティ」と呼ばれるものでした。このトピックを調べて、データベーススキーマに適用する方法を学びましょう。

4

4 に答える 4

2

に変更products.brandproducts.brand_id、それをへの外部キーにしbrands.idます。

テーブルを作成し、categoriesフィールドidnameおよびparent_id(allow NULL)を使用してcategories.id、その親(NULLトップレベルカテゴリを意味します)を格納します。または、入れ子集合モデルを使用することもできます。productsその場合、products.category_idフィールドがあります(subCategoryフィールドは必要ありません)。

于 2012-05-22T19:35:41.723 に答える
2

各ブランドに独自のテーブルを持たせないでください。それは正規化ではなく、パーティショニングです。データベースが非常に大きくなるまで、これを行わないでください。

あなたのブランドテーブルが何を意味するのかは明確ではありません。パーツメーカーという意味だと思いますが、よくわかりません。この議論の残りの部分は、あなたが部品メーカーを意味することを前提としています。

これが私の提案です。

ブランドテーブルの名前を変更します。それを「メーカー」と呼び、メーカーと連絡先の2つに分割します。

メーカー:

mfrid (your four letter code, primary key)
mfrname            text
mrflogo            varchar(20)
mfrwebsite     varchar(30)
mfrphone           varchar(20)
warehouse       varchar(20)

コンタクト:

mfrid (four letter code)  (part of primary key)
contactid (autoincrement) (part of primary key)
contact_name    text
contact_number  varchar(20)
contact_email   varchar(30)
bio             varchar(300)

「価格設定」がメーカーの属性であるのはなぜですか?「価格設定」とはどういう意味ですか?個々のパーツの属性ではありませんか?

パーツテーブルを2つに分割します。1つのテーブルには、パーツSKUごとに1つの行があります。もう1つには、アプリケーションごとにテーブルがあります(つまり、パーツを使用できる車のメーカーとモデルごとに)。そのようです:

SKU:

sku (your stock-keeping unit number, primary key).
mfrid (maker of the PART, not the vehicle in which it fits, foreign key to mfr table).
mfrsku (the brand's stock keeping unit, not necessarily unique in your system)
category (e.g. Brakes)
subCategory (e.g. Brake Rotors)
details (e.g. Drilled and Slotteed 'Razr')
description (Paragraph on part describing it)
saleprice (?)
cost (?)

応用:

ApplicationID (auto incrementing primary key)
make (e.g. Subaru)
model (e.g. Impreza)
subModel (e.g. WRX STi)
firstYear.
lastYear.

次に、結合テーブルが必要になります(各アプリケーションは0個以上のSKUを持つことができ、その逆も可能です。つまり、SKUとアプリケーションエンティティは多対多の関係を持つことができます)。あなたの例では、スバルの複数のモデルが同じ部分を占めることが多いことを知っています。このスキーマはそれを可能にします。

ApplicationSKU:

ApplicationID
SKU

正規化の秘訣は、アプリケーションドメインを理解することです。あなたが持っているエンティティを把握します:例:

  1. デルコやスバルなどのメーカー
  2. ジョーやハリーのような人に連絡する
  3. 左フロントワイパーアセンブリやリアワイパーアセンブリなどの部品
  4. 1999-2006スバルフォレスターや1998-2007スバルインプレッサのようなアプリケーション

所有している各エンティティに一致するテーブルを作成します。各エンティティを一意に識別する方法を理解します(つまり、主キーに何を使用するかを理解します)。

エンティティ間に多対多の関係がある場合は、結合テーブルを作成します。

さまざまなエンティティを相互に接続するための外部キーを作成します。

これがお役に立てば幸いです。

于 2012-05-22T20:00:44.743 に答える
1

また、実際に注文したり、倉庫の在庫に物を置いたりする部分に到達したら、アクションが実行されたときの実際の価格を保存することを忘れないでください。製品の価格はルックアップであり、時間の経過とともに変化しますが、注文または在庫内のアイテムの値は、レコードが入力された時点の実際のコストに関連している必要があります。

于 2012-05-22T20:07:23.050 に答える
0

1つの製品で複数の車に対応できます。たとえば、2010年のトヨタカムリ、2009年のサイオンtC、2011年のアキュラTLに対応するワイパーブレードがあるとします。したがって、製品テーブルから年/メーカー/モデルを分割し、車両(id、year、make、model)とそれらを結合するクロステーブル(id、product_id、Vehicle_id)用に個別のテーブルを作成する必要があります。

于 2012-05-22T19:48:20.953 に答える