2016-11-26 38 views
1

我有2個表,即userinfo和newsinfo。每個用戶可以根據需要添加/刪除任何新聞源。所以在任何時候,新聞只會傳遞給那些只訂閱每個新聞提供者的人。隨着時間的推移,tableinfoinfo和newsinfo中的新聞提供者中的用戶將被添加或刪除。我使用PHP作爲前端。在MYSQL中有沒有替代字段的數組?

表:用戶信息

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

表:報紙資訊

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

目前我所做的就是用數組中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通過考慮規範化來改進數據庫結構。

要創建這個,你可以使用下面的SQL新表:

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

要選擇你可以做下面的查詢用戶的所有通道:

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

謝謝你的答案。 –