如何规范化此汽车零件数据库?

时间:2012-05-22 19:26:26

标签: php mysql database normalization

我是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)

所以我的主要问题是:我是否让每个品牌都有自己的桌子,类似于我目前的'产品'表?或者有“类别”表? “子类别”?你们如何规范化这些数据呢?

我希望有一个可靠的数据库,而我正在学习这些东西,所以我学会了正确的方法。任何建议将不胜感激。

更新: 对于那些试图学习如何构建数据库的人来说,当我问这个时,我不知道的一个主要问题是“ cardinality ”。研究该主题并学习如何将其应用于数据库模式!

4 个答案:

答案 0 :(得分:2)

products.brand更改为products.brand_id,并将其作为brands.id的外键。

创建一个categories表格,其中包含字段idnameparent_id(允许NULL),其中包含categories.id parent(NULL表示顶级类别)。或者,您可以使用嵌套集模型。然后products会有一个products.category_id字段(不需要subCategory字段)。

答案 1 :(得分:1)

不要让每个品牌都有自己的表。这不是规范化,而是分区。在数据库变得非常大之前不要这样做。

目前尚不清楚您的品牌表是什么意思。我猜你的意思是零件制造商,但我不确定。本讨论的其余部分假设您的意思是零件制造商。

这是我的建议。

重命名您的品牌表。将其命名为“制造商”并将其拆分为两个,供制造商和联系人使用。

制造商:

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)

为什么“定价”是制造商的属性? “定价”是什么意思?这不是个别部分的属性吗?

将您的零件表拆分为两个。一个表将为每个部分sku有一行。另一个将为每个应用程序提供一个表格(即,可以使用该部件的每个品牌和型号的汽车)。像这样:

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.

然后,您将需要一个连接表(因为每个应用程序可以有零个或多个SKU,反之亦然;也就是说,您的SKU和应用程序实体可以具有多对多关系)。在您的示例中,您知道Subarus的多个模型通常采用相同的部分。这种模式允许这样做。

ApplicationSKU:

ApplicationID
SKU

规范化的技巧是了解您的应用程序域。找出你拥有的实体:例如

  1. Delco和Subaru等制造商
  2. 联系像Joe和Harry这样的人
  3. 左前刮水器组件和后刮水器组件等部件
  4. 1999-2006 Subaru Forester和1998-2007 Subaru Impreza等应用程序
  5. 创建一个与您拥有的每个实体相匹配的表。弄清楚如何唯一地标识每个实体(换句话说,弄清楚你将用于主键的内容)。

    当实体之间存在多对多关系时,创建连接表。

    创建外键以将各种实体连接在一起。

    我希望这会有所帮助。

答案 2 :(得分:1)

请记住,当您到达实际订单或将物品放入仓库库存的部分时,请在执行操作时存储实际价格。产品的价格是查询,它会随着时间的推移而变化,但库存中的订单或商品的价值应该与输入记录时的实际成本相关。

答案 3 :(得分:0)

一种产品可以安装多辆汽车 - 例如,您可能拥有适合2010款丰田凯美瑞,2009款Scion tC和2011款讴歌TL的雨刷片。因此,您需要将products / make / model拆分出products表格,并为车辆(id,year,make,model)和加入它们的交叉表(id,product_id,vehicle_id)创建一个单独的表。 / p>