关系型数据库设计 - 用户最喜欢的数据库设计

3

应用场景:将用户喜爱的组合保存到数据库中。

一个用户可以选择:

1. "a,b,c" 作为他的第一个喜爱的组合。

2. "a,b" 作为第二个喜爱的组合。

该如何设计一个数据库表来保存这些信息,并且能够通过用户ID进行查询检索?

使用以下查询语句: select * from UserFav where userId = :userId 应返回 [a,b,c] 和 [a,b]

这种表结构会导致数据冗余过多

userId  combination
qw1     a,b,c
qw1     b,c

有人能指导我如何以最佳方式进行设计吗?


1
你觉得那个表结构有什么冗余的地方? - GuidoG
@GuidoG userId和个人选择的组合。 userId重复两次,b、c重复两次。 - Karthik Suresh
但这在任何“一对多”的关系中都是正常的。UserId必须重复本身,否则无法建立关系。对于选择组合,您需要提供有关其实际外观的更多信息。 - GuidoG
看一下 @cloudsafe 的回答,我认为它可以解决你的问题。 - GuidoG
@GuidoG 是的。谢谢您的时间。 - Karthik Suresh
1个回答

7
我会把它存储在单独的行中,而不是作为分隔字符串:
Declare @favourites table (UserID char(3), fav_list_pos int, fav_pos int, fav_val char(1))

insert into @favourites values
  ('qw1', 1, 1, 'a')
, ('qw1', 1, 2, 'b')
, ('qw1', 1, 3, 'c')
, ('qw1', 2, 1, 'a')
, ('qw1', 2, 2, 'b')

select * from @favourites where userId = 'qw1' order by fav_list_pos, fav_pos  

1
好的答案,我认为只需要在选择语句上加一个 order by。 - GuidoG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接