儲存具有多個替代名稱的運動隊
我正在設計一個 MySQL 數據庫來儲存一些足球比賽的結果和統計數據。
用於填充數據庫的數據將從多個來源抓取,並且每個網站上的團隊名稱將略有不同。(有些在球隊更名並完全改名之前使用了舊名稱;有些會使用縮寫,例如 United -> Utd;有些會在名稱中包含 FC,有些則不會;其他來源將使用某種語言的名稱不同於英語。)
我想知道儲存這些數據的最佳方式是什麼。
我的想法是在主表中使用 TeamID,並有一個額外的表作為字典,用於將團隊名稱的多個變體轉換為 ID。當然,填充這樣的“字典”會很麻煩。
例子
TeamID | TeamName ----------------------------- 1 | Manchester United 1 | Man Utd 1 | MUFC 2 | PSG 2 | Paris Saint-Germain
這實際上是南美俱樂部的一個大問題,一個俱樂部可以在各種來源中擁有五個完全不同的名稱,而這並不像將 United 簡稱為 Utd 或縮寫名稱那麼容易。
因此,我將編寫一個腳本來抓取團隊的名稱,在“字典”表中找到它,然後僅使用 TeamID 將所有統計資訊和資訊寫入主表。這也應該節省一些記憶體。
請讓我知道這是否是一個好的解決方案,以及您是否對我有一些不同的方法。
來自對該問題的評論的維基回答:
是的,這就是我在日常工作中使用教科書名稱所做的事情,不同的學校會將相同的教科書稱為完全不同的名稱。希望您不會遇到不同團隊名稱可能重疊的問題,因為這會使此類問題的難度增加 10 倍。-馬蒂戈
您可能需要添加一
source
列和一個active
以幫助消除縮寫的歧義,因為據推測,即使兩個不同的站點為不同的團隊使用相同的名稱,單個站點也不會同時為兩個不同的團隊使用相同的名稱。談到儲存(主題),我會為其他屬性添加一列。像“primary”、“official full”、“official short”等等。說到抓取腳本,我建議創建規範化詞彙表,它設置令牌的“任何形式”與其規範名稱之間的關係(Utd - >聯合)。這可以簡化“某些名稱”轉換為規範名稱(或搜尋最接近的規範名稱列表)的過程。-秋名
是的。你的兩張桌子是做這件事的“正確”方式。
一個表每個團隊有一行, TeamId 為
PRIMARY KEY
.如您所見,另一個表是從 TeamName 到 TeamId 的多對一映射。
CREATE TABLE AltNames ( TeamId SMALLINT UNSIGNED NOT NULL, -- for JOINing to the other table TeamName VARCHAR(99) NOT NULL, PRIMARY KEY(TeamName), -- this implies uniqueness INDEX(TeamId) -- might be useful ) ENGINE=InnoDB;