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

PHP/MYSQL:存储列表或海量表,php,mysql,list,Php,Mysql,List,我对PHP还是新手,我想知道哪种方法更好,或者也许有人可以建议一种更好的方法 我有一组用户,我必须跟踪他们与帖子的所有互动。如果用户点击一个按钮,它将把帖子添加到列表中,如果他们再次点击,它将删除帖子,那么最好: 在表中为每个用户存储一列JSON POSTID数组 -或- 有一个单独的表,其中包含postID和userID的每个保存组合,并返回与userID匹配的所有结果 就本问题而言,有两个表:表A为用户,表B为帖子。我应该如何存储用户保存的所有帖子 编辑:抱歉,但我没有提到帖子将有多个用户交

我对PHP还是新手,我想知道哪种方法更好,或者也许有人可以建议一种更好的方法

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

在表中为每个用户存储一列JSON POSTID数组

-或-

有一个单独的表,其中包含postID和userID的每个保存组合,并返回与userID匹配的所有结果

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


编辑:抱歉,但我没有提到帖子将有多个用户交互,用户将有多个帖子交互多对多关系。我认为这会影响Bob的回答。

我认为保留第三个表是有意义的,它将是所有post状态数据


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

我认为保留第三个表是有意义的,它将是所有post状态数据


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

这是一个有趣的问题

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

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


请注意,后一个选项不应该阻塞“数百万”个连接,因为db应该针对这种快速读取进行优化。专业提示:索引正确的列!不过,对任何数据按摩都要小心。一个不必要的for循环将破坏您的性能。

这是一个有趣的问题

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

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

请注意,后一个选项不应该阻塞“数百万”个连接,因为db应该针对这种快速读取进行优化。专业提示:索引正确的列!不过,对任何数据按摩都要小心。一个不必要的for循环将破坏您的性能

就本问题而言,有两个表:表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';
就本问题而言,有 两个表:表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';


用户表中有userID主键、用户名和其他要存储的用户信息。Post的表将有一个postID主键和一个来自用户表userID的外键,以及消息内容。这样你就可以跟踪用户发布的所有消息。你能告诉我们你使用的代码吗?即数据库结构?如果我们可以根据这些内容而不是松散的描述来建议,那就容易多了。@Bob:我认为你应该将你的评论作为答案发布。对不起,我没有提到帖子会有多个用户交互,用户会有多个帖子交互多对多关系。我认为这会影响Bob的回答。用户表中有userID主键、用户名和其他您想要存储的关于用户的信息。Post的表将有一个postID主键和一个来自用户表userID的外键,以及消息内容。这样你就可以跟踪用户发布的所有消息。你能告诉我们你使用的代码吗?即数据库结构?如果我们可以根据这些内容而不是松散的描述来建议,那就容易多了。@Bob:我认为你应该将你的评论作为答案发布。对不起,我没有提到帖子会有多个用户交互,用户会有多个帖子交互多对多关系。我想这会影响鲍勃的回答。谢谢你的回答。我总是被告知列表不应该存储在表中。我把重点放在你的第一段,因为这是我的需要。因此,让JSON数据作为每个用户的列/值,以一个POSTID编码数组作为一个列/值,要比拥有一个单独的POSTID和USERID组合表要好得多?同样,“更好”取决于您的用例。如果数据不需要是关系型的,那么将其存储为一个可以在代码中轻松操作的列表更具可伸缩性。数据库所需的工作更少。但请确保这是您的用例!嗯,好吧,这是好是坏。很好,我的问题已经得到了回答。糟糕的是,我根据一个不同的答案构建了第三个表,其中存储了userID和postIDs query userID的组合,以获取用户的所有标记帖子,但我不需要它是关系型/多方向的。如果您正确地处理数据库,关系映射不应该真正影响您,除非您扩展到仅拥有一台数据库服务器的范围之外。当然,这可能会更快,但不要为此操心!谢谢你的回答。我总是被告知列表不应该存储在表中。我把重点放在你的第一段,因为这是我的需要。因此,让JSON数据作为每个用户的列/值,以一个POSTID编码数组作为一个列/值,要比拥有一个单独的POSTID和USERID组合表要好得多?同样,“更好”取决于您的用例。如果数据不需要是关系型的,那么将其存储为一个可以在代码中轻松操作的列表更具可伸缩性。数据库所需的工作更少。但请确保这是您的用例!嗯,好吧,这是好是坏。很好,我的问题已经得到了回答。糟糕的是,我根据一个不同的答案构建了第三个表,其中存储了userID和postIDs query userID的组合,以获取用户的所有标记帖子,但我不需要它是关系型/多方向的。如果您正确地处理数据库,关系映射不应该真正影响您,除非您扩展到仅拥有一台数据库服务器的范围之外。当然,这可能会更快,但不要为此操心!你好这不是用户创建帖子的地方,而是用户标记帖子的地方。因此,每个用户都可以标记一篇文章。那么用户保存的文章是什么?它们毕竟不是用户的,只是用户表示感兴趣的帖子?能否有多个用户对同一帖子表示兴趣?一个用户可以对多个帖子表达兴趣吗?我收集这些问题的答案现在不重要了,因为你已经从这些答案中选择了一个获胜者。嗨。这不是用户创建帖子的地方,而是用户标记帖子的地方。因此,每个用户都可以标记一篇文章。那么用户保存的文章是什么?它们毕竟不是用户的,只是用户表示感兴趣的帖子?能否有多个用户对同一帖子表示兴趣?一个用户可以对多个帖子表达兴趣吗?我收集这些问题的答案现在不重要了,因为您已经从这些答案中选择了一个获胜者。