MYSQL中是否有字段中的数组替代?

时间:2016-11-26 11:01:01

标签: mysql

我有2个表,即userinfo和newsinfo。每个用户都可以根据需要添加/删除任何新闻Feed。因此,任何时候,新闻只会发送给仅订阅每个新闻提供商的人。随着时间的推移,表userinfo中的用户和表newsinfo中的新闻提供者将被添加或删除。我使用php作为前端。

表:userinfo

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

表:newsinfo

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

目前我所做的是在userinfo.channel_list中使用数组来存储订阅的新闻频道。

有没有更好的方法来实现这个而不在字段中使用数组?

1 个答案:

答案 0 :(得分: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     |
                                             +--------+----------+

现在,您可以删除表channel_list上的列userinfo并将其转换为新表。

  

注意:不应使用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