1

我在扩展一个关于体育数据库的数据库。为数据库重新设计(体育统计数据,比赛,地理范围)选择哪种选择?

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

(箭头代表FKS到母体地理区域:不同的联盟,或更精确地“竞赛”,可以通过树结构类似于某些地理区域(范围/范围参赛团队)表示实体(树形结构))

这里的设计在视觉上:

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

我创建的‘地理区域’层次结构基本上只是实施范围的竞争层次。每个竞争实体都有对地理区域的引用,例如,每个州都知道其(子国家)地区(parent_id)。

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

这里有我想要插入DB比赛:

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' 

对于常规赛比赛中(联赛)这工作得很好(顶部实体),然而,在倒数第二个INSERT INTO比赛表我发现了一个我没有预见到的问题:

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

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

浮现在我脑海中的替代品:

  1. 输入每个区的虚拟杯比赛。比赛表然后需要BOOLEAN is_dummy列或类似列表。在运行时,该标志必须被检查,如果它是一个地理区域的父项被返回的假(可能递归直到找到一个geoa区域或返回NULL)。
  2. 将另一个可选的parent_geo_area_id添加到比赛中。在运行时,将检查此字段:如果它具有非空值,则使用该字段返回父地理区域(父代覆盖字段),如果不使用“正常”地理区域引用的父代。 这种方法的问题在于Competitions表已经有了GeoAreas的外键,添加另一个基本上会代表“重复的列” - 不是吗?这会不会导致稍后的条件连接?可能吗?

两者都在一定程度上增加了冗余度,但我不确定如果没有“竞争跳过问题”本身导致它,如何去做。

也许还有其他的选择?如果没有,你会建议哪种方法,为什么?

谢谢!

回答

1

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

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

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

+0

地理区域只是模拟现实世界的方式:地区层次结构区域 - >州 - >地区 - >国家与所使用的运动项目一样。请参阅:http://www.basketball-bund.com/您可以在这里看到地理区域(没有地区)。然后,如上所述,一些比赛从右边到左上角的地理区域而不是左下角。左下角*杯*比赛不存在。这就是我需要建模的。 *只有一些*竞赛的性质“添加”这个“跳过功能”。地理区域本身是多年前定义的,代表真实世界。 – Kawu 2011-05-17 09:26:51

+0

我知道你是以他们在现实世界中的方式来模拟地理区域的。但是你没有那样模拟比赛。每当你发现自己考虑虚拟行或可选的父母身份号码时,这表明你的模型完全错误。真实世界的联赛没有虚拟比赛。也许你已经建立了一个并不存在的竞争层次结构。 – 2011-05-17 10:06:17

+0

您的评论暗示我宁愿使用比赛父项并完全删除GeoAreas父项,因为地理区域只是为了形成地理竞赛层次而创建的。我必须考虑这一点。这个很难(硬。 – Kawu 2011-05-17 10:54:32