数据库结构,用于存储用户对布局顺序的偏好

时间:2015-11-03 17:29:36

标签: mysql sql database database-design relational-database

网页布局中有几个选项

  1. 最新消息
  2. 推荐新闻
  3. 关注新闻
  4. 历史新闻
  5. 观看次数最多的新闻
  6. 用户可以选择布局的顺序,例如他们可以将订阅量最多的新闻订购到订单的顶部。

    所以我正在考虑如何在表中存储可以方便开发的选项。

    选择的数量是固定的,只有这5个选择 用户将经常更新订单

    我在考虑:

    创建一个false

    user_choice

    所以,当用户注册表在表中创建记录时,每当更新更改行时,这种方法似乎是可行的,但也不能直接在程序中重新排序布局

    那么,有没有更好的结构思路?

    感谢您的帮助

2 个答案:

答案 0 :(得分:3)

我将使用layout_orderuser idlayout_id创建一个表order_id,这样可以轻松添加更多布局,而无需在表格中添加更多列。

创建新用户时,您可以指定默认订单。

  user_id     layout_id   order_id
    1            1           1
    1            2           2
    1            3           3
    1            4           4
    1            5           5

以下是UPDATE的示例。该布局需要@user_id@layout_id@order_id

在这里,我使用变量创建一个带有特殊rank

的新ORDER BY

SqlFiddle Demo 您可以查看SELECT

内的JOIN返回的内容
SET @layout_id = 5;
SET @order_id = 2;
SET @user_id = 1;

UPDATE layout_order L 
JOIN (SELECT  l.*, @rownumber := @rownumber + 1 AS rank
      FROM layout_order l 
      CROSS JOIN (select @rownumber := 0) r
      WHERE user_id = @user_id
      ORDER BY CASE
                    WHEN layout_id =  @layout_id THEN @order_id -- here is the variable
                    WHEN order_id  <  @order_id THEN order_id   -- order doesn't change
                    WHEN order_id  >= @order_id THEN order_id + 1                    
               END

     ) t
  ON L.user_id = t.user_id
 AND L.layout_id = t.layout_id
SET L.order_id = t.rank;

答案 1 :(得分:1)

我会朝着这个方向前进:

create table user
(   -- your pre-existing user table, this is a stub
    id int auto_increment primary key
    -- the rest
);

create table sortChoices
(   -- codes and descriptions of them
    code int auto_increment primary key,
    description varchar(100) not null
);

create table user_sortChoices_Junction
(   -- intersect or junction table for user / sortChoices
    userId int not null,
    code int not null,
    theOrder int not null,
    primary key (userId,code),  -- prevents dupes
    constraint `fk_2user` foreign key (userId) references user(id),
    constraint `fk_2sc` foreign key (code) references sortChoices(code)
);

联络桌驱动它,是灵活的,而那些跟随的人不会把自己锁定在相同的思维中,只会有5&#39;

另外,对于喜欢CSV值的其他人来说,存在数据规范化问题。这是我为此所做的write-up,并与Junction Tables联系。

所以,对于那些接下来的人来说,这和OP问题一样多。