假设我正在建造汽车租赁应用程序,而且我必须展示一下 所有可用的汽车。
在DB中,我有以下表格:
在Model中,有一个FK到Brand,比如说Brand_id
所以我的问题是:
汽车表应该有品牌和型号列吗?或者只有一个Model列,因为我可以从Model列获得Brand?
答案 0 :(得分:3)
基本正常形式要求汽车表不包括依赖于汽车表中另一个(非PK)列的列。由于品牌依赖于模型,因此不应该在汽车表中。
简而言之,如果您为每辆车重复品牌,那么您将存储大量冗余信息。您可以通过将模型表连接到查询中来轻松访问该信息。如果你有一些“汽车”行声称一个模型属于一个品牌,而其他人声称它属于另一个品牌,会发生什么?这不仅是错误的,在现实世界中这是不可能的,因此在您的数据库中不可能。
答案 1 :(得分:1)
汽车表应该只有一个键入模型。你永远不会有福特克尔维特或雪佛兰野马,也不会让我的同一辆车成为我的不止一家制造商。
如果您还需要该品牌,则可以在model.id = cars.model
和model.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。