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