聪明还是不聪明:在CF中将序列化数据(dotnet-protobuf、protobuf-net、json)持久化到关系型数据库中

7
我已经开始阅读一些与协议缓冲区相关的帖子。这种序列化方法似乎非常适合在网络服务器和移动设备之间传输数据。有没有人考虑过使用这样的方法来保存和检索移动设备本身的数据(即传统数据库/ORM层的替代品)?我们目前使用自定义反射-based ORM。我们想摆脱在移动设备上使用反射。而且,既然我们必须发送/接收序列化数据,这似乎是一个很好的选择。
  • 数据将存储在哪里?
  • 数据将如何查询?

是否有意义将数据存储在传统数据库(SqlCE或SqlLite)中,其中包含几个“可搜索”列,然后有一列用于序列化数据?

想法?我是否走了极端?

更新:同样的“理论”也适用于其他类型的序列化数据...例如JSON。我无法找到在紧凑框架上存储和查询序列化数据的NoSQL选项。如果有人知道,我也会对该选项感兴趣。

关于对象数据库的评论 我尝试过db4o和Perst。 db4o非常容易使用。我在“现实生活”中使用它,性能、可用性和可维护性都非常好。他们的许可费用对我们来说有些荒谬。 Perst比db4o差了一步,但也很容易使用。它“只需运行”并且速度快(尽管查询不太好)。他们的授权费用非常实惠,但是他们的某些授权对我承包的(大型、知名的)公司不可接受。这就把我带到了现在。


我很惊讶没有得到回应,本以为这会是一个很好的 Stack Overflow 问题。难道这个问题比我想象中还要愚蠢? ;) - Steve
@Steve:我认为这是一个非常好的问题。我有自己的理论(现在先保留),但我其实是在等待Marc是否有任何见解。 - ctacke
@ctacke:我很想知道你的想法。我还没有收到任何回复,很快就要给出我的建议了。我已经做了一些测试,对这个策略感觉非常好,但希望从一些在这些领域拥有丰富知识和经验的人那里得到一些智慧。 - Steve
3个回答

4
既然没有其他人试图回答这个问题,那我就发表一下我的意见。请注意,我从未使用过protobuf(这就是为什么我之前没有回答的原因),所以这些都只是基于我对事物的大致理解以及如果我需要解决这个问题,我会如何处理。

首先,我对将二进制大对象存储到关系型数据库中有所保留。这可能要追溯到我在VB6时代的不好经历,虽然可能已经失效,但它仍然让我停下来思考。因此,在尝试之前,我可能会调查一些其他的对象存储机制(例如Perstdb4o)。

作为尽职调查,我还会至少测试将二进制大对象存储到SQLCE数据库中的方法。为什么选择SQLCE而不是SQlLite或其他任何关系型数据库?因为SQLCE支持TableDirect,我是一个巨大的粉丝。每当您可以访问数据而无需使用缓慢的查询处理器时,您就会走在前面。

因此,我会创建一个表,给它一些小的查找列,然后是一个包含一些大二进制blob的图像列(实际blob对于测试并不重要,但它需要与您在生产中预期的大小相当)。然后,我会为每个搜索列添加索引。

我会用几千条记录填充表,然后测试我能够寻找所需键的速度(我知道那很快),更重要的是我可以重新激活我的对象的速度。

然后,我会权衡各种选择的成本(开发时间、机会成本、可重用性等)并做出决定。我可能也会在博客上发布结果,因为这似乎是一个相当广泛的问题。


感谢您的回复。请参阅原始问题中关于db4o和Perst的注释。我一直在进行一些试运行,使用协议缓冲区和json。最初的结果让我感到希望,并且比我们一直使用的基于反射的方法显着更快。我将研究您提到的SqlCE方法并更新我的测试。我还会考虑您建议的在此问题中记录结果的建议。 - Steve

0

很抱歉当时没有看到这个问题(抱歉,我并不会看到每一个问题,虽然我关注protobuf-net标签,但对于protocol-buffers我并不是那么的警觉)。这是一个非常有趣的问题;与关系型数据库相比,我认为这种方法在与文档数据库(而不是关系型数据库)进行比较时具有巨大的潜力。如果你只是简单地放置二进制大对象,那么它似乎有点过度设计,但至少应该可以工作。我确实经常使用类似的设置来将数据加载到离线应用程序中,虽然不是特别针对移动设备,但是相同的概念适用。

特别是,在想要重新启动“系统”即完整状态时,这种以文档为中心的方法非常有用。它们不像关系型数据库那样简单/灵活地进行即席查询。当然,一种选择是重新启动并在内存中查询(例如,在C#中,对于重新启动的数据进行的LINQ-to-Objects查询几乎与在关系型数据库中对数据进行的LINQ-to-SQL查询无异)。


最初的测试非常积极。我想针对对象数据库选项以及其他各种方法进行更多基准测试,比较速度。我希望发布一些结果供他人查看和尝试。 - Steve

-1

如果您查看MariaDB 10,这是一个至关重要的问题,因为我们引入了动态列,它们将结构化对象数据库存储在blob中https://mariadb.com/kb/en/dynamic-columns/。客户端从blob到任何格式的转换可以很容易地在客户端上完成,因为我们将API嵌入了C驱动程序中。我认为我们只启用了json导出,但通过一些努力,这可能可以扩展到protobuf序列化和反序列化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接