2011-05-16 32 views
3

我正在製作一個足球遊戲,讓人們可以在線創建聯賽。SQL數據庫:使用一個包含3,5M條目的表或使用條目較少的表嗎?

說一段時間後我有1000個聯賽。我將數據存儲在SQL中。我應該:

1)創建1個與表「名冊」單一數據庫和所有聯賽的所有球員插入它(這將接近3.5至4萬個條目,1000個盟)

2 )創建1個20代表「rosters1,rosters2等」單個數據庫和拆分那些20個表之間的聯賽名冊

3),用於在與表「名冊」每個聯盟創建1個數據庫中的每個

4)創建20個數據庫,每個數據庫中有一個表「花名冊」,並在20個數據庫之間拆分聯盟名冊。

性能和快速SQL查詢的最佳選擇是什麼?

+2

也許一些表格數據會有幫助,以及一個或兩個查詢。沒有更具體的例子,很難用績效來說。 – ansiart 2011-05-16 22:04:41

+2

3.5M沒什麼。保持關係簡單(冗餘是你的朋友)和表格苗條(冗餘不是你的朋友)。重要的是你創建了正確的索引。以及使用這些索引的公用智能查詢。相同的數據庫或名字相同的表格很愚蠢。 3.5M沒什麼。 – Rudie 2011-05-16 22:44:13

+0

列的示例: PlayerID,PlayerName,PlayerTeam,PlayerAwareness,PlayerHitting,PlayerCatching ... PlayerContract,PlayerYearsLeft(共82列) @RUDIE:你是什麼意思「創建正確的索引」?索引在表中的作用是什麼(以及如何決定索引哪些列)?此外,下面的用戶「我自己」在他的評論中說,3.5米將花費大量時間進行搜索。瞭解我的「名冊」表(82列)的列,你還建議使用單個表嗎?在此先感謝 – 2011-05-16 23:03:27

回答

1

聽起來你需要學習一些數據庫基礎知識,所以請花點時間確保你瞭解Database Normalizationindexes。然而,原則上,你可能需要一個「玩家」表(玩家ID,名字等),一個「名冊」表(名冊ID,名字,也許是owner_id)和一個player_roster_map(player_id,roster_id)將兩者聯繫起來。您可能需要對player_id和roster_id的複合值進行唯一約束,並且您應該在該映射表中對player_id和roster_id都有外鍵約束。 (我假設球員並不是每個球員都是獨一無二的;如果有屬性被擁有球員的人所覆蓋,那麼你仍然可以進行類似的模擬,但是我猜根據我對你對球員的描述的理解該模型)

您的數據庫引擎可能會將您標記爲主鍵的任何內容編入索引,並且可能將您標記爲外鍵的任何內容編入索引,但這依賴於數據庫,並且我不是專家在MySql上;你需要做一些研究。

當您執行查詢時,正確的索引將幫助您,插入性能方面的成本通常較低。如果最後得到大量相同的值或者查詢的利用率很高(只有一小部分值(例如時間範圍)),那麼您最終可能還需要了解分區。分區使您可以獲得處理大量記錄的好處,而不會產生非規範化引入的建模問題。但是,不要過早地採取這一步驟;您可能會發現,正確的數據庫設計對於您所暗示的數據集的大小已足夠。

+0

感謝您的詳細解答。然而,球員在聯盟和聯盟之間的演變是不同的,所以我必須爲每個聯盟中的每個球員插入一行 - 您提議的我的方案適合聯盟,每個聯盟中球員的屬性不會改變,但這是不是這裏的情況。然而,我仍然可以爲球員信息提供一張不會改變的表格,例如名字+出生日期+國籍,但是它會對錶現產生影響嗎?我不太確定(每個聯盟只有大約8行(玩家的個人信息)) – 2011-05-17 00:10:57

+0

我建議將屬性作爲玩家模型的一部分進行建模,作爲正確性的第一步,然後擔心表現。令人驚訝的是,正確性往往與表現有關。但這聽起來像你有一個額外的領域概念來解決;這聽起來像是一個PlayerLeagueVitals的概念,有player_league_id(PK),player_id,league_id和每個相關的聯盟特定的球員統計。 – JasonTrue 2011-05-17 00:20:00

+0

輝煌。 (1)players_infos(包含名稱和出生日期等固定元素...) (2)players_vitals(包含特定聯盟的球員統計數據和球員的id以在必要時加入「players_infos」 ) 我會把這個嘗試;) – 2011-05-17 00:25:08

1

我想你想要選項1原則上。你必須考慮使用情況,例如將某個人從一個名單移到另一個名單:你不希望跨數據庫發生這種情況。我想像你想要對陣所有名單的許多問題。儘管MySQL不提供它,但您可能會發現研究分區很有幫助。 (Postgresql的)

你還需要看看規範化。例如:我假設你有一個teams表,並且PlayerTeam只是一個外鍵(你應該在這兩個表中將這個列索引)。如果這對您沒有意義,請花一點時間在數據庫設計書或網站上。

+0

我相信MySql的一些配置現在支持分區,但它可能取決於您的構建配置以及可能選擇的存儲引擎。 http://dev.mysql.com/doc/refman/5.1/en/partitioning.html – JasonTrue 2011-05-16 23:42:02

+0

@JasonTrue:很有可能。我對MySQL的熟悉程度很低,他們的ISAM表格非常多。 – 2011-05-16 23:45:17