PHP / MYSQL:存储列表或大量表

时间:2012-06-06 20:37:12

标签: php mysql list

我还是PHP的新手,我想知道哪种选择会更好,或者有人可能会提出更好的方法。

我有一组用户,我必须跟踪他们与帖子的所有互动。如果用户点击按钮,它会将帖子添加到列表中,如果他们再次点击它,它会删除帖子,所以最好是:

为每个用户(可能是数千个)存储表中存储的postIDs的JSON数组列。

-OR -

每个保存(postID和userID的组合)(可能是数百万)都有一个单独的表,并返回userID匹配的所有结果?

出于这个问题的目的,有两个表:表A是用户,表B是帖子。我该如何存储所有用户保存的帖子?

编辑:抱歉,但我没有提到帖子会有多个用户互动,用户会有多个帖子互动(多对多关系)。我想这会影响鲍勃的回答。

3 个答案:

答案 0 :(得分:2)

这是一个有趣的问题!

解决方案实际上取决于您的预期用例。如果每个用户都有他们标记的帖子列表,并且这是您需要的所有信息,那么将这些列为用户表格中的字段(或者如果您使用的是nosql后端,则将其列在blob中)是有利的 - 如果这是你的用例,这是一个可行的选择!)。对传输时间没有影响,因为列表的大小都是相同的,但在这个解决方案中,您可能会节省查找时间,因为您只使用一个表,而dbs将进行优化以保持这些信息紧密相连。

另一方面,如果您必须能够为所有已标记它的用户查询给定帖子,那么选项二将更好。在前一种方法中,您必须查询所有用户并查看每个用户是否都有帖子。在此选项中,您只需找到所有关系并从那里开始工作。据推测,你有一个user表,一个post表和一个user_post表,前两个表有外键。还有其他方法可以做到这一点,但每次都需要维护多个列表和交叉检查,这是一组昂贵的操作并且容易出错。

请注意,后一个选项不应该阻塞'数百万'连接,因为db应该针对这种快速读取进行优化。 (专业提示:索引正确的列!)但是,请注意任何数据按摩。一个不必要的for循环会破坏你的表现。

答案 1 :(得分:2)

  

就本问题而言,有两个表:表A是用户,表B是帖子。我应该如何存储所有用户保存的帖子?

如果每个用户都有某种唯一ID(主键),则在每个帖子上添加一个字段,引用该用户的唯一ID。

mysql> describe users;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| email    | varchar(200)     | YES  |     | NULL    |                |
| username | varchar(20)      | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+

mysql> describe posts;
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| user    | int(11) unsigned | NO   |     | NULL    |                |
| text    | text             | YES  |     | NULL    |                |
+---------+------------------+------+-----+---------+----------------+

然后获取用户的帖子,例如:

SELECT text
 FROM posts
 WHERE user=5;

或者获取特定组织的所有帖子:

SELECT posts.text,users.username
 FROM posts,users
 WHERE post.user=users.id
   AND users.email LIKE '%@example.com';

答案 2 :(得分:0)

我认为将第三个表保留为所有发布状态数据是有意义的。

如果您的用户界面显示每页50个帖子,则UI只需要一次跟踪50个帖子。它们在数据库中都有唯一的ID,所以这不应该是个问题。