我正在为基于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中,我希望为每个项目分配用户列表。
发布于 2017-03-05 23:57:02
在从mongodb到mysql的转换过程中,您将在设计应用程序时忽略mongodb的灵活性。我可以推荐您看看这本书,在那里您可以了解到规范化。
您的示例没有提供足够的信息,说明这是一对多的关系(用户只在一个项目上工作)还是多对多的关系(用户在许多项目中工作)。使用"userA“、"userB”等作为用户标识符,我会在我说过的两种方法中都这样做:
一对多。-
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上的查询非常不同。我希望我用这个解释来说明我自己。
发布于 2017-02-25 01:05:28
创建多到多的关系,表project_user具有id、project_id、user_id。或者将用户保存为昏迷分隔字符串,并处理要在代码中列出的更改。
https://stackoverflow.com/questions/42450677
复制相似问题