用户收藏的SQL数据库设计模式?

时间:2014-03-19 17:50:16

标签: sql database design-patterns

在数据库网站上问这个问题,但它看起来真的很慢。所以我一般都是SQL和数据库的新手,我唯一使用过的SQL数据库使用了一对多的关系。我想知道最简单的方法来实现一个"收藏夹"我的数据库中的用户机制 - 类似于Youtube等网站提供的内容。用户当然是独一无二的,因此一个用户可以拥有许多收藏夹,但是一个项目也可以被许多用户收藏。这被认为是多对多关系吗?这样做的典型设计模式是什么?许多关系看起来很头疼(我使用SQLAlchemy,所以我的表与类似的对象进行交互)但这似乎是网站上相当常见的功能,所以我想知道什么是最简单易行的方法关于它。感谢

2 个答案:

答案 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)。