Php 数据库架构疯狂需要最佳方法
我们正在为我们的初创公司建立一个时间表系统 它只是一个普通的,除了我们愿意实现的自动查找功能。灯具结构。没什么特别的 这就是DB的外观。三个主要表格: 办公室id,开始时间,停止时间 人员id、办公室id、开始时间、停止时间 计划id、人员id、开始时间、停止时间 开始时间/停止时间是时间戳 桌子不需要这样。这正是我们目前所拥有的 office表具有办公室的打开/关闭时间。由于每天的打开/关闭时间不同,此表可能会大到每个办公室365天。请注意,它最多可以有1000个办公室。这使得表中大约有365000多条记录 人们有加入/离开的时间。这显然比办公室更具限制性。同样,一年中的每一天,人们都可以有不同的探视时间。每个办公室大约有50人。这使得1000个办公室*365天*50名员工=18250000条记录 时间表是谁将会见谁。每个人每天最多可能有10次会议。是的,在这一点上,很容易在这个表中生成1.825亿行 除了大数字,没什么奇怪的。应用程序需要做的是:给定办公室、要会见的人和持续时间,显示前5个可用日期 从我们所相信的,这个应用程序将完全杀死我们的服务器。我们只是不顾一切地想跑。我们首先想到的是这根本不可能。但是嘿!软件中的一切都是可能的,不是吗 附言:如果有人想到一个更好的方法,使应用程序可行,我们会非常感激 非常感谢你的阅读。希望一些铁杆程序员能帮我们一把 更新: 出于测试目的,我们创建了两个完全相同的表: 会议和办公室id、专业、开始、停止 ID是主ID,其余是B树索引。SQL是这样的,不能100%工作:Php 数据库架构疯狂需要最佳方法,php,mysql,architecture,Php,Mysql,Architecture,我们正在为我们的初创公司建立一个时间表系统 它只是一个普通的,除了我们愿意实现的自动查找功能。灯具结构。没什么特别的 这就是DB的外观。三个主要表格: 办公室id,开始时间,停止时间 人员id、办公室id、开始时间、停止时间 计划id、人员id、开始时间、停止时间 开始时间/停止时间是时间戳 桌子不需要这样。这正是我们目前所拥有的 office表具有办公室的打开/关闭时间。由于每天的打开/关闭时间不同,此表可能会大到每个办公室365天。请注意,它最多可以有1000个办公室。这使得表中大约有365
SELECT a.profesional, a.stop AS desde, Min(b.start) AS hasta
FROM meetings AS a
JOIN meetings AS b
ON a.profesional=b.profesional
AND a.stop < b.start
WHERE a.profesional = 1
AND b.profesional = 1
GROUP BY a.start
UNION
SELECT m.profesional, MIN(m.start), MIN(j.start)
FROM offices m
JOIN meetings j
ON j.profesional = m.profesional
WHERE j.profesional = 1
AND m.profesional = 1
UNION
SELECT m.profesional, MAX(j.stop), MAX(m.stop)
FROM offices m
JOIN meetings j
ON j.profesional = m.profesional
WHERE j.profesional = 1
AND m.profesional = 1
ORDER BY desde ASC
我们所做的如下。只需添加一个240天的办公室。每天有8次会议,总共约2000行。需要2.6秒!执行此类查询的时间为秒。问错了吗?是否可以重写?< P>如果你给了一个人,难道这还不能减少要考虑的50000个时间表行数吗?如果您只考虑给定的办公室,办公室行的数量也会减少到几百个。一个合适的索引会很快找到这些行 此外,人们是否真的提前安排了一整年的会议,或者更可能的情况是,未来一到两个月内,您的数据库将被完全预订?如果主数据库开始出现性能问题,则始终可以将旧数据移动到存档中 而且,如果估计值高达100%,很容易把事情想得太大。你应该试着计算出每个办公室平均有多少人,平均每天有多少次会议。一天最多10次会议可能很容易变成一天两次。当然,这取决于我们谈论的是哪种业务
别忘了减去周末。它们占全年的2/7。您的应用程序似乎需要一个关键的查询。查找由定义的间隔
(OfficeOpenIntervals INTERSECT PeopleAtOfficeIntervals) MINUS ScheduleIntervals
并在这些时间间隔内搜索,在某个日期附近或之后
使用适当的索引,并限制查询只搜索一个人,在接下来的60天内,等等,都可能是好的。处理时间间隔操作很棘手,但您可以使用各种索引和编写查询的方法进行测试
如果您测试并发现没有有效的索引方法,那么另一种选择是使用单独的AvailableSlots表,该表最初在没有预定约会的情况下,填充一个人在办公室的所有可用天数,即OfficeOpenIntervals INTERSECT PeopleAtOfficeIntervals。然后,每次在日程中添加约会时,此AvailablesSlots表中的对应行将被删除、更新或拆分为两行,这两行将存储计划开会的人员的剩余可用时间间隔
因此,显示前5个可用日期的查询只需在此表中搜索即可
这不是一个标准化的解决方案,必须通过存储过程来维护所有操作的完整性,如添加日程安排、人员离开办公室、开始工作等。初始填充也可能需要时间和空间,但您不必在一百年内填充表。可能只需要几个月,以后可以每月或每年或在需要时进行一次额外的填充。描述很清楚,但如果您提供列名和数据类型会更好。哦,对不起,我刚刚添加了模式。您可以考虑使用基于Web的服务,例如Amazon或云。@ Alxy13:现在有云了吗?将联盟更改为