我接受了一项新功能,该功能可以通过使用拖放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]
此解决方案是否有任何限制?还是有其他方法可以解决这个问题?
答案 0 :(得分:0)
通常,显式排序处理表示或数据的某些特定处理。因此,最好将其表示/处理的实体分开。例如
users
-----
user_id (PK)
user_login
...
user_lists
----------
list_id, user_id (PK)
item_index
item_index
可以是简单的整数值:
DELETE/INSERT
分隔实体数据和列表的另一个原因:应该在事务中完成对列表的重新排序,这可能会导致行/表锁定。如果是单独的表,则只会影响列表表中的数据。