在关系DBMS(即MySQL)中存储序列化数据

时间:2012-02-01 12:46:12

标签: php mysql database

虽然我希望最终切换到更新,更轻,和/或更快的DBMS(例如适当命名的轻量级SQLite或基于文档的Mongo-后者不会出现此问题),我我目前正在坚持使用标准的MySQL系统。虽然我意识到这个问题的任何答案都可能是意见之一,但我想知道如何在MySQL [或其他基于关系的]数据库的单个列中存储序列化数据,如数组或散列映射。大多数数据访问都是通过PHP执行的,但我想以标准格式(即JSON或二进制哈希映射 - 最好是后者)存储数据,而不是转储的PHP数组的纯文本。这样做的原因是我可以从Python,编译的C / C ++应用程序或命令行执行一些数据查询。

感谢。

4 个答案:

答案 0 :(得分:2)

预警:这只是我的意见。

如果您计划从存储它的方式以外的方式查询数据(例如从PHP存储,从C / C ++或甚至命令行查询),我强烈建议您不要将整个数据结构存储在一列中。相反,我建议您创建数据模型以更好地支持您的查询(例如,将hashmap存储为映射到hashmap的id的一组名称/值对)。然后在代码中创建一个模型层来处理代码层和数据库层之间的转换。

当您需要将数据存储到数据库中时,只需在PHP代码中调用相应的方法/函数,并传递hashmap。当您需要从数据库加载数据时,在模型层中调用相应的方法/函数,传递散列映射的ID(或任何相关的标识符) - 并返回哈希映射。

这样,除了以后更容易查询数据之外,如果/当您更改数据库引擎时,您需要做的就是更新模型层中的一些方法/函数。

答案 1 :(得分:1)

如果你想在你的MySQL中存储JSON,你可以考虑使用像MongoDB这样的文档存储,因为这些数据库引擎能够通过文档进行查询。

例如,如果您将格式存储在 {A:'valueA',B:'valueB'} 中,并希望获得B ='realvalueB'的所有文档,那么必须获取所有行,使用json_decode将它们转换为php对象并进行比较...另一方面,如果使用MongoDb,则可以进行查询:db.myobjects.find({B:'realvalueB'})和它只返回匹配的文件。这只是为什么它更好的一个简单例子。您可以使用mongodb查询找到herehere

因此,如果您的json文档包含一些有用的信息,并且您可以按该信息进行过滤,那么最好使用文档存储。

如果你使用MySQL(因为它更成熟,你更熟悉它等),那么选择“真正的”关系模型总是好的,但如果你使用它,你总是可以把一些东西放在blob中案件允许你这样做。

答案 2 :(得分:0)

我根本不会存储它。
我会尝试用数据制作一个关系模型,而不是做一些奇怪的,显然没用的东西。它在noSQL时代之前已经完成了很多次,并且肯定可以再一次完成。

另外,如果你打算转向基于文档的Mongo,我认为从MySQL(或SQLite除了可靠性之外的各方面都是一样的)开始没有意义。 对我来说,没有单一[合理]的理由来启动一个存储不当的项目,付出一些努力,最终从头开始重写所有内容。

答案 3 :(得分:-1)

只需在MySQL中使用TEXT字段,在PHP中使用json_encode()和json_decode($ v,true)。您可能希望将这些函数包装在您自己的代码中,以便在需要用其他函数替换此存储模型时,您可以在一个位置执行此操作,而不是在文件中跟踪所有出现的json_encode和json_decode。

如果你打算留下非常大的哈希值,你可能需要调整一些配置(如http://dev.mysql.com/doc/refman/5.0/en/blob.html所述):

  

BLOB或TEXT对象的最大大小由其类型决定,   但实际上你可以在客户和客户之间传输的最大值   服务器由可用内存量和大小决定   通讯缓冲区。您可以通过更改消息缓冲区大小   更改max_allowed_pa​​cket变量的值,但您必须这样做   所以对于服务器和客户端程序。例如,两者   mysql和mysqldump使您可以更改客户端   max_allowed_pa​​cket值。请参见第7.9.2节“调整服务器”   参数“,第4.5.1节,”mysql - MySQL命令行工具“,和   第4.5.4节“mysqldump - 数据库备份程序”。你也可以   想要比较数据包大小和数据对象的大小   存储有存储要求,请参见第10.5节“数据   输入存储要求“

显然使用存储过程来保存和读取哈希值。

以上假设您只想存储和检索数据。如果您想进行任何搜索或聚合,请尝试寻找其他方法。