2013-03-15 4 views
0

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

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

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

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

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

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

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

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

Спасибо!

ответ

1

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

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

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

Смежные вопросы