提问者:小点点

创建一组存储在SQL列中的播放机


有没有一种方法可以将一组播放器存储在SQL数据库的一个列中?

我有一个events表,我想在表中名为players的列下存储所有输入该事件的玩家。

进入者都将来自users表。

我找到了set属性,但这看起来需要指定set可以包含的特定值。我现在知道这些,但在将来,users表很可能会改变。

所以我想,

  • 事件表中添加一个列,名为玩家,该列包含一组用户
  • 该选项最初应为空,但当玩家进入该事件时,他们将被添加到集合中。
  • 从Java方面来看,当我从数据库读取数据时,它将获取事件并显示名称,然后显示玩家集中的所有用户。

我应该这样做吗?还是有更好的办法?即将事件中的用户存储在一个集合中,以某种方式将其存储在数据库中,然后在显示之前将这些数据读回Java的集合中?

我想我可以将users表中的id存储为外键,这样在该集合中,例如在玩家集合中有用户1、3、4、7。然后,当我得到这些数据时,我就可以在web应用程序中显示用户的名称。

谢谢


共1个答案

匿名用户

您有一个多值属性。即一个团队有球员,但在给定的团队中有多个球员。

但SQL自然希望每列在给定行中存储一个值。这使得通过创建一个新行来添加具有INSERT的成员或通过删除一个具有一行的DELETE的成员变得更加容易。

由于假设列存储一个值,外键约束不支持逗号分隔的列表。使用=将列与另一个值进行比较以进行搜索或联接的简单表达式也是如此。

您应该读一下我的答案:在数据库列中存储分隔列表真的那么糟糕吗?更多的例子。

相反,多值属性需要存储在第二个表的多行上。

CREATE TABLE players (
  event_id INT NOT NULL,
  user_id INT NOT NULL,
  PRIMARY KEY (event_id, user_id),
  FOREIGN KEY (event_id) REFERENCES events (id),
  FOREIGN KEY (user_id) REFERENCES users (id)
);

现在可以为给定事件添加许多用户。一个给定的用户可能会参加许多活动。插入播放机或移除播放机很容易。很容易计算出一个给定的事件有多少玩家,或者一个给定的用户打过多少个事件。和其他许多操作。

这比使用逗号分隔的列表要好得多。

如果您遵循关系数据库规范化的规则,这就是您所得到的表设计。