我应该在 SQL join/junction table 中存储额外的数据吗?

Should I store additional data in SQL join/junction table?

在我的连接中存储附加数据有什么缺点吗table /结table.

例如,我正在处理货运公司的数据库,我有 3 tables:

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

每家公司可以有不止一种拖车类型,但我还需要每个公司的每种拖车类型的拖车数量。放置拖车计数的最合乎逻辑的地方似乎是在 table 与 company.idtrailer_type.id.

的交界处

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

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

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

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

从你表述问题的方式来看,我认为你的直觉大部分是正确的。您将路口 table 确定为保存计数的地方。但是你在犹豫,显然是因为它是 "junction table"。

所有table生而平等。从SQL的角度来看,没有事实table,没有维度table,没有结点table。只有 table 个。

规范化设计表示标识每一行的最小键。在您的例子中,联结 table 的自然键类似于 {company_id, trailer_type_id}。是否存在功能上依赖于该密钥的信息?为什么,是的,有:ntrailers。这样一个专栏就诞生了。

所以不用担心table是什么样的。想一想行 的含义 以及它是如何识别的。这会让你保持在正确的道路上。

您可能希望以与公司和预告片之间的多对多关系略有不同的方式来考虑您的架构:这就是您拥有联结点 table 的原因。

这样想怎么样:

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

因此,您的预告片 table 将包含这些列:

 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

等等