数据库游戏消息模式

时间:2011-05-01 04:32:32

标签: mysql sql database database-design

我正在尝试使用数据库作为游戏中消息系统的后端(有点像即时消息)。我正在使用本地数据库来存储收到的消息和我的服务器上的数据库以发送它们。以下是我正在使用的表格:

用户:
userName(varchar)
displayName(varchar)
currentGames(varchar)

消息:
发件人(varchar)
接收器(varchar)
消息(varchar)
时间戳(int)

我的计划是,当用户发送邮件时,我首先将邮件存储在本地数据库中,然后将邮件发送到服务器。

当用户检查是否有新消息(轮询)时,他首先从其本地数据库获取最新时间戳,并使用此时间在在线数据库中查询在此之后发送的所有消息。然后,从数据库中删除收到的所有消息。

我这样做的方式有问题吗?我正在努力为最坏的情况做准备,我不知道这种计划将如何扩展。我没有在“用户”表中使用唯一的ID,我觉得我应该这样做。由于我的数据库经验有限,我不完全理解独特的自动增量ID的重要性或它如何帮助我。任何建议/批评都将不胜感激。

2 个答案:

答案 0 :(得分:2)

这是我对它的看法。这就是我要做的事情....

这完全取决于您的系统如何工作。如果允许每个用户名使用一次而不允许用户更改它,那么从逻辑上讲,您将不需要使用id。就个人而言,我为用户数据库使用auto_incremented id。如果我是你,我会使用一个ID,它会简化一切。

在本地数据库上,您需要具有以下内容:

Friend's database:
USER_ID  USERNAME

Game's database:
GAME_ID   USER_PLAYING_ID

Messages database:
TO_USER  TIMESTAMP  GAME_ID

因此,当提交到在线数据库时,您将拥有要发送给用户的ID以及游戏信息。

再次,我将如何做到这一点。除了其他一切,你好像知道自己在做什么。

答案 1 :(得分:2)

由于大多数玩家标签都是短暂的,你可能想要区分游戏玩家的ID(私人)和他们的用户名(公众,至少是朋友),那么你想要一个像这样的本地设计:

FRIEND  -- The local user's own tag should go in here too.
( user_id
, current_gamer_tag
, last_update_timestamp
)

GAME
( game_id
, game_name  -- No timestamp here because the name doesn't change?
)

MESSAGE
( message_id  -- If you make this a GUID you can use it for synching with the server.
, sending_user_id -- FK to FRIEND
, receiving_user_id -- Also FK to FRIEND
, timestamp 
, content
)

它在本地保存传出和传入消息,并允许消息显示聚焦于游戏者标记,同时易于与服务器同步。顺便说一下,如果你有三个或更多的游戏玩法,你也可以考虑将receiving_user_id更改为包含收件人列表的子表。

出于很多原因,使用唯一ID非常重要。最重要的是,它允许您修改游戏玩家标签,并防止您必须在消息显示中显示玩家的用户ID。这里还节省空间,因为整数,甚至bigint都小于游戏者标签。这对于可伸缩性更好。对消息ID使用GUID而不是递增的整数意味着您的服务器消息表上不会有“插入热点”,只要您的服务器消息表中有足够的可用空间,它就会表现得更好。此外,可以在客户端生成消息ID,并且您可以非常确信当消息到达服务器时不会发生任何密钥冲突。