我有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中使用数组来存储订阅的新闻频道。
有没有更好的方法来实现这个而不在字段中使用数组?
答案 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