我们正在为我们的创业构建一个调度系统。需要数据库架构疯狂的最佳方法
这只是一个普通的,除了我们愿意实现的“自动查找”功能。灯架构。没什么特别的。
这是DB的外观。三个主要的表:
- 办事处(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次会议。是的,在这一点上,这个表格很容易制造出1825万行。
除了大数字没什么奇怪的。应用程序需要做的是:给定办公室,见面人员和持续时间,显示前5个可用日期。
从我们相信,这个程序将完全杀死我们的服务器。我们只是不顾一切地做这个运行。我们首先想到的是“这根本不可能”。但是,嘿!一切都可能在软件中,不是吗? PS:如果有人想到一个更好的方法,使应用程序可行,我们真的欣赏它。
非常感谢您的阅读。希望一些硬核程序员可以借我们一把。
UPDATE:
出于测试目的,我们已经创建了两个完全一样的表:
会议&办事处(ID,设备专业,启动,停止)。
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
我们所做的是以下内容。 240天内只增加1个办公室。每天有8次会议,总共约2000行。执行此类查询需要2.6(!)秒。查询是否错误?它可以重写吗?
说明很明确,但如果您提供了列名和数据类型,则会更好。 – 2012-02-06 21:07:04
对不起,我刚刚添加了架构。 – 2012-02-06 21:13:03
您可能会考虑使用基于网络的服务,例如Amazon或Cloud。 – alexy13 2012-02-06 21:14:52