这是一个一般的数据库模式问题,与具体的 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 等。