在 Mysql 中存储列表

Storing List in Mysql

我想在 Mysql 中存储我的 Python 程序的用户信息。 我要存储的其中一件事是用户名历史记录(静态列表) 另一个是他们属于哪些组(动态列表)

我不熟悉在 Mysql 中存储数据,所以我想找出实现此目的的最佳结构。似乎我可以为每个用户创建 1 table 并将名称 hsitory 作为一列,但我读到的所有内容都告诉我这将是浪费和低效的。

例如……

Table = 用户

user_ID | current_username | username_history | groups_joined | groups_banned
========|==================|==================|===============|==============
01567   | Dave             |Michael,Geoff,    |group1,group2, |group4,group5
        |                  |Bob,Nigel,Colin   |group2         |group5,group7
========|==================|==================|===============|==============
01568   | Fred             |Martin,Simon,     |group3,group4, |group4,group3
        |                  |Leo,Nick,Arthur   |group6         |group2,group12

我的第一个想法是做类似上面的事情,当我有一个像 username_history 这样的列表要存储时,我会将列表转换为一个用逗号分隔值的字符串,并将其存储在 LONGTEXT 字段中,如图所示.然后在用户更改用户名时添加用户名,我可以使用 concat 添加到字符串中。

我想这会奏效,但感觉很难看,我相信一定有更好的方法。另外我认为如果我需要在用户名历史中搜索一个名字,例如找出所有名为 Fred 的用户,这将是非常低效的。

我的下一个想法是为每个用户创建一个完整的 table 并为每个字段填充一个名称 username_column。 但是谷歌搜索我发现了来自数据库新手的类似问题,所有回复都说这将创建数千个 tables 并且效率非常低。

好的,现在我正在查看关系 tables(正确的术语??)...

table = username_history

user_id | usernames
========|==========
01567   | but I still need a list here....

我敢肯定这对初学者来说是一个非常普遍的问题,但我似乎无法理解我的用法结构会是什么样子。

感谢所有花时间提供帮助和建议的人:)

创建 table username_history 具有:

create table username_history (
id int not null auto_increment,
user_id varchar(10),
username varchar(30),
created_at datetime default CURRENT_TIMESTAMP,
primary key (`id`),
index (user_id)
);

然后您可以使用 GROUP_CONCAT-function.

以列表格式获取用户名

你真的需要三个 table:

  • 群组
  • 用户
  • 用户组

第一个包含用户可以加入的组列表。它可以像唯一 ID 和组名一样简单。

第二个table与问题中的table相似。为此,我们唯一关心的列是每个用户的唯一 ID 及其用户名。

第三个 table 有两列:user_id 和 group_id。当用户加入组时,会在 table 中插入一行,其中包含用户和组的唯一 ID。

您还可以有一个列,其中包含添加行时的时间戳,以及一个用于用户状态的列(如果需要)。

时间戳列会让您知道用户何时加入群组。

状态列可以指示用户是否被群组禁止,或者用户是否离开了群组。