2013-07-22 28 views
0

我在php中製作預訂系統。我目前正在就存儲數據庫項目的最佳方式提出一些建議。我現在有3個表:在我的系統中存儲數據以供檢索的最佳方式

Table 1 = Hire Stock (Primary Key = asset_id) 

(包含特定的項目,如尺寸,重量,功耗

Table 2 = Project (Primary Key = project_id) 

(包含項目開始日期,結束日期,客戶姓名字段)

Table 3 = availability (Primary Key = asset_id) 

(每次一個項目被添加到一個項目,它被存放在這裏與它的項目ID)

我需要能夠搜索廣告資源中的每個項目,並在需要時檢查它是否可用於聘用。如果我必須遍歷每個比較日期範圍的項目,這將需要很長時間。有更好的方法來存儲數據嗎?更好的方法來搜索它?

+0

租項目是*消耗*爲項目的持續時間?可用性聽起來更像AssignedToProject,似乎有點令人困惑 - 這是期望的目標嗎?此外,「比較日期範圍」可能是「在[基於指數的]範圍比較中使用SQL集操作」,因此它不一定會在這裏「花費時間」。更復雜的操作類型是找到哪些範圍*是空閒的,而不是找到範圍的重疊(或者在一組範圍內的單個範圍)。 – user2246674

+0

編程的第一條規則:先讓它工作,然後再優化。我建議你先試試你的方法,看看錶演是否可悲然後再進行優化。同時試圖用你的代碼設計你的數據不是一個好主意:它創建了模型和代碼之間的依賴關係,所以當你不得不修改代碼時,你會開始擔心模型是否被破壞。最後用於文本搜索考慮使用Sphinx和其他去普通的SQL,只是施加更多的限制,就像用戶必須指定日期範圍一樣。 –

回答

0

你的模式看起來很明智。只需正確加入表格,並測試您的asset_id是否屬於那些分配給日期範圍與您需要的新項目的期間重疊的項目的人員。 假設您已經創建了新項目並希望爲其分配產品。

希望查詢是這樣的:

$query= "select * from Hire_Stock h ". 
"Where h.asset_id not in ". 
"(Select a.asset_id from availability a, Project p2, Project p1 ". 
"Where p1.project_id = :new_proj ". // The id of the new/planned project 
"and p2.project_id != p1.project_id ". 
"and p2.end_date >= p1.start_date ". 
"and p2.start_date <= p1.end_date ". 
"and a.project_id = p2.project_id)"; 

// using oracle oci 

$pok=oci_parse($conn,$query); 

if (!$pok) die("Query ($query) Failed!<br>"); 

oci_bind_by_name($pok,':new_proj',$new_proj,-1); 

$res=oci_execute($pok); 

While ($hs_row=oci_fetch_array($pok),OCI_ASSOC) 
(
    extract($hs_row); 
    : 
) 
相關問題