一对多关系的正确数据库模式

时间:2015-10-03 19:32:04

标签: sql database-design database-schema

我正在建立一个关于汽车的业余爱好网站。如果用户点击汽车,我想显示所选汽车的类似汽车列表。

我有一个主表存储有关每辆车的基本信息,CarDataMain,表中的两列是CarID(Pk)和SimilarCarsID(Fk)。

我有另一个名为“SimilarCars”的表,它有三列; SimilarCarsID(Pk),CarGroupID和CarID。

因此,SimilarCars表中的SimilarCarsID列与CarDataMain表中的ColumnCarsID列有关系。

这是正确的做法还是“最佳做法”?

每辆车只能属于一个CarGroup(CarGroupID)。

另一个解决方案是创建第三个表来保存CarDataMain和SimilarCars数据之间的关系,但由于存在一对多的关系,我猜这是过度杀戮?这样我就可以为所有属于同一个CarGroup的汽车在CarDataMain中设置相同的外键值,女巫不知何故感觉很吸引人......

第三个解决方案是跳过CarDataMain中的SimilarCarsID列,如果你理解我的意思,那么将CarID作为SimilarCars表中的外键。但我想这个解决方案有一些缺点......

抱歉新手问题(如果此问题已经提前),但我想在开始之前做好准备:)

Ludde

2 个答案:

答案 0 :(得分:0)

注意:重写

  • 设计用于描述CarGroup,其他?
  • 等内容的表格
  • 使用“联接表”提供所需的一对多关系。

  • CarID - 主键

  • GroupID - 主键。
  • Name - 该组的名称。

GroupID可能没有必要。如果Name是唯一的,则将其用作主键。

CarGroup

  • CarID - Car Table的外键
  • GroupID - 组表的外键

这是一个连接表。在这里,您可以将给定的汽车映射到多个组,并将给定的组映射到许多汽车。

SimilarCar

我可能会误解,但似乎你想要匹配类似的汽车,没有特别的原因。如果你想按组匹配,那就在上面;如果你想“这两辆车相似,期间”,你走吧。这与团体并不相互排斥。

  • CarID - FK到Car table
  • SimilarCarID - Fk to Car table

一个约束因此CarId无法匹配SimilarCarID - 除非您确实希望汽车与自身相似。但如果是这样,那么只需阅读汽车表。

答案 1 :(得分:0)

我认为你的概念需要先被清除。是不是“同类车”是同一个“小组”的车?如果是这样,您只需要1个学期。由于“group”是保留字,因此最好使用其他内容。

我会选择“类别”一词。所以我的Cars表会有一个CategoryId列。想象一下有人会添加新车的前端页面,他们不会有下拉列表来选择类别吗?

所以我的模型是:

Cars
-Id (PK)
-Name
-CategoryId  (FK to Categories)
...

Categories
-Id (PK)
-Name