将数据存储在表中而不使用列中的CSV列表

时间:2013-12-04 20:57:07

标签: mysql database database-design

我有下表:

+-----------+--------------+
|categoryID | categoryName |
+-----------+--------------+
| 0         | Bills        |
| 1         | Gas          |
| 2         | Coffee       |
| 3         | Restaurants  |
+-----------+--------------+

我的所有用户都可以访问此表,但是,用户希望能够对表格进行排序(不一定按字母顺序或顺序排列),并保存其排序顺序首选项。他们还想隐藏他们不使用的类别。

例如:

用户1希望他们的表看起来像这样:

+-----------+--------------+
|categoryID | categoryName |
+-----------+--------------+
| 3         | Restaurants  |
| 0         | Bills        |
| 1         | Gas          |
+-----------+--------------+

用户2希望他们的表看起来像这样:

+-----------+--------------+
|categoryID | categoryName |
+-----------+--------------+
| 0         | Bills        |
| 1         | Gas          |
| 2         | Coffee       |
+-----------+--------------+

用户3希望他们的表看起来像这样:

+-----------+--------------+
|categoryID | categoryName |
+-----------+--------------+
| 3         | Restaurants  |
| 1         | Gas          |
| 0         | Bills        |
| 2         | Coffee       |
+-----------+--------------+

我能想到的唯一方法就是创建一个像这样的表:

+-------+---------+
|userID | sort    |
+-------+---------+
| 1     | 3,0,1   |
| 2     | 0,1,2   |
| 3     | 3,1,0,2 |
+-------+---------+

问题:我被告知在列中存储CSV列表不是一个好习惯,但我不知道如何实现这一点。如何在不在列中存储CSV列表的情况下完成我想要的工作?

2 个答案:

答案 0 :(得分:0)

您可以实现此目的的另一种方法是使用user_id,category_id,order组成排序表 订单将在此之后存储1个最高类别2类别的订单,依此类推。

user_id | category_id | order
1       | 2           | 1
1       | 3           | 2

答案 1 :(得分:0)

不要在数据库中存储分隔值,因为您无法正常维护和查询数据。

而是创建多对多表(我们称之为user_categories),这可能看起来像这样

CREATE TABLE user_categories
(
  `userid` int, 
  `categoryid` int, 
  `sort_order` int,
  primary key (userid, categoryid),
  foreign key (userid) references users (userid),
  foreign key (categoryid) references categories (categoryid)  
);

问题中提到的三个用户的示例内容将如下所示

| USERID | CATEGORYID | SORT_ORDER |
|--------|------------|------------|
|      1 |          3 |          1 |
|      1 |          0 |          2 |
|      1 |          1 |          3 |
|      2 |          0 |          1 |
|      2 |          1 |          2 |
|      2 |          2 |          3 |
|      3 |          3 |          1 |
|      3 |          1 |          2 |
|      3 |          0 |          3 |
|      3 |          2 |          4 |

然后你可以做

SELECT c.categoryid, c.categoryname
  FROM user_categories uc JOIN categories c
    ON uc.categoryid = c.categoryid
 WHERE userid = 1
 ORDER BY uc.sort_order

示例输出:

| CATEGORYID | CATEGORYNAME |
|------------|--------------|
|          3 |  Restaurants |
|          0 |        Bills |
|          1 |          Gas |

这是 SQLFiddle 演示