我需要一些人为我目前正在研究的美发师的 PHP/MySQL 预约系统争取“最佳实践”。希望我们可以一起清除一些事情,以避免事后重新做系统。我一直在查看 SO 和 Google 的一些教程、最佳实践等,但我没有找到任何适合我需要的东西。
基本信息
每天有多个美发师可用,每个美发师都有自己的议程,其中包含他/她与客户的约会。与美发师相连的是一张表格,其中包含他/她在一周内有空的时间。
表:人
+----+------+-------+-----------+
| id | name | email | available |
+----+------+-------+-----------+
| 1 | John | i@a.c | Y |
| 2 | Sara | c@i.a | N |
+----+------+-------+-----------+
表:次(这个表有一个主键,我把它排除在下面的计划之外)
+-----------+-------------+-----------+-----------+
| people_id | day_of_week | start | end |
+-----------+-------------+-----------+-----------+
| 1 | 1 | 08:00 | 12:00 |
| 1 | 1 | 12:30 | 17:00 |
| 1 | 3 | 09:00 | 12:00 |
| 1 | 4 | 10:30 | 16:00 |
| 1 | 5 | 09:00 | 17:00 |
| 1 | 6 | 09:00 | 12:00 |
| 2 | 1 | 09:00 | 12:00 |
| 2 | 2 | 09:00 | 12:00 |
| 2 | 3 | 09:00 | 12:00 |
+-----------+-------------+-----------+-----------+
如您所见,人和时间之间存在一对多的关系(显然,因为一周有 7 天)。但除此之外,还有一个选项可以在一天中的几个小时之间添加休息时间(参见 people_id = 1, day_of_week = 1: 08:00-12:00 和 12:30-17:00)。
此外,还有一个名为“hairdress_types”的表,该表包含可以进行的各种类型的约会(如染发、剪发、洗头等)。此表包含此约会花费的时间量(以分钟为单位)。
最后我有一个appointments
非常简单的表:
id, people_id, types_id, sex, fullname, telephone, emailaddress, date_start, date_end
开始日期和结束日期将是 MySQL 中的完整 DATETIME 字段,从而更容易使用 MySQL 查询函数进行计算。
最佳做法是什么?
因此,按照我的设置方式,前端用户将在字段中选择一个日期,触发一个 ajax/jquery 函数,该函数会在所选日期查找所有可用的美发师。然后用户指定美发师(这不是强制性的:用户也可以选择“任何”美发师选项)和他/她想要进行的约会类型。
提交第一个表单后,可以使用以下信息:
- 日期(日、月、年)
- people_id(如果选择了理发师,则可以为 0 表示“任何”或 ID)
- hairdress_type(与约会所需的分钟数相关联)
使用此信息,我要么从选定的美发师中选择可用日期,要么循环所有可用的美发师及其可用日期。
这就是我的思想精神崩溃的地方!因为检查可用日期的最佳方法是什么。我认为最好的方式是:
- 查询给定日期的理发师时间(一次 1 次)
- 使用查询1结果的开始日期+约会类型花费的分钟数查询约会表(所以
SELECT * FROM appointments WHERE ((date_start >= $start AND date_start <= ($start+$time)) OR (date_end > $start AND date_end <= ($start+$time)) AND people_id = 1
:) - 一旦没有找到结果,我就认为这个位置是免费的,并且作为一个选项提供给用户
我面临的更大问题是第 2 点:我对这个查询真的很疯狂,这是我需要找到与特定时间跨度匹配的约会的完整查询吗?
感谢您的阅读和思考!:-)
// 编辑:多一点“testdata”:
约翰 - 星期一 - 12:00 - 17:00。约会: - 12:00 - 12:30 - 14:30 - 15:30
用户想要一个需要 2 小时的约会,在上面的示例中,我会检查:
- 12:00 到 14:00 之间有预约吗?是的,.. 前往下一个地点
- 14:00 到 16:00 之间有预约吗?是的,.. 前往下一个地点
- 16:00 到 18:00 之间有预约吗?错误,17:00 后不可用
因此.. 使用 10/15 分钟的“时间块”可能是一个更好的选择。进行检查:
- 12:00 - 14:00
- 12:10 - 14:10
- 12:20 - 14:20 等。
这将在 12:30 和 14:30 之间找到可用的位置。
// 编辑 2:对第 2 步的可能查询
我一直在纸上写一些东西(一张有约会的桌子和可能使用的空位)。我想出了以下内容。以下情况不能预约:
- 在 $start 和 $end 之间有一个与 start_date 的约会
- 在 $start 和 $end 之间有一个 end_date 的约会
- 有一个约会 start_date < $start and end_date > $end
将上述内容与约会表一起查询people_id
将导致没有行(= 空闲位置)或一个/多个行,在这种情况下,该位置被占用。
我想找到空缺点的最好方法是在数据库中查询 X 分钟的块,开始间隔为 10 分钟。这个解决方案的不好的一面是我每小时需要 6 个查询,每个美发师大约需要 48 个查询......关于如何减少查询量的任何想法?