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

Jos*_*ero 4 php mysql architecture

我们正在为我们的创业公司建立一个调度系统

它只是一个普通的,除了我们愿意实现的"自动查找"功能.LAMP架构.没什么特别的.

这就是数据库的外观.三个主要表格:

  • 办公室(id,start_time,stop_time)
  • 人物(id,office_id,start_time,stop_time)
  • 时间表(id,people_id,start_time,stop_time)

start_time/stop_time是TIMESTAMPS.

表不需要这样.这只是我们目前有.

办公室桌有办公室的开放/关闭时间.这张桌子每个办公室可能大到365天,因为每天的开/关时间不一样.请注意,它可能多达1000个办事处.这使得表中大约有365,000条记录.

人们有加入/离开时间.这显然比办公室更具限制性.同样,一年中的每一天,人们都可以有不同的访问时间.每个办公室约有50人.这使得1000个办事处*365天*50名员工= 18,250,000条记录.

时间表是谁会见谁.每个人最多可以有10次会议/天.是的,在这一点上,这个表中很容易产生182.5百万行.

除了数字之外没什么奇怪的.应用程序需要做的是:给办公室,见面人和持续时间,显示前5个可用日期.

根据我们的信念,这个应用程序将完全杀死我们的服务器.我们迫切希望能够实现这一目标.我们首先想到的是"这根本不可能".但是嘿!一切皆有可能在软件中,不是吗?

PS:如果有人想到一个让应用程序可行的更好的方法,我们真的很感激它.

非常感谢阅读.希望一些铁杆程序员可以帮助我们.

更新:

出于测试目的,我们创建了两个完全相同的表:

会议和办公室(id,profesional,start,stop).

ID是主要的,其余是BTREE索引.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
Run Code Online (Sandbox Code Playgroud)

我们所做的是以下内容.仅添加1个办公室,240天.每天有8次会议,总共约2000行.执行此类查询需要2.6(!)秒.查询错了吗?可以重写吗?

Mat*_*nen 6

如果你有一个人,那是不是已经减少了计划行数减少了50000倍?如果您只考虑给定的办公室,办公室行数也将减少到几百.正确的索引会立即找到这些行.

此外,人们是否真的提前安排了一整年的会议,或者您更有可能在未来一两个月内只拥有一个完整的数据库?如果您的主数据库出现性能问题,您始终可以将旧数据移动到存档中.

此外,根据"最多"估计,很容易认为太大.你还是揣摩每个办公室将有多少人对平均和多少次会议,他们将会对每天平均."每天最多10次会议"可能很容易变成"通常每天两次".当然,取决于我们正在谈论什么样的业务.

别忘了减去周末.它们占全年的2/7.