我在擴展一個關於體育數據庫的數據庫。爲數據庫重新設計(體育統計數據,比賽,地理範圍)選擇哪種選擇?
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比賽表我發現了一個我沒有預見到的問題:
有些比賽的「父母比賽」 - 由地理區域父母決定 - 不存在。例如:每個州的德國杯比賽的資格賽隊直接進入國家級比賽,因爲沒有「德國杯賽」這樣的比賽。
通過他們的邏輯,看看與競賽相隔離的地理區域,地理區域本身的代表性正確,我會說。這只是比賽有時似乎「跳過」地理區域。當然沒有什麼不可解決的,但我現在如何最好地適應這種情況呢?
浮現在我腦海中的替代品:
- 輸入每個區的虛擬杯比賽。比賽表然後需要BOOLEAN is_dummy列或類似列表。在運行時,該標誌必須被檢查,如果它是一個地理區域的父項被返回的假(可能遞歸直到找到一個geoa區域或返回NULL)。
- 將另一個可選的parent_geo_area_id添加到比賽中。在運行時,將檢查此字段:如果它具有非空值,則使用該字段返回父地理區域(父代覆蓋字段),如果不使用「正常」地理區域引用的父代。 這種方法的問題在於Competitions表已經有了GeoAreas的外鍵,添加另一個基本上會代表「重複的列」 - 不是嗎?這會不會導致稍後的條件連接?可能嗎?
兩者都在一定程度上增加了冗餘度,但我不確定如果沒有「競爭跳過問題」本身導致它,如何去做。
也許還有其他的選擇?如果沒有,你會建議哪種方法,爲什麼?
謝謝!
地理區域只是模擬現實世界的方式:地區層次結構區域 - >州 - >地區 - >國家與所使用的運動項目一樣。請參閱:http://www.basketball-bund.com/您可以在這裏看到地理區域(沒有地區)。然後,如上所述,一些比賽從右邊到左上角的地理區域而不是左下角。左下角*杯*比賽不存在。這就是我需要建模的。 *只有一些*競賽的性質「添加」這個「跳過功能」。地理區域本身是多年前定義的,代表真實世界。 – Kawu 2011-05-17 09:26:51
我知道你是以他們在現實世界中的方式來模擬地理區域的。但是你沒有那樣模擬比賽。每當你發現自己考慮虛擬行或可選的父母身份號碼時,這表明你的模型完全錯誤。真實世界的聯賽沒有虛擬比賽。也許你已經建立了一個並不存在的競爭層次結構。 – 2011-05-17 10:06:17
您的評論暗示我寧願使用比賽父項並完全刪除GeoAreas父項,因爲地理區域只是爲了形成地理競賽層次而創建的。我必須考慮這一點。這個很難(硬。 – Kawu 2011-05-17 10:54:32