我有一个名为users
的表和一个名为pages
的表。系统的用户可以订阅页面并接收有关该页面的更新。我的问题是用户和页面将动态更新(即无需对表进行手动干预),并且我不想在每次有人订阅该页面时继续添加另一列。
如何动态更新用户表和页面表以反射(reflect)他们已订阅该页面?
我的想法是将逗号分隔的用户名数组添加到页面表中,并在用户订阅/取消订阅时更新它们。
最佳答案
只是将其作为官方答案:
虽然最初的预感可能是使用逗号分隔值来表示这两个表之间的链接(或将数据保存在一列中的任何其他方式,例如保存 json 字符串),但这实际上是不好的做法,因为它不符合第一范式(绝对不是第二范式和第三范式)。
第一范式表示您不应在 1 个表格单元格中存储超过 1 个值。
简而言之,当您需要使用该数据时,问题就开始了,这实际上至少需要您执行 2 个操作 - 1 是从数据库中读取数据,2 是在语言脚本中解析它。想象一下,当您需要使用该数据从数据库读取其他一些数据时会发生什么 - 您进行的 SQL 查询比您需要的要多,并且至少花费了两倍的时间(+资源)。当您需要使用 JOIN 查询或具有其他一对多数据关系时,它会变得更加复杂。
解决方案很简单 - 您需要创建第三个表作为中间表。
您可以将其称为 users_pages
或 user2pages
,它表示 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/