如何在MySQL中使用列表

时间:2017-02-25 00:57:20

标签: mysql sql mongodb

我正在为基于Web的应用程序进行数据库设计。 我有一些MongoDB的经验,但没有MySQL的经验。

我想将项目信息存储在数据库中,并包含项目用户列表。

MongoDB 中我可以这样做:

{
 A :{
     ID : 01,
     NAME : A,
     TYPE : T1,
     USERS : [userA, UserB, UserC]
    }
}

我不知道如何在 MySQL 中执行此操作。

ID  |  NAME |  TYPE  |  USERS
01      A       T1       ?          (userA, UserB, UserC)
02      B       T2       ?          (userX, UserY, UserZ)

现在在MYSQL中,我想为每个项目分配用户列表。

2 个答案:

答案 0 :(得分:1)

在从mongodb到mysql的过渡中,在设计应用程序时,你会错过mongodb的灵活性。 我建议您查看this book,了解规范化。

您的示例没有提供足够的信息,表明这是一对多的关系(用户只在一个项目上工作)还是多对多(用户在许多项目中工作)。使用" userA"," userB"等作为用户的标识符我会对我说的两个approches执行此操作:

1对多。 -

create table projects(Id integer PRIMARY KEY,  Name varchar(20), Type varchar(20));
create table users (Id varchar(20) PRIMARY KEY, Project_Id integer, FOREIGN KEY fk_proj(Project_Id)  REFERENCES projects(Id));
mysql> describe projects;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| Id    | int(11)     | NO   | PRI | NULL    |       |
| Name  | varchar(20) | YES  |     | NULL    |       |
| Type  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
mysql> describe users;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| Id         | varchar(20) | NO   | PRI | NULL    |       |
| Project_Id | int(11)     | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

用户(Poject_Id)引用项目(Id)

我在id属性中只使用了varchar。

如何在MySQL中查询? 从下面选择一个

 select p.Id, Name, Type, u.Id as Users from projects as p JOIN users as u  on p.Id=u.Project_Id;

或者

 select p.Id, Name, Type, u.Id as Users from projects as p, users as u  where p.Id=u.Project_Id;

相同的结果

+----+-------+-------+-------+
| Id | Name  | Type  | Users |
+----+-------+-------+-------+
|  1 | ProjA | TypeA | UserA |
|  1 | ProjA | TypeA | UserB |
|  1 | ProjA | TypeA | UserC |
|  2 | ProjB | TypeB | Userx |
|  2 | ProjB | TypeB | UserY |
|  2 | ProjB | TypeB | UserZ |
+----+-------+-------+-------+

多对多.-对于M到M的关系,而不是在users表中使用项目标识符,您将创建一个单独的表,同时包含两个表主键(project.Id和users.Id),并创建该元组属性表该表的pk。

create table projects(Id integer PRIMARY KEY,  Name varchar(20), Type varchar(20));
create table users (Id varchar(20) PRIMARY KEY);
create table projects_users(Id_Project integer not null, Id_User varchar(11) not null, PRIMARY KEY pk_projects_users(Id_Project, Id_User));
mysql> describe projects;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| Id    | int(11)     | NO   | PRI | NULL    |       |
| Name  | varchar(20) | YES  |     | NULL    |       |
| Type  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
mysql> describe users;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| Id    | varchar(20) | NO   | PRI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
mysql> describe projects_users;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| Id_Project | int(11)     | NO   | PRI | NULL    |       |
| Id_User    | varchar(11) | NO   | PRI | NULL    |       |
+------------+-------------+------+-----+---------+-------+

再次,选择一种方式来查询。

SELECT p.Id, Name, Type, pu.Id_User as User FROM projects as p join projects_users as pu ON p.Id=pu.Id_Project;
SELECT p.Id, Name, Type, pu.Id_User as User FROM projects as p, projects_users as pu WHERE p.Id=pu.Id_Project;

结果

+----+-------+-------+-------+
| Id | Name  | Type  | User  |
+----+-------+-------+-------+
|  1 | ProjA | TypeA | UserA |
|  1 | ProjA | TypeA | UserB |
|  1 | ProjA | TypeA | UserC |
|  1 | ProjA | TypeA | UserY |
|  2 | ProjA | TypeA | Userx |
|  2 | ProjA | TypeA | UserY |
|  2 | ProjA | TypeA | UserZ |
+----+-------+-------+-------+

正如您所看到的,mysql上的查询与mongodb上的查询完全不同。我希望通过这种解释让我清楚自己。

答案 1 :(得分:0)

创建多对多关系,表project_user,id,project_id,user_id。 或者将用户保存为逗号分隔字符串,并处理代码中列表的更改。