代码之家  ›  专栏  ›  技术社区  ›  memilanuk

父子关系:多个表与自联接

  •  2
  • memilanuk  · 技术社区  · 16 年前

    我正在为一个体育俱乐部的统计数据库工作,在那里我帮助管理一些活动。我想我已经掌握了跟踪竞争对手名称、分类、类别等的部分。通过使用主表、几个查找表和一对桥接表来涵盖所涉及的多对多关系来解决问题。

    我为下一部分草拟了一个模型,但我并不完全满意我做得对。我知道我们是如何在纸上和/或电子表格上做这些工作的,我仍然在做大量的手工工作,但我并不是百分之百相信我能正确地将其“翻译”到表格和关系中。

    一个简单的事件结构可能如下所示:

    锦标赛 第1天 -匹配1(已激发匹配) -匹配2(已激发匹配) -匹配3(已激发匹配) -匹配4(聚合匹配1,2,3) 第2天 -匹配5(已激发匹配) -匹配6(已激发匹配) -匹配7(已激发匹配) -匹配8(聚合匹配5,6,7) -匹配9(聚合匹配4,8) < /代码>

    我把事情进一步分解,并为“得分”、“阶段”、“比赛”和“锦标赛”(除其他外)准备了表格。我的想法是,分数是我需要为每个竞争对手记录的原始数据,带有“竞争对手”和“阶段”表的外键。我决定把比赛当作一个或多个阶段的集合来处理,而不是进行“激发”和“聚合”比赛,而且锦标赛可以有一个或多个比赛(聚合)。

    我遗漏了一些由其他外键指示的查找表,因为它们与手头的事情没有直接关系,我想这是“这是正确的方法吗,还是我最好跳过匹配/阶段分离?”是否有一种方法可以通过自联接在单个表中的匹配项和阶段之间重新实现这种父子关系?

    我为下一部分草拟了一个模型,但我并不完全满意我做得对。我知道我们是如何在纸上和/或电子表格上做这些工作的,我仍然在做大量的手工工作,但我并不是百分之百相信我能正确地将其“翻译”到表格和关系中。

    简单的事件结构可能如下所示:

    Tournament  
    - Day 1  
        - Match 1 (Fired Match)  
        - Match 2 (Fired Match)  
        - Match 3 (Fired Match)  
      - Match 4 (Aggregate Match of 1,2,3)  
    
    - Day 2  
        - Match 5 (Fired Match)  
        - Match 6 (Fired Match)  
        - Match 7 (Fired Match)  
      - Match 8 (Aggregate Match of 5,6,7)  
    
     - Match 9 (Aggregate Match of 4,8)  
    

    我把事情进一步分解,并为“得分”、“阶段”、“比赛”和“锦标赛”(除其他外)准备了表格。我的想法是,分数是我需要为每个竞争对手记录的原始数据,带有“竞争对手”和“阶段”表的外键。我决定将比赛视为一个或多个阶段的集合,而不是进行“激发”和“聚合”比赛,并且锦标赛可以有一个或多个比赛(聚合)。

    ERD

    我遗漏了一些由其他外键指示的查找表,因为它们与手头的事情没有直接关系,我想这是“这是正确的方法吗,还是我最好跳过匹配/阶段分离?”是否有一种方法可以通过自联接在单个表中的匹配项和阶段之间重新实现这种父子关系?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Philip Kelley    16 年前

    对我来说,它看起来像一个适当规范化和灵活的层次结构。

    按照设计,这意味着一场比赛有一场或多场比赛,一场比赛有一个或多个阶段……或者,更确切地说,每个父代都有一个可变的子代数,其中子代数总是大于零,但可以并且将因实例而异。如果不是这样的话,如果一个家长(锦标赛或比赛)总是有相同数量的孩子,那么在取消数据规格化方面可能会有一些小优势(比如一个工作日有七列的表),但从长远来看,这可能会很尴尬。

    由于层次结构的不同级别包含不同的属性,我绝对不会使用自联接来执行单个表。例如,“shots”是一个舞台的一部分,而不是比赛的一部分,因此不应成为比赛桌的一部分。