2017-02-25 14 views
1

私はWebベースのアプリケーションのデータベース設計に取り組んでいます。 MongoDBの経験はありますが、MySQLの経験はありません。リストを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

ユーザーが複数のプロジェクトで作業できる場合は、質問に答えてください:http://stackoverflow.com/questions/2923809/many-to-many-relationships-examples –

答えて

0

id、project_id、user_idを使用して、多対多リレーションシップを作成します。 または、ユーザーを昏睡区切りの文字列として保存し、コードの変更内容を処理します。

1

mongodbからmysqlへの移行では、アプリケーションの設計時にmongodbの柔軟性が失われます。 正規化について知ることができるthis bookをお勧めします。


あなたの例では、(ユーザーが多くのプロジェクトで動作します)この多くに多くの(ユーザーはただ一つのプロジェクトに取り組んでいます)、あるいは多くの1つの関係場合についての十分な情報を与えるものではありません。ユーザーの識別子として「userA」、「userB」などを使用すると、私はこう言っています:

1対多。 - ユーザー(Poject_Id)参照プロジェクト(同上)

が、私は念のためにid属性でvarchar型を使用

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 |  | 
+------------+-------------+------+-----+---------+-------+ 

これを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の代わりにプロジェクトの識別子を使用してのためにMany.-するために、多くの

ユーザーテーブルを作成する場合は、両方のテーブルのプライマリキー(project.Idとusers.Id)、a属性のタプルをこのテーブルのpkにします。

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 |  | 
+------------+-------------+------+-----+---------+-------+ 


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)); 
繰り返しますが、これを照会する1つの方法を選択します。

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のクエリとは全く異なっています。私はこの説明で私の自己を明確にしたいと思う。

関連する問題