【问题标题】:Database Table for Items have same relation项目的数据库表具有相同的关系
【发布时间】:2013-09-20 17:22:11
【问题描述】:

我应该如何设计汽车零件的数据库。

问题是像散热器这样的汽车部件可以安装多辆汽车。我应该如何解决这个问题? 假设我有一张如下表:

SKU#   零件           制作     型号     年份               数量
H111    散热器    BMW      E46          1998-2002        5 
H222    散热器   丰田   卡罗拉     2002-2004       2

带有 SKU#H111 的散热器可以安装两辆汽车。一种是上表“BMW E46 1998-2002”,另一种是“BMW E39 2003-2004”。

如果我在数据库表中添加两个相同的部分,我会遇到问题,因为如果我出售这部分,我将不得不手动删除另一个。 我想设计数据库,使 SKU#H111 部分与两个项目有联系。当我出售它们时,这两种物品的数量都应该减少。

【问题讨论】:

  • 您考虑过使用汽车/散热器关联表吗?
  • 了解数据库规范化
  • carpartcar_part 有单独的表。 car_part 应该包含汽车模型和零件模型的 ID。零件的数量很可能会出现在零件表中……但是,如果每个零件都有一个单独的参考号/ID……您可能需要两个零件表。 part_modelpart 其中part_model 保存通用信息,part 保存特定于单个物理项目的信息。然后您将通过聚合获得数量...

标签: php mysql sql database database-design


【解决方案1】:

三个表:

  • 汽车:列 ID、品牌、型号、Start_Year、End_Year
  • 部件:列 ID、SKU#、名称、数量
  • Car_Part:Car_ID、Part_ID 列

这称为规范化。要确定哪些零件适合哪些汽车,您需要进行 3 路连接。

SELECT sku, name, make, model, year, CONCAT(Start_Year, '-', End_Year) Years, Quantity
FROM Car c
JOIN Car_Part cp ON cp.Car_ID = c.ID
JOIN Part p ON p.ID = cp.Part_ID

如果你经常需要这个查询,你可以把它放在一个视图中。

【讨论】:

  • 将数据从 Car and Part 表插入 Car_Part 表的最佳方法是什么。假设我有一个适合两辆车的零件。我应该如何或使用哪个 SQL 命令?
  • INSERT into Car_Part(Car_ID, Part_ID) VALUES (car1ID, partID), (car2ID, partID)
  • 添加一个表 Part_Images,其中包含 Part_ID、Image_Filename 列。要获取零件的图像,请加入 Part 和 Part_Images 表。
  • 你需要给自己找一本关于数据库设计的好教科书。这种 Q/A 格式不是设计数据库的有效方法。不要问我推荐,我不知道那里有什么。
  • 这取决于你。一些数据库设计者在每个表中放置一个 ID 列,以确保有一个主键,并允许在其他关系表中引用该表。我对此并不挑剔。
【解决方案2】:

希望这将帮助您指出the right direction

【讨论】:

    【解决方案3】:

    您可以使用附加表来设置零件与使用这些零件的汽车之间的关系: 例如:

    Table: sku_id_car_model
    SKU#    #Id Car Model
    H111    BMW E46 1998-2002
    H111    BMW E39 2003-2004
    

    因此,当您使用该零件时,请根据 SKU# 和 #Id Car Model 进行数量搜索的更新

    update car_parts 
    set quantity = quantity - 1 
    where sku_part = 'H111'
    and concat(make, model, year) in (  select id_car_model 
                                        from sku_id_car_model 
                                        where sku = 'H111' );
    

    这是一种选择,

    【讨论】:

      猜你喜欢
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      相关资源
      最近更新 更多