我正在寻找为每个用户检索最相关结果的最佳解决方案。
我简化了我的模型,如下所示的UserProfile和Groups
-模型名称: UserProfilestyles: ['a', 'b', 'f', 'r'] <- ('styles'是字段名称)-Group 1styles: ['a', 'f']-Group 2['g', 'a', 'h'] ...-Group 1,000,000styles: ['s', 'w', 'x'](假设我们有数百万个Groups)
我想根据用户的样式对组进行排序和检索。因此,在这种情况下,’Group 1’因为样式’a’和’f’得分为2,而’Group 2’因为样式’a’得分为1。
我们不能在主数据库中存储分数,因为每个用户的样式都不同。
- 我的方法1:每次用户请求时对所有数据库进行排名(我写了一个概念性的代码)
views.py
for group in Group.objects.all(): # 将分数存储到组的新字段中 group.style_count = group.styles.join_count(user.styles)list_view_output = Group.objects.order_by(style_count)
- 方法2:在数据库中存储排名执行查询并将输出(当然包括排名和用户ID)存储在Redis内存缓存数据库中。并在特定用户需要时检索结果
考虑中的问题:
- 查询似乎成本很高。对于迭代为O(n),对于连接为O( min( user.style.count(), group.style.count() ) )。我怎样才能做得更好?也许我可以在模型中做些什么?
- 不幸的是,如果我们有一百万个组和一千个用户,我需要在缓存内存(Redis)中存储十亿行数据。我肯定负担不起(我想我最多可以有8GB,或者可能更多)
- 也许我不需要将每个用户的排名数据存储在缓存中,因为一些用户有相同的样式。你知道有什么AI方法可以解决这个问题吗?
你能提供一些建议来更好地构建这个系统吗?
谢谢…!!!!
回答:
底线是,对于数百万规模的问题,保存所有数据并进行排序可能不是一个好主意。
使用当前的数据结构,- 时间复杂度:O(n);几乎不可能降低 – 空间复杂度:我们可以大大改善。例如,只需要前10名,成本可以是O(1)。我们只需以排序的方式保存前10名。在线性扫描中,我们只将新组的分数与最小的那个进行比较,如果新分数更大,则替换它
但一个可能的问题是,如果有太多分数相同的组,那么这可能会成为一个问题。你需要小心处理它。
如果你以“排序”的方式组织样式和组,可能会更快。例如,按字母顺序,Group 2将是[‘a’, ‘g’, ‘h’]。我们跟踪第一个或几个字母的索引。例如,以’a’开头的组将是第一批;然后是以’b’开头的组,依此类推。在你的情况下,你可以按以下方式进行搜索:1. 首先搜索以’a’开头的组;2. 然后搜索以’b’开头的组;3. 然后是’f’;4. 然后是’r’。这样,不含[a, b, f, r]中任何样式的组就不会被触及。这样可以节省你很多时间。