2013-03-15 35 views
0

我正在進行類似於Copper Project或PHP Collab的基於Web的項目管理/協作應用程序的規劃階段,使用concrete5作爲我的框架。concrete5數據庫工作流程

我想集成一些功能,但我不完全確定如何完成此任務,查看如何使用塊生成DB表。

我想到的功能如下: 1)當客戶經理或項目經理創建新客戶時,他們必須爲客戶分配一個三字符前綴。例如:如果(通過一些好運)​​我將Diesel添加爲客戶端,我想爲它們分配前綴DSL。

2)當客戶經理或項目經理創建新項目時,項目ID應該直接與客戶相關,而不是所有客戶的項目總數。換句話說,Diesel與我的第一個項目的項目ID應該是DSL001,而不是DSL016,因爲在此之前還有其他15個客戶項目(參考遵循全球項目ID邏輯的Copper和PHP Collab)與每個客戶端項目ID邏輯相反)。該項目ID將在由AM/PM創建的前端項目頁面上顯示,並且還將用作諸如成本估算,發票等的參考ID。

所以這是我從工作流規劃的角度來看問題的地方。我對MySQL的理解是,如果我想遵循自己的項目ID邏輯,就必須爲每個客戶創建一個新表,以包含與其項目有關的所有數據,以便數據庫可以正確輸出唯一的ID號碼。

但是,我對C5的理解是,例如,如果在創建此應用程序的過程中,我決定將項目窗體創建爲要插入前端模板的塊,則db.xml文件會爲所有客戶端在數據庫中創建一個通用項目數據表,而不是每個客戶端一個。

任何建議我如何能夠完成我期待在C5的框架中做的事情?

如果有什麼不清楚的地方,我可以展示一些項目頁面外觀的模型。

謝謝!

回答

1

這是一個通用數據庫模式問題,與Concrete5沒有任何關係。您關於爲每個客戶端需要一個單獨的表的想法只是讓MySQL可以生成唯一的ID號而已

有一個與數據庫模式,說應該只用於記錄的「ID」號碼以唯一標識記錄內部(應用程序和數據庫的代碼中),總的原則 - 你應該幾乎從來不使用主實際「業務邏輯」的ID號碼。在你的情況下,你有一個項目ID,它包含字母和數字,所以即使你想使用MySQL生成的ID作爲它,你也不能(因爲這些ID只是整數,而不是字母)。

此外,爲相同類型的數據創建單獨的表格與數據庫的工作方式完全相反。相反,你想要做的是爲客戶提供一張桌子,爲項目提供另一張桌子。客戶端表將有一個「id」字段(自動遞增號碼)和一個客戶端前綴字段(在你的例子中的「DSL」)。然後,項目表具有自己的「id」字段(同樣是自動遞增數字)和一個將該項目與客戶端表中的記錄關聯的「客戶端ID」。然後在項目表中爲項目編號添加另一個字段。項目編號字段是你要顯示給用戶(你會把它與客戶端的3個字母的前綴結合起來 - 所以你真的在數據庫中存儲兩個單獨的值,但你的用戶只會看到一個組合值因爲這就是你將它輸出到頁面的方式)。

這個「項目編號」字段應該是而不是是一個自動遞增編號,因爲正如您發現的那樣,MySQL每個表只有一個編號序列。所以相反,當你有一個新項目時,你的應用程序中會有一些代碼爲你生成這個數字。該代碼將是這樣的:

function save_new_project($client_id, $project_data) { 
    $db = Loader::db(); 

    //Determine the highest existing project number for this client 
    $sql = "SELECT MAX(project_number) FROM projects WHERE client_id = ?"; 
    $vals = array($client_id); 
    $max_project_number = $db->GetOne($sql, $vals); 
    if (empty($max_project_number)) { 
     $max_project_number = 0; //first project for this client 
    } 

    //Insert new project with next-highest number 
    $new_project_number = $max_project_number + 1; 
    $sql = "INSERT INTO projects (client_id, project_number, some_field, another_field) VALUES (?, ?, ?, ?)"; 
    $vals = array($client_id, $new_project_number, $project_data['some_field'], $project_data['another_field']); 
    $db->Execute($sql, $vals); 
} 

順便說一下,Concrete5可能不是一個好的框架用於這種類型的項目。您可能想要查看適用於Web應用程序(如CodeIgniter,Symfony,CakePHP,Kohana等)的更一般框架。