【问题标题】:Should I store additional data in SQL join/junction table?我应该在 SQL 连接/连接表中存储其他数据吗?
【发布时间】:2016-11-19 01:58:02
【问题描述】:

在我的联接/联结表中存储附加数据有什么缺点吗?

例如,我正在研究货运公司的数据库,我有 3 个表:

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

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

这样做有什么缺点吗?如果有,有更好的方法吗?

【问题讨论】:

  • 不要将此数据存储在数据库中。使用查询计算每个公司的计数。
  • 此时,查询将只返回公司拥有多少“不同”拖车类型,因为我正在尝试确定存储包含“每个拖车类型有多少”的数据的最佳方法公司有。

标签: mysql sql relational-database junction-table


【解决方案1】:

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

这样想怎么样:

  1. 公司与预告片是一对多的关系
  2. 预告片与 TrailerDescriptions 具有多对一的关系。

因此,您的 Trailer 表将包含以下列:

 company_id
 trailer_description_id
 count
 etc.

您甚至可以选择枚举各个预告片,方法是添加列并将“count”设置为 1。

 trailer_id
 company_id
 trailer_description_id
 count = 1
 date_placed_in_service
 license_plate_number

等等

【讨论】:

    【解决方案2】:

    从您提出问题的方式来看,我认为您的直觉大多是正确的。您将连接表确定为保存计数的地方。但是你在犹豫,显然是因为它是一个“连接表”。

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

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

    所以不用担心它是什么样的桌子。想想行意味着什么,以及它是如何被识别的。这将使您保持在球道上。

    【讨论】:

      【解决方案3】:

      首先,可以在联结表中存储附加信息。例如,创建的日期通常非常有趣。而且,您可以将许多实体示例视为联结表(例如将客户与发票联系起来的计费记录),并且这些记录自然还有其他字段。

      但是,在一般情况下,您不会存储计数。这种类型的信息应该放在Company 表中,特别是如果它随着时间的推移而得到修复。

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

      【讨论】:

      • 如果他需要按预告片类型进行计数,并且在其他地方没有每个预告片的记录(如 Siyual 的评论所假设的那样),那么将其直接存储在 company 中并没有多大意义.
      • 谢谢,@Gordon 回答了我的问题。在我的场景中,公司可能有 25 个 A 型拖车、30 个 B 型拖车等,所以在 Company 表中会有很多额外的列,因为我们正在讨论 10 多种拖车类型并创建一个额外的表来存储计数将是很多冗余。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      相关资源
      最近更新 更多