数据库设计问题(或问题)

时间:2010-10-15 13:41:05

标签: database-design

我正在设计一个包含三个表的数据库:用户,游戏和(可能)注册。我想表示用户可以在零个或多个游戏中注册。

我使用表格寄存器在游戏中注册用户。

我还需要将用户的分数存储在游戏中。

我的问题是:

我可以在表格寄存器中添加一个名为score的列吗?这是一个好的设计吗?

感谢。

8 个答案:

答案 0 :(得分:3)

是的,这是一个好的设计。但你应该改变命名。

user:
    userid
    username

game:
    gameid
    name

usergame:
    userid
    gameid
    score

答案 1 :(得分:2)

您所描述的是多对多关系,使用REGISTER作为交叉引用表:

USER
UserID

GAME
GameID

REGISTER
UserID
GameID
Score
[+ registration info]

听起来不错,但如果游戏相关信息或注册相关信息变得更复杂,你最终可能会将它分成两部分。

编辑添加:通常,您最终会想要保存游戏历史记录(“平均得分”,“最后5场比赛”,“最快时间”等等)。然后,您在REGISTERGAME_HISTORY表之间建立了一对多的关系。

此外,我同意这样的答案:如果它包含非注册信息,称其为“注册”表将会引起混淆。

答案 2 :(得分:1)

您可以将用户ID和游戏ID放入注册表以及分数。这将允许您为许多游戏注册用户,每个游戏都有一个分数。如果我理解你的问题,我认为这可能会做你想要的。

答案 3 :(得分:0)

我想,您将使用注册表来避免游戏和用户之间的多对多关系。如果你想在特定游戏中保持特定用户的得分,我认为这是一个很好的解决方案。

答案 4 :(得分:0)

如果是一张能够跟踪不同游戏中用户得分的表:当然,您可以拥有该列。但也许称之为“得分”呢? (除非你在那里需要其他信息,否则你应该使用第四张表)

答案 5 :(得分:0)

我认为你应该考虑创建一个“关系”表。

UserId | GameId | Score

UserIdGameId将成为主键,并且每个表分别对UserGame表是陌生的。

答案 6 :(得分:0)

这可能是一个合适的设计,只要每个寄存器最多只能有一个分数。如果寄存器可能没有分数,那么这将对应于NULL的值。如果这可能是表中行的很大一部分,那么另一个保持分数的表可能是合适的。

在我制作的应用程序中,我遇到了类似的情况,并且因为我想添加“高分表”功能(这需要在分数列上进行ORDER BY查询),我最终得到了很多我的“注册”表上的索引(不止一个只是为了这个目的,因为我必须为不同类型的游戏有不同的索引)。最后,我为得分创建了一个新表,尽管大多数寄存器都有相关的分数,以便使这些索引的维护成为一个问题。

答案 7 :(得分:0)

如果您的数据库的目标是分析,那么您也会考虑这一点:

请记住,除非您在游戏桌中为“没有注册游戏”添加一行,否则您将进行外部加入,并将其作为默认值放在usergame表中。您可以使用第一次注册删除“非注册”...如果最后一次注册被删除,则将其添加回来。

这将使您的报告内部联接并找到没有注册的所有用户简单明了。