页面订阅的表模式

时间:2013-10-14 17:16:36

标签: mysql database-schema

我有一个类似于页面订阅的应用程序,用户可以在其中订阅页面。查看页面时,我想显示订阅该页面的用户数和用户列表。

当有人查看用户的个人资料时,应该会显示用户所属的所有网页。

我想到的是:

Page
    id
    users (JSON format containing userIDs of all subscribed)

User
    id
    page_IDs (JSON format containing the IDs of the walls he is subscribed to)

我想这对于非常小规模的应用程序是可以的。但是当网站增长并且每个页面有超过1000个订阅者时,将所有JSON数据解码为PHP中的数组根本不是一个好主意。

任何人都考虑过更好的架构?

非常感谢!

1 个答案:

答案 0 :(得分:0)

你的设计不是很好。这实际上有点糟糕。原则上,目标是建立一个满足至少 first normal form的模式。

您处于这样的情况:页面可以有多个用户订阅它,并且用户可以订阅多个页面。因此,在表users和表pages之间存在多对多关系。

在这些情况下,最好的解决方案是使用第三个表来建立两者之间的连接。通常这个表只包含2列:

  • 第1列包含表1 a.k.a.外键
  • 中的主键
  • 第2列包含表2 a.k.a.外键
  • 中的主键

这有例外,但一般来说,这就是你如何设计/规范这样的事情。

更具针对您的情况:

pages
-------------------------
page_id
<other columns>
PRIMARY KEY(page_id)

users
-------------------------
user_id
<other columns>
PRIMARY KEY(page_id)

subscriptions
-------------------------
page_id
user_id
PRIMARY KEY(page_id,user_id)