Database design 构建数据库关系以跟踪应用程序设置的不同变化

Database design 构建数据库关系以跟踪应用程序设置的不同变化,database-design,foreign-keys,relational-database,primary-key,composite-primary-key,Database Design,Foreign Keys,Relational Database,Primary Key,Composite Primary Key,我目前正在设计的一个应用程序允许用户创建定制的竞争联盟(想象一下这有点像梦幻运动),每个用户都可以加入不同的联盟,每个联盟由多个回合组成,用户(以下称为玩家)可以参加多个回合将参加比赛,并可根据每个联赛制定的不同标准/成绩获得积分。以下是一些需要注意的关键信息: 积分在联赛/赛季的所有回合中累积 自定义点标准/权重设置可以在每轮中更改。我认为在大部分情况下,这些逐轮积分设置将在联赛期间(即赛季)保持相对一致,但联赛当然可以选择大幅调整。按照我目前的设置方式,联盟将建立一组默认的联盟级别积分设置

我目前正在设计的一个应用程序允许用户创建定制的竞争联盟(想象一下这有点像梦幻运动),每个用户都可以加入不同的联盟,每个联盟由多个回合组成,用户(以下称为玩家)可以参加多个回合将参加比赛,并可根据每个联赛制定的不同标准/成绩获得积分。以下是一些需要注意的关键信息:

  • 积分在联赛/赛季的所有回合中累积
  • 自定义点标准/权重设置可以在每轮中更改。我认为在大部分情况下,这些逐轮积分设置将在联赛期间(即赛季)保持相对一致,但联赛当然可以选择大幅调整。按照我目前的设置方式,联盟将建立一组默认的联盟级别积分设置,这将是每轮的默认设置,但他们始终可以决定更新积分权重、添加新的积分设置或停用/激活它们。由于这些子设置可能因轮而异,我是否应该有一个表用于默认联赛级别的分数设置,然后有另一个表用于包含每轮实际执行的所有设置的轮级别子设置
  • 与上述类似,每一轮可以由不同的玩家组成;它不一定是所有的联盟成员/球员或每轮中的同一组球员,所以我现在有一张表给联盟球员,一张表给轮球员,然后一张表跟踪每个球员的得分,基本上有外键链接到一堆其他表,我觉得有点奇怪
这种方法有意义吗?还是我想得太多或遗漏了什么?下面是一个链接,链接到我编造的一个实体关系图的图像,我觉得它有点不可靠,尤其是对于Point Earned表,但这可能是因为我缺乏设计关系数据库的经验。请注意,用“CPK”列出的字段是复合主键,由该表中相应外键的串联组成。欢迎任何反馈,谢谢

确认 [解释]由于各轮的点设置可能不同,我应该:

  • 一个表格用于默认的联赛级别分数设置
  • 然后是另一个圆形水平点设置
这将记录每轮实际执行的分数设置

对。您隐式声明的是,一个回合有一个设置,即:

  • 或者是联赛级别设置
  • 或自定义设置
这是逻辑中一个典型的或门,在关系数据库中有一个正确的方法来实现它:一个排他子类型

我现在有一张桌子给联盟球员,一张桌子给圆形球员

这是正确的:它们是两个独立的事实,后者依赖于前者。这意味着:

  • 球员必须首先注册为联盟球员
  • 因此,玩家可以注册为回合玩家
    • 而且只有在他注册为联盟球员的联赛中
然后是一个表,它跟踪每个玩家获得的积分,基本上有外键链接到一堆其他表

您的数据模型在这一点上偏离了轨道


问题
  • 显然,您已经了解了数据完整性的价值。你试图确保在一个联赛的回合中的球员实际上是在该联赛注册的球员;等等,非常好。您正试图实现关系完整性,这是逻辑的(与引用完整性不同,引用完整性是SQL的一个物理特性)

    • 您已经发现,实现这一点的唯一方法是使用组合键。杰出的复合键是关系数据库中的常用键
  • 然而,第二个问题是,您没有密钥,您有物理
    记录ID
    。。。声明为“密钥”。因此,您试图约束的逻辑事物(数据是逻辑的)没有被约束。那次努力,那次尝试,导致了许多关系。。。这并没有达到预期的结果

  • 关系键

    • 正如Dr E F Codd在关系模型中所定义的那样:
      • [Relational,logical]键由数据组成
      • 引用是通过逻辑关系键进行的
    • 20世纪60年代,记录归档系统被“理论家”大量推销,并以欺诈的方式命名为“关系型”:
      • 引用按物理
        记录ID
        进行
      • 这种原始系统没有关系完整性;没有关系权力;而且没有关系速度
  • 您正在使用声明为“键”的
    记录ID
    (这会让您非常困惑,因为它不是键,并且没有键的属性)。然后尝试通过组合键获得一些关系完整性(您直观地知道只有关系模型提供了这种完整性)。。。但是您使用的是声明的非键,因此它失败了,并在尝试中创建了一个复杂的模型

    • 纠正方法是使用逻辑关系键、来避免物理
      记录ID
  • 此外,你的
    CPK
    是克服“理论家”局限性的一次伟大尝试,但它并没有具体说明它由哪些列组成。如果您使用IDEF1X(关系数据建模的标准):组成键的列,主或备用,以及