2011-03-15 34 views
0

我有一個存儲表「匹配」這些比賽有以下欄目: MatchId,TeamA,TeamB,賭注,優勝者我怎麼能有一所存儲的「用戶」任意數量

我想能夠讓TeamA和TeamB返回每個球隊的球員名單。這個數字對於每一個都是任意的,這是可能的還是可行的?我不能想出任何其他設計方法。有沒有比這更好的模式?玩家將成爲UserId,而用戶不會被綁定到一個團隊,這個團隊只是相對於這個匹配。

編輯: 例如, 玩家A,B,C,d,E,F

匹配1:3v3的 ABC VS DEF

MATCH2:3v3的 DAB VS FEC

玩家不應該被綁定到任何特定的TeamId,因爲它只依賴於比賽。一名球員可以與他或她在比賽中期望的任何人合作。

+0

根據玩家與團隊或比賽的關係,您可能需要一個帶有TeamID外鍵的玩家表,或者某些形式的映射表,將玩家鏈接到團隊匹配。 – 2011-03-15 23:01:30

+0

你究竟想達到什麼目的?你想在每一個專欄中以逗號分隔的每個團隊的隊員名單? – RichardTheKiwi 2011-03-15 23:02:11

+0

序列化是將內存對象轉換爲適合寫入磁盤/通過網絡傳輸的字節流的過程。反序列化是相反的。 鑑於這些信息,序列化如何與從SQL中獲取數據相關? – 2011-03-15 23:12:07

回答

2

一個可能的數據庫架構看起來是這樣的: enter image description here

然後,您可以像這樣選擇出來:

SELECT M.*, P.* 
FROM Matches M 
JOIN MatchPlayers MP ON MP.MatchID = M.MatchID 
JOIN Players P ON P.PlayerID = MP.PlayerID 
WHERE M.TeamA_ID = MP.TeamID OR M.TeamB_ID = MP.TeamID 

對不起,如果我的SQL粗糙或模式是垃圾 - 它應該可能,可能希望,邊際工作。

這個特殊的SQL並沒有告訴你這個玩家所在的團隊,但是這些信息會在一些小的變化中出現。

對於你想要的,與其他數據相關的數據,序列化不是答案 - 或者它不是你的想法......我感覺到那裏的術語不匹配。閱讀使用.NET數據庫 - 網上有很多很棒的教程。另請閱讀關於關係數據庫的設計,網站資源也很棒。

+1

先發制人的答案...我使用的在線工具是在這裏,我打印屏幕上得到的圖片:http://www.dbschemaeditor.com/OnlineDB.aspx – 2011-03-15 23:21:46

+0

不錯 - 有點嫉妒你漂亮的圖片! – 2011-03-15 23:30:03

+0

Silverlight應用程序也是如此,我似乎並沒有遇到太多那些在野外:-) – 2011-03-15 23:31:41

0

兩種方法:

1:使用XML爲TeamA,TeamB列 - 這樣你可以在一個結構化的字符串來創建完整的團隊名單那很容易在你的應用程序來處理

2:使用多表:一個更全面的方案可能是:(這並非是全面的,甚至可能是過頂,但它的你會如何想成爲思維的插圖)

比賽 MatchID 名稱 個匹配所發生

TeamID MatchID IsHomeTeam 名稱 隊在一次比賽爲各自發揮

球員 PlayerID TeamID 名稱 所有玩家團隊

編輯:這是一個更簡單的版本後,要求澄清

+0

嘿,非常感謝您的快速反應,但是我不知道它是否有可用的Team table,因爲用戶不會被綁定到一個團隊..所以比如每場比賽都是一個新團隊。我可以與一些球員一場比賽,然後另一名球員在另一場比賽 – anthonypliu 2011-03-15 23:15:10

+0

給我片刻,然後我會修改... – 2011-03-15 23:17:02

+0

無論如何,每場比賽有2支球隊。你可以從UI中抽象出來,但最終數據模型是合適的。 – Slappy 2011-03-15 23:25:23

0

我假設你使用.NET來消費你的數據。 您可以使用Players屬性創建一個團隊類作爲列表。 在類上放置一個[Serializable]屬性。

使用序列化方法將組轉換爲字符串。 將字符串寫入數據庫。

使用反序列化方法將團隊重新定位到內存對象中。

請參閱本文底漆:http://msdn.microsoft.com/en-us/library/90c86ass(v=vs.71).aspx

個人而言,我會用更多的表。擁有與玩家實體具有1- *關係的團隊實體。在Matches表中有Team FK。

找一個匹配的球員:

SELECT P.PlayerName 
FROM Matches M (NOLOCK) 
JOIN Team T (NOLOCK) 
    ON T.TeamID = M.TeamA_ID 
JOIN Players P (NOLOCK) 
    ON P.PlayerId = T.PlayerId 

UNION ALL 

SELECT P.PlayerName 
FROM Matches M (NOLOCK) 
JOIN Team T (NOLOCK) 
    ON T.TeamID = M.TeamB_ID -- NOTE TEAM B 
JOIN Players P (NOLOCK) 
    ON P.PlayerId = T.PlayerId 
相關問題