postgresql - 搜索两圆交叉区域的共同对象
问题描述
我正在解决一个可以用一系列要点描述的任务:
两种用户类型:
Fighter
,Arena
.每个
Fighter
人都可以在注册过程中自由设置他们的地理位置和首选搜索半径(稍后他们可以在他们的设置中更改这些值)。搜索半径,正如它的名称一样,是用户可以搜索潜在对手的半径。每个
Arena
对象都有其可用的地理位置和时间段。两个战士匹配如果:他们的搜索圈相交并且相交区域包含至少一个
Arena
。Arena
Fighter
如果它位于其搜索范围内,则可供 a使用。
我正在实现匹配逻辑。所以需要实现匹配算法。我正在努力找出正确的方法。
据我所知,一切都可以归结为寻找 common Arena
s。换句话说,可能有许多表会提供关于Arena
每个 s 可用的信息Fighter
。也就是说,比如一个Fighter
有id
98的用户有Arena
s有34、57、22 ids
,另一个有id
17的用户有Arena
s有ids
156、57。
userId = 98; available_arenas = [34, 57, 22];
userId = 17; available_arenas = [156, 57];
通过比较ids
available Arena
s 我们可以看到他们有一个Arena
共同点,它id
是 57。所以我假设基于这个事实,可以肯定地说他们的搜索圈相交并且有一个Arena
可能发生战斗事件的地方地方。
我认为这种方法可以用来确定Fighter
s 是否匹配。我想,但我不能说基于这个想法的搜索是否有效,我认为它存在以下困难:每个/Arena
都应该支持所有这些列表。所以,如果说,一些新的被添加到数据库中,形象地说,所有这些列表必须立即更新......这也可能是一个非常耗时的操作。如果注册了新用户,则必须计算其个人可用 s 列表。如果一个已经存在的改变它的地理位置,它们的 s 也必须重新计算等等。Fighter
Arena
Arena
Fighter
available_arenas
Fighter
Arena
Fighter
Arena
另一种方法可能是做同样的事情,但不将那些Arena
s存储ids
在数据库中。给定 a和a 的(long, lat, r)
参数,即时进行所有计算。Fighter
(long, lat)
Arena
我确信那里有一些更好的方法。我想听听您对我的看法,如果您知道更好的方法,我也想知道。
我将PostgreSQL
13 用于 DBMS。
解决方案
我认为没有多少解决方案,只要这种战斗机竞技场结构。您可以尝试将您的竞技场位置(按区域、锚点位置或类似位置)分组,看看是否可以减少搜索的权重。另一个想法可能是存储available-fighters
每个竞技场的列表。每次战斗机旅行时,它都会检查新的竞技场,对于那些不再可用的竞技场,它可以向他们发送一条消息以从列表中删除。那么这个竞技场中所有可能的战斗都是它的所有可能的组合available-fighters
推荐阅读
- r - 来自数据框中的 3 个不同变量的日期
- python - 在python中用不需要的空行抓取表格
- c# - 文本框、图片框 XML (XDocument) 中的选定组合框项目
- javascript - 如何在 Vue 中动态获取组件道具
- html - 如何使文本不与其容器重叠?
- c - 在 C 中处理 SIGCHLD 时出现非法硬件指令
- javascript - 单击诸如 fullpage.js 之类的锚链接时快速滚动
- c# - .NET Core 2.0 授权过滤器 - 未按预期工作
- android - ImageView 适合宽度,从顶部开始
- java - 用户退出程序时如何设置 ScheduledExecutorService 结束?