0

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

我想集成一些功能,但我不完全确定如何实现这一点,看看 DB 表是如何用块生成的。

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

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

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

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

有什么建议可以在 C5 框架的上下文中完成我想要做的事情吗?

如果有什么不清楚的地方,我可以展示一些项目页面外观的模型。

谢谢!

4

1 回答 1

1

这是一个一般的数据库模式问题,与具体的 Concrete5 无关。您关于为每个客户端需要一个单独的表以便 MySQL 可以生成唯一 ID 号的想法已经过时了。

数据库模式有一个一般原则,即记录的“ID”号只能用于在内部(在您的应用程序和数据库代码中)唯一地标识记录——您几乎不应该将主 ID 号用于实际的“业务”逻辑”。在您的情况下,您有一个项目 ID,其中包含字母和数字,因此即使您想为此使用 MySQL 生成的 ID,也不能(因为这些 ID 只是整数,而不是字母)。

此外,为相同类型的数据创建单独的表与数据库的工作方式完全相反。相反,您要做的是为客户准备一张桌子,为项目准备另一张桌子。客户端表将有一个“id”字段(自动增量编号)和一个客户端前缀字段(您的示例中的“DSL”)。然后,projects 表有它自己的“id”字段(同样是自动增量编号)和一个“client id”,它将该项目与 client 表中的记录联系起来。然后,您将在项目表中有另一个字段用于“项目编号”。这个项目编号字段是您向用户显示的内容(您可以将其与客户的 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 等。

于 2013-03-18T01:00:36.460 回答