在数据库网站上问这个问题,但它看起来真的很慢。所以我一般都是SQL和数据库的新手,我唯一使用过的SQL数据库使用了一对多的关系。我想知道最简单的方法来实现一个"收藏夹"我的数据库中的用户机制 - 类似于Youtube等网站提供的内容。用户当然是独一无二的,因此一个用户可以拥有许多收藏夹,但是一个项目也可以被许多用户收藏。这被认为是多对多关系吗?这样做的典型设计模式是什么?许多关系看起来很头疼(我使用SQLAlchemy,所以我的表与类似的对象进行交互)但这似乎是网站上相当常见的功能,所以我想知道什么是最简单易行的方法关于它。感谢
答案 0 :(得分:4)
是的,这是一种经典的多对多关系。通常,处理它的方法是创建一个链接表,所以比如T-SQL你有......
create table user
(
user_id int identity primary key,
-- other user columns
)
create table item
(
item_id int identity primary key,
-- other item columns
)
create table userfavoriteitem
(
user_id int foreign key references user(user_id),
item_id int foreign key references item(item_id),
-- other information about favoriting you want to capture
)
要查看谁喜欢什么,您需要做的就是在userfavoriteitem
表格上运行一个查询,该查询现在将成为各种有用数据的数据,这些数据是关于哪些项目受欢迎以及谁喜欢它们。“ / p>
select ufi.item_id,
from userfavoriteitem ufi
where ufi.user_id = [id]
或者你甚至可以使用下面的查询获得你网站上最受欢迎的项目,但是如果你有很多用户,这将变慢,结果应该保存在由日程安排工作更新的特殊表格中。每隔一段时间后端...
select top 10 ufi.item_id, count(ufi.item_id),
from userfavoriteitem ufi
where ufi.item_id = [id]
GROUP BY ufi.item_id
答案 1 :(得分:0)
我从来没有见过任何明确的数据库设计模式(除了几年前它成为流行时“设计模式”这几句的一些琐碎的滥用)。
M:M关系没问题:使用链接表(也就是关联表等)。您的用户和收藏夹的示例听起来像M:M确实。
create table LinkTable
(
Id int IDENTITY(1, 1), -- PK of this table
IdOfTable1 int, -- PK of table 1
IdOfTable2 int -- PK of table 2
)
...并在(IdOfTable1,IdOfTable2)上创建一个UNIQUE索引。或者取消Id列并改为开启PF(IdOfTable1,IdOfTable2)。