php - MySQLi 订阅列表表

标签 php mysql sql mysqli

我有一个名为users 的表和一个名为pages 的表。系统的用户可以订阅页面并接收有关该页面的更新。我的问题是用户和页面将动态更新(即无需对表进行手动干预),并且我不想在每次有人订阅该页面时继续添加另一列。

如何动态更新用户表和页面表以反射(reflect)他们已订阅该页面?

我的想法是将逗号分隔的用户名数组添加到页面表中,并在用户订阅/取消订阅时更新它们。

最佳答案

只是将其作为官方答案:

虽然最初的预感可能是使用逗号分隔值来表示这两个表之间的链接(或将数据保存在一列中的任何其他方式,例如保存 json 字符串),但这实际上是不好的做法,因为它不符合第一范式(绝对不是第二范式和第三范式)。

First Normal Form - Wikipedia

第一范式表示您不应在 1 个表格单元格中存储超过 1 个值。

简而言之,当您需要使用该数据时,问题就开始了,这实际上至少需要您执行 2 个操作 - 1 是从数据库中读取数据,2 是在语言脚本中解析它。想象一下,当您需要使用该数据从数据库读取其他一些数据时会发生什么 - 您进行的 SQL 查询比您需要的要多,并且至少花费了两倍的时间(+资源)。当您需要使用 JOIN 查询或具有其他一对多数据关系时,它会变得更加复杂。

解决方案很简单 - 您需要创建第三个表作为中间表。 您可以将其称为 users_pagesuser2pages,它表示 1 个用户和多个页面之间的一对多关系。 表的结构很简单:

users_pages
-----------
-- id // a unique id for the relationship, can be auto generated
-- user_id // the user id
-- page_id // the page id
-----------

这使您可以构建更强大的应用程序以及运行高级查询和计算,而无需解析脚本中的数据(即计算每个用户订阅的页面数量,或订阅 1 个页面的用户数量) )。

通过这种方式取消订阅也可以更容易,因为您根本不需要读取用户或页面表。您只需从 users_pages 表中删除该关系即可。 如果没有它,您将需要(a)首先读取用户表(b)获取以逗号分隔的页面数据(c)解析数据并从中删除特定页面(d)再次将新数据保存到数据库中。这是 4 个操作和 2 个 SQL 查询...

希望这会有所帮助!

关于php - MySQLi 订阅列表表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25713375/

相关文章:

php - 根据参数值 Yii 重写路由

mysql - mongoDB 和 MySQL 中的产品/类别管理

mysql - 无法获得 JOIN 工作

sql - 查找期间(月)范围内涵盖的年份百分比?

php - 对于 DB、php 和 html 显示,哪种日语字符编码最好?

PHP 表单去除换行符

php - 如何移动 Composer?

mysql - 我无法使用 fxml 填充 Javafx TableView

SQL 服务器 : how to split a string using a comma as a separator

sql - GROUP BY 和 COUNT 使用 ActiveRecord