在MySQL中存储列表

时间:2019-07-15 22:26:21

标签: mysql mariadb pymysql

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

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

例如。...

表=用户

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的用户,这将是非常低效的。

我的下一个想法是为每个用户创建一个整个表,并在每个字段中用一个名称填充username_column。 但是在谷歌上搜索时,我发现数据库新手也有类似的问题,所有答复都说这会创建成千上万张表,效率很低。

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

表= username_history

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

我确定这对于初学者来说是一个非常普遍的问题,但是我似乎无法理解我的用法的结构。

感谢任何花时间帮助和建议的人:)

2 个答案:

答案 0 :(得分:1)

使用以下方法创建表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函数以列表格式获取用户名。

答案 1 :(得分:1)

您确实需要三个表:

  • 用户
  • 用户组

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

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

第三个表有两列:user_id和group_id。当用户加入组时,会将具有用户和组的唯一ID的行插入到该表中。

如果需要,您还可以有一列带有添加行的时间戳记的列,以及一列用于显示用户状态的列。

“时间戳记”列会告诉您用户何时加入群组。

状态列可能指示用户是否被禁止进入该组,或者该用户是否离开了该组。