Php 通过多个时间间隔查找重叠的更好方法
这里的目标是获得多个用户的议程。并匹配共享相同空闲时间的用户 出于性能方面的考虑,我希望Mysql(或任何替代方案)能够完成这项工作。因此,伙伴匹配任务将通过触发器或服务器的Cron作业执行Php 通过多个时间间隔查找重叠的更好方法,php,mysql,database,algorithm,data-modeling,Php,Mysql,Database,Algorithm,Data Modeling,这里的目标是获得多个用户的议程。并匹配共享相同空闲时间的用户 出于性能方面的考虑,我希望Mysql(或任何替代方案)能够完成这项工作。因此,伙伴匹配任务将通过触发器或服务器的Cron作业执行 |userId|agenda |buddies |22 |{"week":[ "36-42", "49-52", "68-73"]} |9,6,23 |23 |{"week":[
|userId|agenda |buddies
|22 |{"week":[ "36-42", "49-52", "68-73"]} |9,6,23
|23 |{"week":[ "26-32", "61-70", "68-75","79-85" ]}|9,5,22
我的想法是假设所有空闲时间范围都是每周重复发生的事件。任何例外都将以不同的方式处理
我认为一周中每小时的唯一标识符(基数168)可以避免额外的每日循环
因此,时间间隔可以转换为如下形式:
{"weekly":[ "36-42", "49-52", "68-73" ]}
我习惯于时间间隔与日期范围重叠。但在这里我想找到不同维度的多个有序区间的任何可能的交集
在JSON\u EXTRACT
之后,MySql是否可以找到交集并返回其用户ID
按照这种方法,并使用新的Json函数,哪个DBMS能够更好地处理这种数据结构?Mysql还是Sqlite
欢迎使用任何不同的视图或替代数据模型:)您使用JSON(从而降低了3NF)然后仍然期望MySQL是解决此问题的最佳解决方案的方法充其量是不合理的。在最坏的情况下,这是荒谬的。更合理的方法是对数据进行规范化,例如,您可以使用间隔(例如UNIX时间戳)将每个事件/繁忙时间的规范化行存储为一个范围,而不是将非标量数据存储在单个列中。例如,可以使用
BETWEEN
子句更容易地扫描重叠间隙。您可能需要进一步筛选以找到足够大的间隔,但这只是一个开始。简单地说,这与Google Calendar试图通过将时间间隔标准化为5分钟块来解决的调度问题是一样的(从而减少了在一大组重叠日历上计算大范围所需的数据量。通过将计划缓存到压缩位图中,从而实现简单的指针算法(XOR
,在这种情况下),可以进一步提高性能)可以在位图上执行,以在多项式时间内进行计算。我认为json将是一种清晰的格式。实际上,我正在考虑将范围对象转换为Mysql可以处理的内容。我认为重复事件的Unix时间戳将需要额外的表来定义周期性。这更像是我正在寻找的一种算术算法这里.Json是存储数组的最佳格式…但我仍在集思广益:)为什么连数组都有?Thx对于缓存提示,通过重新定义您的问题,它基本上与查找酒店中所有可用房间的日期列表(例如,您当前好友的可用时间列表)相同。这是一个相对的问题,应该为您提供想法、数据结构和代码。这似乎不是一个算法问题,而是一个如何存储(可能是缓存/预计算/准备/…)数据的问题(正如Sherif指出的,将数据存储为json可能不是一个非常常见的选择).通过触发器或服务器的Cron作业。
为什么?