首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MySQL中使用list

如何在MySQL中使用list
EN

Stack Overflow用户
提问于 2017-02-25 00:57:19
回答 2查看 368关注 0票数 1

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

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

MongoDB中,我可以这样做:

代码语言:javascript
复制
{
 A :{
     ID : 01,
     NAME : A,
     TYPE : T1,
     USERS : [userA, UserB, UserC]
    }
}

我不知道如何在MySQL中这样做。

代码语言:javascript
复制
ID  |  NAME |  TYPE  |  USERS
01      A       T1       ?          (userA, UserB, UserC)
02      B       T2       ?          (userX, UserY, UserZ)

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

EN

回答 2

Stack Overflow用户

发布于 2017-03-05 23:57:02

在从mongodb到mysql的转换过程中,您将在设计应用程序时忽略mongodb的灵活性。我可以推荐您看看这本书,在那里您可以了解到规范化。

您的示例没有提供足够的信息,说明这是一对多的关系(用户只在一个项目上工作)还是多对多的关系(用户在许多项目中工作)。使用"userA“、"userB”等作为用户标识符,我会在我说过的两种方法中都这样做:

一对多。-

代码语言:javascript
复制
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));
代码语言:javascript
复制
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中查询这个问题?从下面选一个

代码语言:javascript
复制
 select p.Id, Name, Type, u.Id as Users from projects as p JOIN users as u  on p.Id=u.Project_Id;

代码语言:javascript
复制
 select p.Id, Name, Type, u.Id as Users from projects as p, users as u  where p.Id=u.Project_Id;

相同结果

代码语言:javascript
复制
+----+-------+-------+-------+
| 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。

代码语言:javascript
复制
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));
代码语言:javascript
复制
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    |       |
+------------+-------------+------+-----+---------+-------+

同样,选择一种方式来查询这个问题。

代码语言:javascript
复制
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;

和结果

代码语言:javascript
复制
+----+-------+-------+-------+
| 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
EN

Stack Overflow用户

发布于 2017-02-25 01:05:28

创建多到多的关系,表project_user具有id、project_id、user_id。或者将用户保存为昏迷分隔字符串,并处理要在代码中列出的更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42450677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档