2011-12-23 71 views
4

我正在寻找关于我正在构建的东西的建议:我有一个创建,更新和删除记录的PHP应用程序,但它紧密集成在传统的非基于sql的数据库中,当你开始做大量的数据库调用时,它会变得非常慢。 我希望为用户提供更多的背景体验,以便在用户创建或编辑某些内容时,需要将所有变量,数组和对象写入MySQL数据库,然后启动后台脚本以读取这些记录并处理对遗留数据库的请求。关于创建PHP-MySQL后台任务的建议

所以我需要一张表来跟踪任务,然后再跟踪所有变量,对象,数组和值的表。

这里就是我想第二个表的数据库结构必须是:

  • 存储TASK_ID
  • 一列来存储,如果VAR是一个数组或对象A柱,如果它是一个简单的var,则为NULL。
  • 一列用于存储数组/对象var的名称。
  • 一列,如果它是一个对象,则存储它的对象类型。
  • 用于存储阵列/对象组ID的列。 (用于跟踪什么瓦尔属于对象/阵列)
  • A柱以存储对象的简单变种,方法或名称的名称/阵列
  • A柱来存储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

它几乎听起来像这种方法可能会使经验变得更糟,因为在处理队列之前用户交互不会写入您的数据库。任何你无法迁移的理由? – 2011-12-23 20:43:00

回答

3

使用serialize()

它会生成一个特殊格式的字符串(您可以在数据库中存储)。该字符串是特殊的,unserialize()可以将它翻译回原来的php值。它维护一个变量类型,值和结构。自定义对象和多维数组没有问题。

你仍然需要你的数据库表的一部分,这只是为你做了很多工作,并做得很好。

+0

我从来没有使用序列化。你介意阐述吗? – Slowfib 2011-12-23 20:30:57

+0

你刚刚吹嘘我的思想克里斯!谢谢,显然这比我预期的要容易得多! – Slowfib 2011-12-23 20:45:05

1

我会创建一个表有主键(task_id可能),然后一列存储变量的序列化散列(或可能是json编码)。你甚至可以将它存储在跟踪任务的原始表中。我假设表将必须在值的状态栏:

等待, 处理, 完整, 错误

当我们做到这一点的房子里,我们只使用一个TINYINT(1)无符号栏。您也可以在任务创建,启动和完成时添加时间戳字段或三个时间戳字段。一旦你滚动,这一切都很简单。

+0

是的,身份的ID和一些其他的东西来识别该行。而且,是的,你说得对,我可能只需要一张表就可以得到所有这些数据。为什么要存储变量的序列化哈希?为什么不直接存储它?为了安全起见? – Slowfib 2011-12-23 20:50:41

+0

我通常将其存储为散列,以便更容易地解析,并且可以存储无限数量的数据。某些任务可能需要2个变量,其他任务可能需要50个。通过使用散列,我可以将所有信息存储在单个列中。 – mylesmg 2012-01-03 19:56:22