Database design 如何合理化具有过多交叉引用和可选外键的关系模型?

Database design 如何合理化具有过多交叉引用和可选外键的关系模型?,database-design,relational-database,database-schema,entity-relationship,data-modeling,Database Design,Relational Database,Database Schema,Entity Relationship,Data Modeling,我试图保持我的数据模型正常,但它似乎有太多的引用。以下是相关实体 使用者 事件 系列(活动组) 报名(参加活动) 注册(连续剧) 交易(所有用户费用和付款) 用户注册一个事件,这将创建一个注册。由于他们已注册,因此会在他们的帐户上自动创建费用,即交易。事件也可以是一系列(事件)的一部分,也可以是独立事件。用户还可以注册一个系列,该系列创建一个注册,自动导致不同的费用交易。它们也可以捆绑在一起,例如,如果用户注册一个系列并预付100美元,他们可以在每个活动的价格上获得20%的折扣 用户N:M

我试图保持我的数据模型正常,但它似乎有太多的引用。以下是相关实体

  • 使用者
  • 事件
  • 系列(活动组)
  • 报名(参加活动)
  • 注册(连续剧)
  • 交易(所有用户费用和付款)
用户注册一个事件,这将创建一个注册。由于他们已注册,因此会在他们的帐户上自动创建费用,即交易。事件也可以是一系列(事件)的一部分,也可以是独立事件。用户还可以注册一个系列,该系列创建一个注册,自动导致不同的费用交易。它们也可以捆绑在一起,例如,如果用户注册一个系列并预付100美元,他们可以在每个活动的价格上获得20%的折扣

  • 用户N:M事件(通过注册)
  • 用户N:M系列(通过注册)
  • 事件N:1系列(可选;事件可以独立)
  • 事务N:1事件
  • 交易编号:1注册
  • 交易编号:1系列
  • 交易编号:1注册
但是报名已经和一个活动挂钩了!那么事务:事件FK是一种浪费吗?一方面,注册是交易的“原因”,因此应该包括在内。另一方面,事务直接绑定到事件。我们希望能够搜索特定事件的交易,而不是通过注册。但我们也希望能够通过注册进行搜索

类似地,注册已经绑定到Series,因此事务:Series FK是一种浪费吗

当然,事务可以绑定到Series+注册或Event+注册,但不能同时绑定到两者。需要一双或另一双是一个邪恶的混乱

更复杂的是,还有其他实体,如系列和游戏,可以将事务绑定到它们,而事务绑定到事件+注册或系列+注册,但不能同时绑定到两者

当前模型可视化如下(编辑:使其更清晰)

更新: @GertArnold在评论中帮助澄清了这个问题。我有两个截然不同的问题:

  • 某些Tx的Tx和Series+注册以及其他Tx的Event+注册之间的链接意味着这是一个混乱的外键关系。如果我能将一个Tx链接到其他资源,那就更糟了
  • 将发送链接到事件和注册的冗余,因为注册只能存在于单个事件的上下文中
  • 这两个问题都让事情变得一团糟@GertArnold建议删除注册和事件冗余。我的不情愿是因为有时候一个注册会导致多次发送和收费。例如,如果某个事件是某个系列的一部分,并且该系列有一次性费用(首次注册该系列中的某个事件时,将收取费用):

    • 由于您已注册,因此将活动成本作为发送费用收取
    • 因为这是该系列的第一次注册,所以将该系列的一次性费用作为发送收取
    本系列的未来注册只会产生活动费用

    只要Tx链接到事件或系列,我就可以轻松区分。如果我将Tx链接到注册,当我注册一个系列的一部分活动时,如何输入该系列的一次性费用?这是由活动注册引起的一系列费用

    我一定是用一个糟糕的数据模型把它弄得太乱了。这个应该怎么清理

    更新:注册与注册

    正如@Jay所建议的,我可以将注册和注册合并为一个,然后将事务FK添加到现在的统一注册中。但是注册可以链接到一个事件或一个系列,我的FK N:1注册:事件和注册:系列就变成了FK N:1注册:(事件| |系列),我试图解决的Tx中的混乱就被推到了注册上

    注册和注册之间还有一个额外的区别。当我报名参加一个活动时,它就完成了。当我注册一个系列时,我必须根据所需的FK订阅,选择一个订阅,即“包”。把它想象成一堆音乐会(活动)。我可以报名参加一场音乐会,也可以报名参加这个系列(有10场音乐会/活动)。当我注册该系列时,我从该系列管理员提供的注册选项(订阅)中选择:

    • 预付100美元,即可享受所有音乐会50%的折扣
    • 预付500美元,即可享受所有音乐会的100%折扣
    • 别的
    将注册与注册分开可以使我同时拥有所需的FK注册:系列和所需的FK注册:订阅

    更新:交易vs注册vs注册

    @Jay/@HLGEM问我为什么不能完全消除Tx。注册和注册在逻辑上分别表示用户与系列或事件之间的连接

    交易代表财务影响:费用、付款或信贷。注册第一个事件的用户可能会看到:

  • 事件的用户注册
  • 用户获得活动“费用”类型的发送(例如75美元)
  • 用户获得该系列的“费用”类型的发送(例如,每个注册该系列活动的人都必须一次性支付20美元的费用;这在我的用例中很常见)
  • 用户为活动付费(在我们的案例中为95美元)
  • 用户获得类型为“付款”的发送
  • 用户帐户余额(所有Tx的总和)现在为$0($75+-$20+$20)
  • 在上面的示例中(这是我们非常常见的用例),有3个事务:

    • -注册引起的事件75美元
    • -报名引起的系列节目20美元
    • 95美元是由付款引起的
    因此,我可以:

    • Tx仅通过注册连接到事件
    • Tx仅通过注册连接到一个系列
    • Tx未通过注册连接到一个系列,例如由注册引起,但未直接连接到注册
    • select tx_id, whatever 
      from event j
      oin signup on signup.event_id=event.event_id 
      join tx on tx.signup_id=signup.signup_id 
      where event_id=@eventid