Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数据库架构疯狂需要最佳方法_Php_Mysql_Architecture - Fatal编程技术网

Php 数据库架构疯狂需要最佳方法

Php 数据库架构疯狂需要最佳方法,php,mysql,architecture,Php,Mysql,Architecture,我们正在为我们的初创公司建立一个时间表系统 它只是一个普通的,除了我们愿意实现的自动查找功能。灯具结构。没什么特别的 这就是DB的外观。三个主要表格: 办公室id,开始时间,停止时间 人员id、办公室id、开始时间、停止时间 计划id、人员id、开始时间、停止时间 开始时间/停止时间是时间戳 桌子不需要这样。这正是我们目前所拥有的 office表具有办公室的打开/关闭时间。由于每天的打开/关闭时间不同,此表可能会大到每个办公室365天。请注意,它最多可以有1000个办公室。这使得表中大约有365

我们正在为我们的初创公司建立一个时间表系统

它只是一个普通的,除了我们愿意实现的自动查找功能。灯具结构。没什么特别的

这就是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%工作:

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:现在有云了吗?将联盟更改为