我还是PHP的新手,我想知道哪种选择会更好,或者有人可能会提出更好的方法。
我有一组用户,我必须跟踪他们与帖子的所有互动。如果用户点击按钮,它会将帖子添加到列表中,如果他们再次点击它,它会删除帖子,所以最好是:
为每个用户(可能是数千个)存储表中存储的postIDs的JSON数组列。
-OR -
每个保存(postID和userID的组合)(可能是数百万)都有一个单独的表,并返回userID匹配的所有结果?
出于这个问题的目的,有两个表:表A是用户,表B是帖子。我该如何存储所有用户保存的帖子?
编辑:抱歉,但我没有提到帖子会有多个用户互动,用户会有多个帖子互动(多对多关系)。我想这会影响鲍勃的回答。答案 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,所以这不应该是个问题。