2013-01-08 159 views
0

我有一個網站,顯示運動員列表和他們的統計數據。用戶可以註冊並創建一個這些球員的隊伍,我可以總結和分析球隊的統計數據。我希望每個用戶都能夠從列表中「跳出」一名玩家(但不能將其從數據庫中移除),並且如果需要的話,恢復已被劃掉的玩家。被劃掉或未劃掉的玩家需要保存在數據庫中,因此當用戶返回到站點時,他們的列表被保存。多表數據庫設計

這些是我目前擁有的表:

Players Table (COLS: Name, Team, Position, Stats, etc.) 
Users Table (COLS: User ID, Name, Email, etc.) 
Teams Table (COlS: User ID, 1, 2, 3, etc.) 

我敢肯定有一個更好的方式來存儲在團隊表信息,我有用戶ID一列,然後30列(編號1-30),我存儲他在單元格中選擇的玩家名稱和位置(以這種格式的玩家姓名/位置)。一個團隊可以組成30人。

我想我需要一個「可用表」來存儲哪些玩家被哪些用戶劃掉了。我不確定考慮到用戶可以從列表中挑選600名玩家,最好的方式是什麼。

任何建議將不勝感激,我完全不熟悉處理數據庫,我似乎打了一堵牆。

謝謝!

+1

http://stackoverflow.com/questions/14207821/how-to-structure-large-mysql-database –

回答

1

您應該從團隊表中刪除玩家數據,併爲玩家和團隊數據設置連接表。

所以你最終

Teams Table (Cols: ID, User ID, Team Name) 
Team_Players Table (Cols: Team_ID, Player_ID, Position, Active) 

那麼你可以得到哪些球員是哪支球隊通過運行Team_Players查詢和檢查,如果他們是活躍與否。

我沒有添加ID字段,因爲Team_ID和Player_ID的連接將是唯一的,並且可以用作此表的鍵。

+0

這個Team_Players表可能會爲每個球隊和每個球員的組合排?這會對約600名玩家和許多用戶造成問題嗎? – rodzilla

+0

@ user1956847它不會在功能方面造成任何問題,但通常_any_查詢的性能會隨着要查詢的記錄數量的增加而下降。您還應該爲「Team_ID」和「Player_ID」列設置索引,以便DB在「Team_Players」表上爲您的查詢進行一些查找優化。 –

+0

根據您的規格,每個團隊/用戶組合只有30條記錄。 –

0

閱讀本教程。這是非常有幫助的:

http://www.tomjewett.com/dbdesign/dbdesign.php?page=association.php

數據庫的設計依賴於一個給定的玩家是否可以屬於多個團隊在數據庫中。如果可以的話,這是一個has and belongs to many關係,你需要一個鏈接表,或許叫做Players_Teams(總是以alpha順序列出表)。此表格還可能包含您正在討論的crossedOff列。

使用像ActiveRecord或Doctrine這樣的ORM(對象關係映射器)可以大大減少需要編寫的代碼量,以便在代碼中對這些關係進行有些「自動」的管理。

+0

感謝您的幫助,該教程真的幫助。我想我明白了,但我擔心Players_Team表中潛在的大量記錄。通過交叉偏移屬性,每個用戶可能會有600條記錄。隨着用戶數量的增加,這會造成問題嗎? – rodzilla

+0

您可以考慮使用非規範化作爲替代(例如,將關聯記錄存儲爲json),但它會使統計更難。只要您通過代碼中的主鍵查詢,數據在您縮放時就會很容易碎片化。另外MySQL有足夠的能力處理大型表格,並提供正確的索引和緩存。 – jchook