【问题标题】:How to insert multiple values into one column?如何将多个值插入一列?
【发布时间】:2020-01-20 15:10:47
【问题描述】:

我正在为游戏服务器设置数据库,并且我是数据库新手,我遇到了一个问题,我必须将 多个玩家 插入 同一列,基本上我有一个组,在那个组中我需要插入多个玩家,所以我现在有这些列:

Group Name:
Group Owner:
Players:
Creation Date:

如何将多个玩家添加到一个组中?我是否需要将 所有这些 插入 同一列 并在 Java 中使用 String.split() ? 或者有没有更好的方法来做到这一点?

【问题讨论】:

  • 您不想在数据库中插入序列化数据。这违背了使用 RDBMS 的目的。想想DB Normalization
  • 您可以有另一个Player 表(或Person 表中的某些特定“角色”以表明他们是玩家),然后有一个BIG INTs 数组在您的 Players 列中(以指示这些玩家的玩家 ID),或者为 PlayerGroupMappings 设置 另一个 表,其中详细说明了 GroupID 和 PlayerID(并且存在条目表明那里存在映射)。
  • @Cid 根据我对 DB 规范化的理解,基本上是多了一张表,里面有 2 个东西——你需要的值和一个数字,这个数字是你原始表的 PK,所以就像我该如何解决这个问题基本上是有另一个表,里面有玩家姓名/标识符,还有另一个列,指定他们与哪个组相关?
  • @Coper 请阅读Ashley's answer

标签: java mysql sql database


【解决方案1】:

我将假设您正在设置一个关系数据库。坦率地说,您不想在一列中插入多个值。您希望根据数据及其彼此之间的关系来设计表格。现在,您似乎有两个实体:组和玩家。这两者之间的关系是一个玩家可以属于一个组,对吗?因此,您希望为每个实体创建一个表,并根据代表它们关系的键来链接它们:

Group:
 - group id (PRIMARY KEY)
 - name
 - owner
 - creation date

Player:
 - player id (PRIMARY KEY)
 - (any other player info you may need, like a name)
 - group id (FOREIGN KEY)

主键 是您的表的唯一标识符 - 它标识一个且只有一个条目。 外键 引用另一个表(在本例中为组)中的一个且仅一个条目。上述设计如果玩家可以属于一个且只能属于一个组。如果玩家可以属于多个组,则需要另一个表来表示这种关系:

Group:
 - group id (PRIMARY KEY)
 - name
 - owner
 - creation date

Player:
 - player id (PRIMARY KEY)
 - (any other player info you may need, like a name)

PlayerGroup:
 - player id (FOREIGN KEY)
 - group id (FOREIGN KEY)

这种设计现在是关系的规范化的。您可以通过查询(尤其是连接)获取原始设计(或接近它)中的数据。也许这解释得更好一点:https://www.ntu.edu.sg/home/ehchua/programming/sql/Relational_Database_Design.html

【讨论】:

  • 很好的例子!
  • 感谢您如此详尽的解释!我不知道我是否理解第二个关系如何使玩家能够加入多个组,我知道有 2 列 - 玩家 ID 和组 ID,但是您是否需要多次将玩家分配到该表才能有他在多个组?只是想看看我是否理解正确。
  • 因此,对于您的玩家所在的每个组,您将在 PlayerGroup 中添加一个条目(并且 PlayerGroup 中的每个条目都是唯一的 - 它是 group_id 和 player_id 的唯一对)。因此,如果您通过 group_id 查询 PlayerGroup,您将获得该组中所有玩家的列表,如果您通过 player_id 查询 PlayerGroup,您将获得该玩家所属的所有组的列表。
  • 好吧,这就是我的想法。非常感谢!你帮了很多忙!
  • 我认为@Cid 的意思是“这将确保一个玩家不会两次在同一个组中,因为组合是独一无二的”。
【解决方案2】:

如果可以重新设计数据库,我建议对其进行一些规范化,而不是将所有内容都存储在一个表中。例如,您可以: 玩家表,存储所有玩家(例如名字/姓氏、唯一 ID 等) 然后是一个存储组名称、所有者、创建日期和唯一组 ID 的组表。 最后是一个包含玩家和组链接的表格,用于存储每个玩家组关系的玩家 ID 和组 ID。

从这样的结构中,您可以通过 SQL(例如从 java)轻松获得所需的任何信息。 例如获取给定组的所有玩家:

select p.player_name from Player_table p
join Player_Group_table pg on p.player_ID = pg.player_ID
join Group_table g on pg.group_ID = g.group_ID
where g.group_name = 'Your Group Name'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 2017-04-21
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2020-03-11
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多