2011-03-15 58 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 
相关问题