我应该将父母和孩子存储在一行中还是仅存储在孩子中

时间:2010-10-08 21:29:30

标签: sql database-design schema

假设我正在建造汽车租赁应用程序,而且我必须展示一下 所有可用的汽车。

在DB中,我有以下表格:

  • 品牌
  • 模型
  • 汽车

在Model中,有一个FK到Brand,比如说Brand_id

所以我的问题是:

汽车表应该有品牌和型号列吗?或者只有一个Model列,因为我可以从Model列获得Brand?

4 个答案:

答案 0 :(得分:3)

基本正常形式要求汽车表不包括依赖于汽车表中另一个(非PK)列的列。由于品牌依赖于模型,因此不应该在汽车表中。

简而言之,如果您为每辆车重复品牌,那么您将存储大量冗余信息。您可以通过将模型表连接到查询中来轻松访问该信息。如果你有一些“汽车”行声称一个模型属于一个品牌,而其他人声称它属于另一个品牌,会发生什么?这不仅是错误的,在现实世界中这是不可能的,因此在您的数据库中不可能。

答案 1 :(得分:1)

汽车表应该只有一个键入模型。你永远不会有福特克尔维特或雪佛兰野马,也不会让我的同一辆车成为我的不止一家制造商。

如果您还需要该品牌,则可以在model.id = cars.modelmodel.brand = brand.id上加入所有三个表格。

答案 2 :(得分:0)

我认为它应该有两个FK引用。根据这些表的关系,您还希望避免可能的扇形陷阱。

例如
A ---(1:N)--- B ---(1:N)--- C

另一个例子可以是例如:
A是任何维度(例如DATES)
B是包含运输信息的表格,数据在包裹级别上 C是包含物品级别信息的详细表格

有意义吗?

答案 3 :(得分:0)

这取决于我的想法。如果您从汽车表中查询汽车品牌A LOT,我的意思是 A LOT ,(这意味着您想知道汽车的品牌而不知道模型,因此您加入汽车和品牌表而不使用您可以考虑在您的汽车表中添加brandid,这样您就可以在不使用Model表的情况下加入汽车和品牌表 如果您的汽车表中有这么多条目(再次,我的意思是Soo Many),(我怀疑它),您可以考虑通过删除brandid来减小表格大小,只需使用Model表来访问品牌。
 但这不是唯一的情况。如果将brandid存储在汽车表中,则不符合基本数据库规范化规则。 当你在表中有10,000多行时,我所提到的会影响性能。所以我很确定你在这两种方法中表现都不错 我在我的汽车表中只定义了一个modelid FK,因为当你有modelid并且你并不担心性能时,就没有必要使用brandid。

相关问题