concrete5数据库工作流程

时间:2013-03-15 19:58:04

标签: mysql concrete5

我正处于类似于Copper Project或PHP Collab的基于Web的项目管理/协作应用程序的规划阶段,使用concrete5作为我的框架。

我想要集成一些功能,但我不完全确定如何实现这一点,看看如何使用块生成数据库表。

我想到的功能如下: 1)当客户经理或项目经理创建新客户时,他们必须为客户分配三个字符的前缀。示例:if(通过一些疯狂的运气)我将Diesel添加为客户端,我想为它们分配前缀DSL。

2)当客户经理或项目经理创建新项目时,项目ID应与客户直接相关,而不是与所有客户的项目总数相关。换句话说,Diesel与我合作的第一个项目的项目ID应该是DSL001,而不是DSL016,因为在此之前还有其他十五个其他客户的项目(参见铜和PHP Collab,它遵循全球项目ID逻辑,如反对每个客户端项目ID逻辑)。此项目ID将显示在由AM / PM创建的前端项目页面上,并且还可用作成本估算,发票等内容的参考ID。

因此,从工作流计划的角度来看,这是我遇到问题的地方。我对MySQL的理解是,如果我想遵循自己的项目ID逻辑,就必须为每个客户创建一个新表,以包含有关其项目的所有数据,以便DB可以正确输出唯一身份证号码。

但是,我对C5的理解是,例如,如果在创建此应用程序的过程中,我决定将项目表单创建为要插入前端模板的块,db.xml文件将在DB中为所有客户端创建一个通用项目数据表,而不是每个客户端一个。

有什么建议我如何在C5框架的背景下完成我想要做的事情?

如果某些事情不清楚,我可以展示一些项目页面看起来的模型。

谢谢!

1 个答案:

答案 0 :(得分: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等。