php - 如何规范这个汽车零件数据库?

标签 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 ”的东西。研究这个主题并学习如何将它应用到您的数据库模式中!

最佳答案

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

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

这是我的建议。

重命名您的品牌表。将其称为“制造商”并将其一分为二,分别用于制造商和联系人。

制造商:

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 (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 的多个模型通常采用相同的零件。此架构允许这样做。

应用SKU:

ApplicationID
SKU

规范化的诀窍是了解您的应用领域。找出您拥有的实体:例如

  1. Delco 和 Subaru 等制造商
  2. 联系乔和哈利这样的人
  3. 左前雨刷总成和后雨刷总成等零件
  4. 1999-2006 Subaru Forester 和 1998-2007 Subaru Impreza 等应用

创建一个与您拥有的每个实体相匹配的表。弄清楚您将如何唯一标识每个实体(换句话说,弄清楚您将使用什么作为主键)。

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

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

希望对您有所帮助。

关于php - 如何规范这个汽车零件数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708748/

相关文章:

php - get_discount_total() 和 get_total_discount() 的区别?

php - 使用 php 在每个页面中包含页脚的方法

mysql - 在 OSX 10.10 Yosemite 上自动启动 MySQL

php - 没有指示 mysqli 连接错误,但我的表单未填充我的表

php - 在 foreach 查询中查找最后一行

ruby - 如何使用 Active::Record 使数据库显示为按某些列分区

database - 如何将 postgresql 中的模式从本地服务器迁移到生产服务器?

php - 使用 PHP 跟踪页面浏览量

PHP/MYSQL 点单

php - 使用单引号或双引号插入或发布数据时出现问题