如何为数据库中的任意订购商品建模?

时间:2019-01-15 06:04:53

标签: database database-design

我接受了一项新功能,该功能可以通过使用拖放UI重新排序某些项目,并将每个用户的首选项保存到数据库中。最好的方法是什么?

在阅读了关于StackOverflow的一些问题之后,我找到了这个解决方案。

解决方案1:使用十进制数字表示顺序

例如,

id     item     order
 1        a         1
 2        b         2
 3        c         3
 4        d         4

如果我在项目1和2之间插入项目4,则订单变成

id     item     order
 1        a         1
 4        d         1.5
 2        b         2
 3        c         3

这样,每个新订单= order [i-1] + order [i + 1] / 2

如果我需要为每个用户保存首选项,则需要另一个像这样的关系表,

user_id     item_id     order
      1           1         1
      1           2         2
      1           3         3
      1           4         1.5

我需要num_of_users * num_of_items条记录来保存此首选项。

但是,有一个我能想到的解决方案。

解决方案2:将订单首选项保存在“用户”表的一列中

这很简单,只需在User表中添加一列来记录订单。每个值都将解析为item_ids数组,并按数组索引排序。

user_id .   item_order
      1       [1,4,2,3]
      2       [1,2,3,4]

此解决方案是否有任何限制?还是有其他方法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

通常,显式排序处理表示或数据的某些特定处理。因此,最好将其表示/处理的实体分开。例如

users
-----
user_id (PK)
user_login
...

user_lists
----------
list_id, user_id (PK)
item_index

item_index可以是简单的整数值:

  • 连续排序(1,2 ... N):通常需要更改整个列表的DELETE/INSERT
  • 以一些种子(10,20 ... N)离散排序:您可以插入新项目而无需重新排序整个列表

分隔实体数据和列表的另一个原因:应该在事务中完成对列表的重新排序,这可能会导致行/表锁定。如果是单独的表,则只会影响列表表中的数据。