我正在开发一个新的网络应用程序,允许用户“保存”他们喜欢的图片。我有一张有很多图片的大桌子,还有一张有用户信息的桌子。我的问题:如何保存每个用户“保存”的图片?我的意思是保存该信息的正确方法是什么。我想用用户 ID 和图片 ID 创建一个新表,但我认为它可能太乱了,将来查询需要很长时间。
非常感谢你
我只会介绍一个关联表,而不是每个用户一个。
我们引入了第三个表,称之为“user_picture”或“picture_user”或“saved_picture”(它只是一个表名;但它应该对查看模型的人来说是“有意义的”。)
该表将有两个外键:
user_id REFERENCES user(id)
picture_id REFERENCES picture(id)
这两列的组合可以作为 PRIMARY KEY。
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 约束。
您可以做任何事情,您可以按照您提到的方式制作表格,也可以为不同的用户创建不同的表格{这使您更容易显示每个用户保存的图像}
您可以对表使用某些命名法,<user_id>_savedimages
例如,您可以21_savedimages
为具有 id 的用户创建一个表,21
这使任务更快、更简洁,但这反过来又会导致数据库中有很多表。
您可以根据您拥有的用户数量和用户保存的平均图像数量来决定自己。