在数据库中存储序列化的ruby对象

时间:2010-02-25 10:08:51

标签: mysql ruby

我想在db(mysql)中存储非常大的序列化Ruby对象集。

1)缺点和优点是什么? 2)有其他方法吗?
3)如果物体真的很大,技术上有什么困难? 4)如果对象真的很大,我会在序列化和反序列化时遇到内存问题吗?

3 个答案:

答案 0 :(得分:4)

<强>赞成

  • 允许您存储任意复杂对象
  • 简化了您的数据库模式(无需表示这些复杂对象)

<强>缺点

  • 使您的模型和数据层复杂化
  • 可能需要处理多个版本的序列化对象(随着时间的推移更改对象定义)
  • 无法直接查询序列化列

<强>替代

如前所述,对象数据库或面向文档的数据库可能符合您的要求。

<强>难点

如果您的对象非常大,则在DBMS和程序之间移动数据时可能会遇到困难。您可以通过分离对象数据的存储和与对象相关的元数据来最小化这一点。

内存问题

对于足够大的对象,肯定会耗尽内存。它还取决于您使用的序列化类型。要知道您将使用多少内存,您需要分析您的应用。我建议使用ruby-prof,bleak_house或memprof。


我建议尽可能使用非二进制序列化。您不必仅为整个数据库使用一种类型的序列化,但这可能会变得复杂和混乱。

如果您希望继续这样做,那么使用面向对象的dbms(如ObjectStore)或面向文档的dbms(如CouchDB)可能是您的最佳选择。它们设计得更好,并且针对对象序列化。

答案 1 :(得分:2)

作为替代方案,您可以使用众多NoSQL数据库中的任何一个。如果您可以将对象序列化为JSON,那么它应该很容易存储在CouchDB中。

答案 2 :(得分:1)

您必须记住,磁盘空间方面的序列化对象远远大于您以自己的方式保存它们,并以您自己的方式加载它们。来自硬盘驱动器的I / O速度非常慢,如果您正在查看复杂对象,这会占用大量处理能力,实际上加载文件并在每次启动时处理它可能会更快;或者以一种易于加载的方式保存数据。