我正在为基于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中,我想为每个项目分配用户列表。
答案 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。 或者将用户保存为逗号分隔字符串,并处理代码中列表的更改。