选择数据库重新设计的选择(体育统计,比赛,地理范围)?

时间:2011-05-16 17:16:45

标签: mysql database-design tree parent-child entity-relationship

我正在扩展一个关于体育统计数据库的数据库。不同的联赛,或者更确切地说是“比赛”,可以通过类似于某些地理区域(参赛队伍的范围/范围)的树形结构来表示:

 1. Continent Competition    (continent)
                                  ↑
 2. Country Competition       (country)
                                  ↑
 3. Region Competition        (region)
                                  ↑
 4. State Competition          (state)
                                  ↑
 5. District Competition     (district)

(箭头表示父地理区域实体(树结构)的FK。)

这里'设计直观:

Valid XHTML http://www.kawoolutions.com/media/competitions-geoareas-nosubs.png

我创建了“地理区域”的层次结构,基本上只是为了实现范围竞争层次结构。每个竞赛实体都提到地理区域,例如每个州都知道其(子国家)地区(parent_id)。

每个地理区域 - 比赛组合包含三个信息:比赛类型(联赛,杯赛,季后赛......),地理区域类型(参赛队伍的范围!)和地理区域名称。

以下是我想要插入数据库的比赛:

INSERT INTO Competitions (geo_area_id, type, label) VALUES ( 88, 'league', 'Deutsche Meisterschaft');         -- 'Country Championships Germany'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (248, 'league', 'Regionalmeisterschaft Nord');     -- 'Region Championships North'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (249, 'league', 'Regionalmeisterschaft West');     -- 'Region Championships West'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (250, 'league', 'Regionalmeisterschaft Sued');     -- 'Region Championships South'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (251, 'league', 'Regionalmeisterschaft Ost');      -- 'Region Championships East'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (258, 'league', 'Landesmeisterschaft Hessen');     -- 'State Championships Hesse'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (268, 'league', 'Bezirksmeisterschaft Darmstadt'); -- 'District Championships Darmstadt'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (269, 'league', 'Bezirksmeisterschaft Frankfurt'); -- 'District Championships Frankfurt'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (270, 'league', 'Bezirksmeisterschaft Giessen');   -- 'District Championships Giessen'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (271, 'league', 'Bezirksmeisterschaft Kassel');    -- 'District Championships Kassel'

INSERT INTO Competitions (geo_area_id, type, label) VALUES ( 88, 'cup', 'DBB Pokal');              -- 'Country Cup Germany'
-- INSERT INTO Competitions (geo_area_id, type, label) VALUES (250, 'cup', 'Regionenpokal Süd');      -- 'Region Cup South' => DOESN'T EXIST IN REALITY!
INSERT INTO Competitions (geo_area_id, type, label) VALUES (258, 'cup', 'Landespokal Hessen');     -- 'State Cup Hessen'  => PROBLEM HERE! parent should be country cup Germany, but it points to Region South due to the geo areas nature
INSERT INTO Competitions (geo_area_id, type, label) VALUES (268, 'cup', 'Bezirkspokal Darmstadt'); -- 'District Cup Darmstadt'

对于常规赛(联赛)来说这很有效(顶级实体),然而,在第二次到最后一次插入比赛表中,我意识到了一个我没有预料到的问题:

有些比赛的“父母比赛” - 由地理区域的父母决定 - 不存在。例如:每个州的德国杯比赛资格赛队直接进入国家级别,因为没有“德国地区杯”比赛。

根据他们的逻辑,看看与比赛分离的地理区域,地理区域本身正确表示我会说。只是竞争有时似乎“跳过”地理区域。当然没有什么是无法解决的,但我现在如何最好地适应这种情况呢?

我想到的替代方案:

  1. 参加每个地区的假杯比赛。然后,竞赛表需要一个BOOLEAN is_dummy列或类似的列。在运行时,必须检查此标志,如果它是假的,则返回地理区域的父级(可能递归,直到找到geoa区域或返回NULL)。
  2. 为比赛添加另一个可选的parent_geo_area_id。在运行时,将检查此字段:如果它具有非NULL值,则使用该字段返回父地理区域(父覆盖字段),如果不使用“普通”地理区域参考的父级。 这种方法的问题在于竞赛表已经有了GeoAreas的外键,而添加另一个表基本上代表了“重复列” - 不是吗?这不会导致稍后的条件连接吗?有可能吗?
  3. 两者都在一定程度上增加了冗余,但是我不知道如何在没有“竞赛跳过问题”本身的情况下做到这一点。

    也许存在其他替代方案?如果没有,你会建议哪种替代方案?为什么?

    谢谢!

1 个答案:

答案 0 :(得分:1)

  

有时只是比赛   似乎“跳过”地理区域。没有   当然无法解决,但我该怎么做   现在最能适应这种情况吗?

模拟现实世界的运作方式。

不要调整您已知的模型不起作用。