3

我目前有一张桌子,上面有一个人的用户名、密码、电子邮件和物品(我的意思是你可以在游戏中收集的物品,也称为“库存”)。但是,如何在 items 列中添加多个项目?例如,如果我想在此处添加项目 A、B 和 C:

在此处输入图像描述

4

3 回答 3

13

您应该使用 2 个表来存储这些数据。

users: username | password | email
-------------------------
items: username | item

然后,您可以在第二个表中为给定用户名插入无限数量的项目(每个项目都是一条新记录)。

然后,您可以像这样为一个用户选择所有项目:

SELECT item FROM items WHERE username = ?

您还可以通过多种方式组合这两个表。

/* this one selects all users who have a specific item */
SELECT u.* FROM users u JOIN items i ON u.username = i.username WHERE i.item = ?

您希望如何使用这些数据?

您还应该开始使用 ID 值(数字),这样您就不必浪费空间重复基于文本的内容,例如用户名。


我认为这可能是一个非常好的方法,但是你能告诉我你所说的每一项都是新记录是什么意思吗?我还是有点困惑。

您可以像这样插入值:

insert into items values ('jonathan', 'hat');
insert into items values ('jonathan', 'drink');
insert into items values ('jonathan', 'mouse');
insert into items values ('user1981730', 'hat');
insert into items values ('user1981730', 'mouse');

这将导致:

然后您可以查询所有将饮料作为商品的用户:

SELECT u.* FROM users u JOIN items i ON u.username = i.username WHERE i.item = 'drink'

然后获取user1981730获得的所有项目的列表:

SELECT item FROM items WHERE username = 'user1981730'

一旦您对此感到满意,我们就可以讨论添加 ID 列。


ID 列是什么意思?

请注意,在上面的示例中,项目表有很多重复信息。用户名jonathan重复 3 次,项目hat重复两次。对于真正的数据库,情况会更糟。

我们可以通过使用整数 ID 来表示每个唯一值来节省空间并提高性能。每个用户都有一个 ID,每个唯一的项目也有一个 ID。

让我们从用户开始。我们必须将新列添加到 users 表中。

我们将其设置为PRIMARY KEY,这将确保所有值都是唯一的,因此没有 2 个用户可以拥有相同的 ID。我们还可以使用AUTO_INCREMENT让值随着每条新记录自动增加。

然后我们将更改我们的项目表,以便它使用新列而不是用户名。

请注意我们如何仍然拥有与以前相同的信息。ID 号 1 的用户拥有饮料、帽子和鼠标,ID 号 2 的用户拥有帽子和鼠标。

我们仍然可以像以前一样执行相同的查询(稍作改动)。

/* this selects all the items for a known user_id */
SELECT item FROM items WHERE user_id = ?

/* this selects all the items for a user when we only know the username */
SELECT i.item FROM items i JOIN users u ON u.user_id = i.item_id WHERE u.username = ?

/* this one selects all users who have a specific item */
SELECT u.* FROM users u JOIN items i ON u.user_id = i.user_id WHERE i.item = ?

到目前为止,我们只修改了表格以避免重复用户名。如果我们还想避免重复项目名称,我们可以添加一个额外的表。这开始变得棘手,所以我不会(现在)详细介绍,但表结构如下:

users: username | password | email
-------------------------------
items: item_id | name
-------------------------------
users_items: user_id | item_id

users表和以前一样。items表有一个新角色,它存储所有唯一项目。users_items表现在链接其他 2 个表。


我将在这里结束 SO 答案。如果您有任何其他问题,可以通过上面列出的地址(示例表中使用的地址)给我发送电子邮件。

于 2013-02-02T20:13:51.780 回答
1

在单独的表格中为每个项目创建一行。

INSERT INTO items (userid, item) VALUES
(1, 'item number 1'),
(1, 'item number 2'),
(1, 'item number 3');

不要将所有项目放在用户表中的一行中。JSON、逗号分隔值和其他技术可能听起来很诱人,但它们并不是真正的解决方案。如果您在专门用于跟踪它们的表中的每个项目都有一行,那么您的 SQL 和逻辑将更加简单和清晰。

于 2013-02-02T20:09:02.763 回答
0

你有几个选择。要么(如果用例足够简单),只需编码多个值,例如,用逗号分隔。

但是,干净的方法是使用另一个表,您在其中为每个项目创建一个条目,并有一个指向您的第一个表的外键。

于 2013-02-02T20:09:29.267 回答