繁体   English   中英

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

[英]Storing Serialized Data in Relational DBMS (i.e. MySQL)

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

谢谢。

预警:这只是我的观点。

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

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

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

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

例如,如果您将JSON格式存储为{A:'valueA',B:'valueB'}并且想要获取B ='realvalueB'的所有文档,则必须获取所有行,将它们转换为php另外一方面,如果你使用MongoDb,你会发出一个查询:db.myobjects.find({B:'realvalueB'}),它只会返回匹配的文件,而json_decode和make comparis ... 这只是为什么它更好的一个简单例子。 你可以在这里这里找到你可以用mongodb查询做什么。

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

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

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

另外,如果您计划迁移到基于文档的Mongo,我认为从MySQL(或SQLite除了可靠性之外的各方面都是相同的)开始没有意义。
对我来说,没有单一的[合理]理由来启动一个存储不当的项目,在其中付出一些努力,并最终从头开始重写所有内容。

只需在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节“数据类型存储要求”

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM