2011-12-23 2 views
4

Я ищу совет по чему-то, что я создаю: у меня есть приложение PHP, которое создает, обновляет и удаляет записи, но оно тесно интегрировано в устаревшую базу данных, не основанную на SQL, и это становится действительно очень медленным, когда вы начинаете делать много вызовов БД. Я хочу сделать это более опытным опытом для пользователя, так что, когда пользователь создает или редактирует что-то, все переменные, массивы и объекты должны быть записаны в базу данных MySQL, а затем начнется фоновый скрипт эти записи и обрабатывать запрос к устаревшей базе данных.Советы по созданию фоновых задач PHP-MySQL

Поэтому мне понадобится одна таблица, которая отслеживает задачу, а затем другую таблицу, которая будет отслеживать все переменные, объекты, массивы и их значения.

Вот что я имел в виду структуру БД 2-й таблицы должны быть:

  • колонна для хранения TASK_ID
  • Столбец для хранения, если переменная является массивом или объектом, или NULL, если это простой var.
  • Столбец для хранения имени массива/объекта var.
  • Столбец, если это объект, а затем сохранить тип объекта.
  • Столбец для хранения идентификатора группы массива/объекта. (Для отслеживания того, что вары принадлежит объекту/массиву)
  • колонка хранить имя простого вара, метод или имя в объекте/массив
  • Колонны для хранения значения вара

Вот бы несколько примеров:

1 | NULL  | NULL  | NULL   | NULL | 'foo'  | 'bar' 
1 | 'array' | 'foo_array' | NULL   | 1 | 'foo'  | 'bar' 
1 | 'array' | 'foo_array' | NULL   | 1 | 'foo2'  | 'bar2' 
1 | 'object' | 'foo_obj' | foobar_object | 2 | 'foo_method' | 'bar' 
1 | 'object' | 'foo_obj' | foobar_object | 2 | 'bar_method' | 'foo' 

это, кажется ли, как слишком сложный подход? Я что, сумасшедший и передумал? Может ли кто-нибудь подумать о том, как лучше подойти к этому?

Спасибо.

+0

Похоже, что этот подход может ухудшить впечатление, поскольку пользовательские взаимодействия не будут записываться в вашу базу данных до тех пор, пока очередь не будет обработана. По какой причине вы не можете мигрировать? –

ответ

3

Использование serialize()

Он будет генерировать специально отформатированную строку (вы можете хранить в базе данных). Строка отличается тем, что unserialize() может перевести ее обратно в исходное значение php. Он поддерживает тип, значение и структуру переменных. Пользовательские объекты и многомерные массивы не представляют проблемы.

Вы по-прежнему нуждаетесь в части вашей таблицы db, это просто делает для вас много работы и делает это очень хорошо.

+0

Я никогда не использовал сериализацию. Не могли бы вы разобраться? – Slowfib

+0

Вы просто взорвали мой мозг! Спасибо, ясно, это будет намного легче, чем я ожидал! – Slowfib

1

Я бы создал таблицу с первичным ключом (возможно, task_id), а затем столбец для хранения сериализованного хэша переменных (или, может быть, json encoded). Вы даже можете сохранить это в исходной таблице, которая отслеживает задачу. Я предполагаю, что таблица будет иметь столбец состояния со значениями для:

ожидания, обработки, полной и ошибки

Когда мы делаем это в доме, мы просто использовать TINYINT (1) неподписанных колонки , Вы также можете добавить поле timestamp или три, когда задача была создана, запущена и закончена. Все это довольно прямолинейно, как только вы начнете катиться.

+0

Да, точно, идентификатор статуса и несколько других вещей, чтобы идентифицировать линию. И да, вы правы, мне, вероятно, нужна только одна таблица для всех этих данных. Почему вы храните сериализованный хеш переменных? Почему бы просто не сохранить его, как есть? Только для безопасности? – Slowfib

+0

Обычно я храню его как хэш, так что его легче анализировать, и я могу хранить неопределенное количество данных. Для некоторых задач могут потребоваться две переменные, другим может потребоваться 50. Используя хэш, я могу хранить всю информацию в одном столбце. – mylesmg

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