我应该在SQL join / junction表中存储其他数据吗?

时间:2016-07-15 18:47:38

标签: mysql sql relational-database junction-table

在我的加入/联结表中存储附加数据是否有任何缺点。

例如,我正在开发一个货运公司数据库,我有3个表:

Table 1 - company,
Table 2 - trailer_type,
Table 3 - junction_table,

每家公司可以有多种拖车类型,但我还需要每家公司每种拖车类型的拖车数量。放置预告片计数的最逻辑位置似乎是在与company.id和trailer_type.id的联结表中。

这样做是否有任何缺点?若有,有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

从你提出这个问题的方式来看,我认为你的直觉大多是正确的。您将联结表识别为保持计数的地方。但你犹豫不决,显然是因为它是一个“交汇处”。

所有表都是相同的。从SQL的角度来看,没有事实表,没有维度表,没有联结表。只有桌子。

标准化设计表示识别每一行的最小键。在您的情况下,联结表的自然键类似于{company_id,trailer_type_id}。是否存在功能上依赖于该密钥的信息?为什么,是的,有:ntrailers。因此,一个专栏诞生了。

所以不要担心它是什么样的表。想想行意味着什么,以及它是如何识别的。这将让你在球道上。

答案 1 :(得分:0)

首先,可以在联结表中存储其他信息。例如,创建的日期通常非常有趣。并且,您可以将许多实体示例视为联结表 - 例如将客户与发票连接起来的结算记录 - 并且记录自然会有其他字段。

但是,在一般情况下,计数不是您要存储的。这类信息应该放在Company表中,特别是如果它随着时间的推移而固定。

如果没有修复,我会想到两个选项。第一个是缓慢变化的维度,您可以在其中存储公司的预告片数量以及值的有效日期和结束日期。一种可行的替代方法是将值存储在联结表中。它不是第一选择,但在许多情况下它可能是一个很好的解决方案。

答案 2 :(得分:0)

您可能希望将您的架构与公司和预告片之间的多对多关系略有不同:这就是您拥有联结表的原因。

如何以这种方式思考:

  1. 公司与预告片有一对多的关系
  2. 预告片与TrailerDescriptions存在多对一关系。
  3. 因此,您的预告片表将包含以下列:

     company_id
     trailer_description_id
     count
     etc.
    

    您甚至可以通过添加列并将“计数”设置为1来选择枚举各个预告片。

     trailer_id
     company_id
     trailer_description_id
     count = 1
     date_placed_in_service
     license_plate_number