2016-11-26 16 views
1

私はuserinfoとnewsinfoという2つのテーブルを持っています。各ユーザーは希望どおりにニュースフィードを追加/削除できます。したがって、いつでも、ニュースは各ニュース提供者にのみ購読している人にのみ配信されます。 newsinfoテーブル内のユーザおよびテーブルのユーザは、時間の経過とともに追加または削除されます。私はフロントエンドとしてPHPを使用しています。MYSQLのフィールドに配列の代わりがありますか?

表:

+---------------+-----------------+--------------------+ 
| index  |  name  | channel_list | 
+---------------+-----------------+--------------------+ 
|  0  |  aaaa  |  0,1   | 
|  1  |  bbbb  |  0,1,2,3  | 
|  2  |  cccc  |  3,4   | 
+---------------+-----------------+--------------------+ 

表のUserInfo:

+---------------+-----------------+ 
| channel |  provider | 
+---------------+-----------------+ 
|  0  |  cnn  | 
|  1  |  bbc  | 
|  2  |  fox  | 
|  3  |  rtl  | 
+---------------+-----------------+ 

newsinfo現在、私がやったことは加入ニュースチャンネルを保存するためにuserinfo.channel_listで配列を使用することでした。

これを実現する方法はありますか?

答えて

3

次の追加のテーブルと多対多の関係(userinfo_newsinfo)を作成します。

+-------+------+ +---------+-------------+ +-------------------+ 
| index | name | | channel | provider | | userinfo_newsinfo | 
+-------+------+ +---------+-------------+ +--------+----------+ 
| 0 | aaaa | | 0  | cnn  | | index | channel | 
| 1 | bbbb | | 1  | bbc  | +--------+----------+ 
| 2 | cccc | | 2  | fox  | | 0  | 0  | 
+-------+------+ | 3  | rtl  | | 0  | 1  | 
        +---------+-------------+ | 1  | 0  | 
              | 1  | 1  | 
              | 1  | 2  | 
              | 1  | 3  | 
              | 2  | 3  | 
              | 2  | 4  | 
              +--------+----------+ 

今、あなたは、テーブルuserinfoカラムchannel_listを削除し、新しいテーブルにそれを翻訳することができます。

注:channel_listのような列は使用すべきではありません!正規化を使用してデータベース構造をチェックし、改善してください。新しいテーブルuserinfo_newsinfoは、正規化を考慮してデータベース構造を改善します。あなたは次のクエリを行うことができ、ユーザのすべてのチャンネルを選択するには

CREATE TABLE userinfo_newsinfo (
    `index` INT NOT NULL, 
    `channel` INT NOT NULL, 
    FOREIGN KEY (`index`) REFERENCES userinfo(`index`), 
    FOREIGN KEY (`channel`) REFERENCES newsinfo(`channel`) 
); 

:あなたは、次のSQLを使用することができます。この新しいテーブルを作成するには

SELECT newsinfo.provider 
FROM userinfo u 
    INNER JOIN userinfo_newsinfo un ON u.index = un.index 
    INNER JOIN newsinfo n ON n.channel = un.channel 
WHERE u.index = 0 
+0

感謝あなたは答えを求めます。 –

関連する問題