我怎么能有一个列存储任意数量的“用户”

时间:2011-03-15 22:56:32

标签: c# asp.net sql database-schema schema-design

我有一个存储“匹配”的表,这些匹配具有以下列: MatchId,TeamA,TeamB,Wager,Winner

我希望能够让TeamA和TeamB返回每个团队的玩家列表。这个数字对于每一个都可以是任意的,这是可能的还是实际的?我想不出任何其他设计方法。对于所有这些都有更好的架构吗?玩家将成为UserId并且用户不受团队约束,团队只相对于比赛。

编辑: 例如, 球员A,B,C,D,E,F

比赛1:3v3 ABC vs DEF

Match2:3v3 DAB与FEC

玩家不应该被绑定到任何特定的TeamId,因为它只依赖于匹配。玩家可以在比赛中与他或她想要的任何人合作。

3 个答案:

答案 0 :(得分: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 :(得分:0)

两种方法:

1:对TeamA,TeamB列使用XML - 这样您就可以在应用程序中轻松处理的结构化字符串中创建完整的团队列表

2:使用更多表格:更全面的架构可能是:(这不是全面的,甚至可能超过顶部,但它是一个关于你可能想要思考的例证)

<强>匹配 MatchID 名称 发生的匹配

<强>团队 TeamID MatchID IsHomeTeam 名称 参加比赛的球队

<强>播放器 PlayerID TeamID 名称 每个团队的所有玩家

编辑:在澄清要求后,这是一个更简单的版本

答案 2 :(得分:0)

我假设您使用.NET来使用您的数据。 您可以使用Players属性创建一个团队类作为List。 在类上放置[Serializable]属性。

使用序列化方法将团队转换为字符串。 将字符串写入数据库。

使用反序列化方法将团队取消筛选回内存对象。

有关入门知识,请参阅此文章:http://msdn.microsoft.com/en-us/library/90c86ass(v=vs.71).aspx

就个人而言,我会使用更多的表格。拥有一个与Player实体具有1- *关系的Team实体。在您的匹配表中拥有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