有没有一种方法可以将一组播放器存储在SQL数据库的一个列中?
我有一个events表,我想在表中名为players
的列下存储所有输入该事件的玩家。
进入者都将来自users
表。
我找到了set属性,但这看起来需要指定set可以包含的特定值。我现在知道这些,但在将来,users
表很可能会改变。
所以我想,
事件
表中添加一个列,名为玩家
,该列包含一组用户
玩家
集中的所有用户。我应该这样做吗?还是有更好的办法?即将事件中的用户存储在一个集合中,以某种方式将其存储在数据库中,然后在显示之前将这些数据读回Java的集合中?
我想我可以将users
表中的id
存储为外键,这样在该集合中,例如在玩家集合中有用户1、3、4、7。然后,当我得到这些数据时,我就可以在web应用程序中显示用户的名称。
谢谢
您有一个多值属性。即一个团队有球员,但在给定的团队中有多个球员。
但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)
);
现在可以为给定事件添加许多用户。一个给定的用户可能会参加许多活动。插入播放机或移除播放机很容易。很容易计算出一个给定的事件有多少玩家,或者一个给定的用户打过多少个事件。和其他许多操作。
这比使用逗号分隔的列表要好得多。
如果您遵循关系数据库规范化的规则,这就是您所得到的表设计。