【问题标题】:Best way to query calendar events?查询日历事件的最佳方式?
【发布时间】:2009-04-09 17:42:12
【问题描述】:

我正在创建一个显示一个月内事件时间表的日历。每天都有几个参数决定是否可以为这一天安排更多活动(有多少工作人员,有多少时间等)。

我的数据库是使用三个表设置的:

  1. 定期时间表 - 用于为一周中的每一天创建一个数组,其中概述了有多少员工可用,他们可用的时间等
  2. 日程变化 - 如果某个日期有变化,这会覆盖常规日程数组中的信息。
  3. 事件 - 现有事件,按日期引用。

在这个阶段,代码会遍历一个月中的每一天,每天检查两到三件事。

  1. 日程安排是否有任何变化(公共假期、工作时间缩短等)?
  2. 今天有多少小时/多少员工?
  3. (如果有工作人员)今天已经安排了多少活动?

第 1 步和第 3 步需要数据库查询 - 假设每月有 30 天,即每次页面浏览有 60 次查询。

我担心这会如何扩展,对于少数用户来说,我认为这不会有太大问题,但如果 20 个人尝试同时加载页面,那么它会跳到 1200查询...

任何关于如何更有效地做到这一点的想法或建议将不胜感激!

谢谢!

【问题讨论】:

    标签: php mysql database


    【解决方案1】:

    我想不出你需要将每个查询限制在一天内的充分理由。当然,您可以选择一对日期之间的所有值。

    同样,您可以使用联接来获取给定日期的预定事件数。

    然后对数据库查询返回的数组执行循环(每天)。

    【讨论】:

    • 感谢您的所有回答。放入数组非常适合我的需要。再次感谢!
    【解决方案2】:

    创建表:

    t_month (day INT)
    
    INSERT
    INTO     t_month
    VALUES
             (1),
             (2),
             ...
             (31)
    

    然后查询:

    SELECT   *
    FROM     t_month, t_schedule
    WHERE    schedule_date = '2009-03-01' + INTERVAL t_month.day DAY
             AND schedule_date < '2009-03-01' + INTERVAL 1 MONTH
             AND ...
    

    您只会得到一个带有JOIN 的查询,而不是30

    其他RDBMS 允许您动态生成行集,但MySQL doesn't

    不过,您可以将 t_month 替换为丑陋的

    SELECT  1 AS month_day
    UNION ALL
    SELECT  2
    UNION ALL
    ...
    SELECT  31
    

    【讨论】:

      【解决方案3】:

      我在使用http://rosterus.com 时遇到了同样的问题,我们只是将大部分数据加载到页面顶部的数组中,然后在数组中查询相关数据。之后页面加载速度提高了 10 倍。

      因此,运行一两个广泛的查询来收集您需要的所有数据,选择适当的键并将每个结果存储到一个数组中。然后访问数组而不是数据库。 PHP 在数组索引方面非常灵活,您可以使用各种东西作为键...或多个索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 2013-08-22
        • 1970-01-01
        相关资源
        最近更新 更多