我們正在爲我們的創業構建一個調度系統。需要數據庫架構瘋狂的最佳方法
這只是一個普通的,除了我們願意實現的「自動查找」功能。燈架構。沒什麼特別的。
這是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