数据库结构建议(序列化或单独表)

时间:2014-06-01 14:00:17

标签: mysql database serialization

我目前正在建立一个数据库,并告诉我我不是很擅长它(有点被迫这样做)。它是一个游戏数据库,我有一个名为game_table的表,用于存储用户创建的游戏会话。

问题是,存储受邀用户,请求用户,已确认用户,拒绝用户和待定用户列表的最佳方式是什么?目前我正在序列化用户ID(例如,邀请用户=“11235 | 2510 | 34630 | 45715 | 64530”)。然而,主要问题是该字段变得不可搜索,并且如果我想要检索用户被邀请的游戏列表则成为问题。为解决这个问题,我在welcome_games的user_table中存储了一个单独的字段(也是序列化的游戏ID)。

问题在于,每当我想添加新功能时,它都很难维护,并且在保持序列化数据同步时很容易出错。最好有单独的表,如:

invited_users_table

Game_ID  |  User_ID
 51      |   5193
 51      |   10458
 51      |   235
 901     |   1536
 901     |   4573

还是有其他更好的方法来存储这些类型的数据吗?请帮忙,谢谢!

2 个答案:

答案 0 :(得分:2)

从你的说法来看,你需要一个有三列的表:

  • 游戏ID
  • 用户ID
  • 用户类型

后者将采用“邀请”,“确认”,“请求”等值。

如果您有关于不同组的更多信息,则需要单独的表。例如,您可能拥有受邀用户的“邀请者”列,或确认用户的“确认时间”。如果不同组所需的特定列数量很大,那么您可能需要考虑更复杂的数据结构。如果只有少数这样的列,您可以将它们添加到上述表中。

答案 1 :(得分:1)

是的,最好为受邀用户提供一个单独的表格。

更好的是拥有game_user_relation表,它将存储游戏ID,用户ID以及它们之间的关系。有点儿:

create table game_user_relation(
    game_id int not null,
    user_id int not null,
    relation_type varchar (10) not null,
    primary key(game_id, user_id, relation_type)
) engine=InnoDB;

此表允许一个用户与一个游戏有很多关系。 或者,如果您只需要一个用户与一个游戏相关 - 从主键中删除relation_type

这样您就可以从一个表中选择所有需要的数据。