【问题标题】:Should I have relationships coming off my join table or the two tables it's joining? [closed]我应该从我的连接表或它加入的两个表中建立关系吗? [关闭]
【发布时间】:2023-03-18 01:37:02
【问题描述】:

目前,我通过名为参与者的联接表在用户和事件之间建立了多对多关系。

user         event         participant
========     ========      =============
id           id            user_id
name         title         event_id
             location

我想在活动中添加另一个表来表示用户事务,但我不确定我应该引用联接表还是两个单独的表。

我认为这两个选项是这样的:

user         event         participant         transaction
========     ========      =============       ============
id           id            user_id             id
name         title         event_id            amount
             location                          user_id
                                               event_id

或者这个:

user         event         participant         transaction
========     ========      =============       ============
id           id            user_id             id
name         title         event_id            amount
             location                          participant_id

【问题讨论】:

  • 好问题。从数据建模和性能的角度来看,IMO 2 都有效。您将解决方案与另一个解决方案保持一致的唯一原因主要是您查询数据库的方式,就数量和频率而言。例如,如果您的交易查询比您的参与者查询重,请选择解决方案 1。无论如何,我看到大师 @GordonLinoff 回答了,所以我会停在这里;)
  • 我个人在这里,如果交易只能通过一个事件发生,那么第二个选项是合适的,如果进一步只允许一个交易,它也可以是participant表的一部分,与第一个选项您在participanttransaction 表中有冗余数据。也同意@Thomas 的观点并等待来自@GordonLinoff 的cmets

标签: sql postgresql database-design


【解决方案1】:

有趣的问题。一些答案是一个主观问题:交易移动是否与参与事件的时期相关联?还是交易更多地与一个人和一个事件相关,而不是与参与?

您的数据模型没有指定一个人是否可以多次参与某个活动(比如在不同的时间)。如果是这样,那么交易可能与参与相关。

另一方面,如果交易可以在某人参与之后的任何时间进行(参与是先决条件),那么它可能更多地与人和事件相关联,然后与实际参与相关。

需要说明两点。在许多情况下,它并没有真正的区别。如果您更有可能想知道这个人和事件,那么包括这些。如果您更有可能想知道参与的信息(比如参与的日期/时间),请使用它。

其次,在某些情况下,根据您要建模的细节,它可能会有所不同。您的问题没有提供足够的信息来表明这是否正确。

【讨论】:

  • 有趣的答案。为了进一步澄清,用户不可能多次参与活动。我想说,在我的情况下,交易更多地与人和事件相关,但我仍然需要参与表,以防用户不进行交易。也许会员资格更适合这张桌子?
  • @FraserHamilton 。 . . participation 很好,虽然我可能会使用 personEvents
【解决方案2】:

如果您的 UI 未显示有关参与者的信息,选项 1 应删除参与者表。如果您需要参与者,选项 2 更好。

【讨论】:

    【解决方案3】:

    participant表的primary key(user_id, event_id)participant_id的值如何确定?

    此外,您希望允许在用户未参与的事件中为用户注册交易。换句话说,如果(用户 A,事件X) 不存在于participant 表中,您也不希望在事件 X 中为用户 A 记录任何事务。

    这意味着通过使用选项 (1) 并使用 primary key(transcation_id, user_id, event_id),您将拥有更自然的主键,并且能够通过 (user_id, event_id) 引用 participant 表以确保您的 数据完整性。

    另外,正如其他人所提到的,participant 表的更自然名称可以是 event_users

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多