2

我还是 PHP 新手,我想知道哪个替代方案会更好,或者有人可以提出更好的方法。

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

为每个用户(可能有数千个)在表中存储一列 JSON 数组 postID。

-或者-

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

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

编辑:对不起,但我没有提到帖子将有多个用户交互并且用户将有多个帖子交互(多对多关系)。我认为这会影响鲍勃的回答。

4

3 回答 3

2

这是个有趣的问题!

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

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

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

于 2012-06-06T21:19:45.970 回答
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';
于 2012-06-06T21:29:20.030 回答
0

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

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

于 2012-06-06T20:41:37.120 回答