Mysql

儲存具有多個替代名稱的運動隊

  • May 5, 2021

我正在設計一個 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;

引用自:https://dba.stackexchange.com/questions/290687