конкретный рабочий процесс базы данных5

Я нахожусь на стадии планирования веб-приложения для управления проектами / совместной работы, аналогичного Copper Project или PHP Collab, с использованием конкретной 5 в качестве моей структуры.

Есть несколько функций, которые я хочу интегрировать, но я не совсем уверен, как этого добиться, глядя на то, как таблицы БД генерируются с блоками.

Я имею в виду следующие функциональные возможности: 1) Когда новый клиент создается менеджером по работе с клиентами или менеджером проекта, они должны назначить клиенту трехсимвольный префикс. Пример: если (по какой-то дикой удаче) я добавлю Diesel в качестве клиента, я бы хотел назначить им префикс DSL.

2) Когда менеджер по работе с клиентами или менеджер проекта создают новый проект, идентификатор проекта должен иметь прямое отношение к клиенту, а не к общему количеству проектов для всех клиентов. Другими словами, идентификатор проекта для первого проекта Diesel со мной должен быть DSL001, а не DSL016, потому что до этого было пятнадцать других проектов для других клиентов (см. Copper и PHP Collab, которые следуют логике глобального идентификатора проекта, поскольку в отличие от логики идентификатора проекта для каждого клиента). Этот идентификатор проекта будет отображаться на странице внешнего интерфейса проекта, созданной AM / PM, а также использоваться в качестве ссылочного идентификатора для таких вещей, как смета расходов, счета-фактуры и т. Д.

Вот здесь я и сталкиваюсь с проблемой с точки зрения планирования рабочего процесса. Мое понимание MySQL таково, что если я хочу следовать своей логике идентификатора проекта, для каждого клиента должна быть создана новая таблица, содержащая все данные, касающиеся их проектов, чтобы БД могла правильно выводить уникальный идентификационный номер.

Однако я понимаю C5, что если, например, в процессе создания этого приложения я решу создать форму проекта как блок, который будет вставлен во внешний шаблон, файл db.xml создаст общий таблица данных проекта в БД для всех клиентов, а не по одной для каждого клиента.

Любые предложения, как я могу выполнить то, что я хочу сделать в контексте структуры C5?

Если что-то неясно, могу показать несколько макетов того, как будет выглядеть страница проекта.

Спасибо!


person Continuity    schedule 15.03.2013    source источник


Ответы (1)


Это общая проблема схемы базы данных, не имеющая ничего общего с Concrete5. Ваша идея о необходимости отдельной таблицы для каждого клиента просто так, чтобы MySQL мог генерировать уникальные идентификационные номера, далек от истины.

В схемах баз данных существует общий принцип, согласно которому номер «ID» записи должен использоваться только для уникальной идентификации записей внутри (в вашем приложении и коде базы данных) - вы почти никогда не должны использовать первичные идентификационные номера для реальной "бизнес-логики". В вашем случае у вас есть идентификатор проекта, в котором есть как буквы, так и цифры, поэтому, даже если вы хотите использовать для этого идентификатор, сгенерированный MySQL, вы не сможете (потому что эти идентификаторы являются только целыми числами, а не буквами).

Кроме того, создание отдельных таблиц для одного и того же типа данных - полная противоположность тому, как работают базы данных. Вместо этого вы хотите создать одну таблицу для клиентов, а другую - для проектов. В клиентской таблице будет поле «id» (номер автоинкремента) и поле префикса клиента («DSL» в вашем примере). Затем таблица проектов имеет собственное поле «id» (опять же, номер автоинкремента) и «идентификатор клиента», который связывает этот проект с записью в таблице client. Тогда у вас будет еще одно поле в таблице проектов для «номера проекта». Это поле номера проекта - это то, что вы показываете пользователям (вы должны объединить его с трехбуквенным префиксом клиента - так что на самом деле вы храните два отдельных значения в базе данных, но ваши пользователи будут увидеть только одно комбинированное значение, потому что именно так вы выводите его на страницу).

Это поле «номер проекта» не должно быть автоматически увеличивающимся числом, потому что, как вы обнаружили, 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, вероятно, не лучший фреймворк для такого рода проектов. Возможно, вы захотите изучить более общую структуру, подходящую для веб-приложений, таких как CodeIgniter, Symfony, CakePHP, Kohana и т. Д.

person Jordan Lev    schedule 18.03.2013