【问题标题】:Webapp: How to save user's "likes" properly?Webapp:如何正确保存用户的“喜欢”?
【发布时间】:2013-07-24 18:36:37
【问题描述】:

我正在开发一个新的网络应用程序,该应用程序允许用户“保存”他们喜欢的图片。我有一张有很多图片的大桌子,还有一张有用户信息的桌子。我的问题:如何保存每个用户“保存”的图片?我的意思是保存该信息的正确方法是什么。我想用用户 id 和图片 id 制作一个新表,但我认为它可能太乱了,将来查询需要很长时间。

非常感谢

【问题讨论】:

  • 没有。这正是你如何去做的。这就是关系数据库的用途。相关数据。
  • 谢谢!我不确定,因为我认为该表将包含很多寄存器,并且例如进行查询(检查一个用户所做的所有喜欢)将需要很长时间。
  • @user2615855:这里有适当的索引可以有效地检索数百万行。这也是短主键(如 INT)提高效率的地方。您关心性能是对的,但是具有其他每个表的外键的“关联”表正是您所需要的。添加“赞”或删除“赞”是一个非常简单的操作。该表上的主键可能是两个外键的组合,但如果您开始添加属性(例如 date_liked),您可能需要一个 ID 列作为 PK,而一个 UNIQUE on

标签: php mysql database web relation


【解决方案1】:

我只介绍一个关联表,而不是每个用户一个。

  • 一个“用户”可以“保存”零个、一个或多个“图片”
  • “图片”可以由零个、一个或多个“用户”保存

我们引入第三个表,称为“user_picture”或“picture_user”或“saved_picture”(它只是一个表名;但它应该对查看模型的人来说是“有意义的”。)

该表将有两个外键:

user_id     REFERENCES user(id)
picture_id  REFERENCES picture(id)

这两列的组合可以作为主键。

PRIMARY KEY (user_id, picture_id)

为用户获取保存的图片:

SELECT p.*
  FROM picture p
  JOIN saved_picture s
    ON s.picture_id = p.id
  JOIN user u
    ON u.id = s.user_id
 WHERE u.username = 'foo'

如果有合适的索引可用,从大表中选择一小部分行应该仍然非常有效。

这种设计可以很容易地回答一些问题,例如“哪些图片保存得‘最多’?”

SELECT s.picture_id
     , COUNT(1) AS save_count
  FROM saved_picture s
 GROUP BY s.picture_id
 ORDER BY COUNT(1) DESC

在非常大的表上,这可能需要一段时间,所以这就是使用简单、简短、代理主键真正有帮助的地方。

如果您为每个用户都有单独的“保存”表,则将此与回答同一问题所需的查询(或多个查询)进行比较;考虑需要查询的表的数量。

如果您开始向saved_picture 表添加属性(例如date_saved),您可以考虑在表上添加代理主键,并在 (user_id,picture_id) 上使用 UNIQUE 约束。

【讨论】:

    【解决方案2】:

    您可以按照您提到的方式制作表格,也可以为不同的用户创建不同的表格{这使您更容易显示每个用户保存的图像}

    您可以对<user_id>_savedimages 等表格使用某些命名法 例如,您可以为 id 为 21 的用户创建一个表 21_savedimages,这会使任务更快、更简洁,但这反过来会导致数据库中有大量表。

    您可以根据您拥有的用户数量和用户保存的平均图像数量来决定自己。

    【讨论】:

      猜你喜欢
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 2020-11-04
      • 1970-01-01
      • 2017-09-06
      相关资源
      最近更新 更多