0

您对将动态语言中的对象保存在文档数据库中的最优雅方式有任何见解吗?

我在 C# 方面有扎实的背景,并且刚刚开始使用 Python 进行编程。同时,我正在尝试学习 MongoDB 的诀窍。

现在我想知道:将数据保存到 MongoDB 数据库的最优雅的方法是什么?我考虑了几种方法:

  1. 使我所有的 Python 类都能够创建表示其状态的字典和列表图。此外,让他们能够从这样的图表初始化他们的状态。当我想持久化一个对象时,我会询问它的图形表示并持久化。当我想获取一个对象时,我将检索一个文档图并将其提供给__init__我的类的方法。

  2. 创建一个单独的 Mapper 类,能够检查给定对象并创建字典和列表图,然后我可以将其存储在 MongoDB 中。映射器还将负责创建其数据已从数据库中检索到的对象。

  3. 我尝试了mongoengine,一个文档对象映射器。但是,当它迫使我从特定类(文档)派生我的类时,我感到很失望。它让我想起了微软的 Entity Framework 1.0 和缺乏 POCO 的支持。我不想被迫从特定的类派生。感觉不对,但我不确定这是否真的是动态语言中的问题。

我的 C# 背景是否阻碍了我的思考?我确信我还没有理解动态语言提供的灵活性程度,因此任何关于最佳实践的建议或提示都将不胜感激。

谢谢你。

4

1 回答 1

1

Python 定义了几种特殊方法,例如getstate和许多其他方法,以允许您的类准确定义如何最好地序列化和反序列化它们的实例。它们都由pickle模块在内部使用(然后使用此信息生成“blob”,即一串字节,并从此类 blob 中恢复对象),但是,如果您希望通过直接存储图而不是存储图来获得更好的索引通过不透明的斑点,这基本上是一个调整pickle程序以在将图形变成斑点之前停止的问题。我认为你必须通过复制粘贴编辑来做到这一点pickle.py(因为它不是为了通过更优雅的方法(如子类化)以这种方式定制的),但这仍然可以为你节省大量的工作重做这一切刮。

我相信这种方法介于您的选项 1 和 2 之间——类只需要根据特定需求定义此类特殊方法,并且编排各种可能性所需的大部分工作将由您的 pickle-variant 处理(就像对于序列化形式为 blob 的“正常”情况,它由 pickle 本身处理)。

于 2010-02-25T22:25:54.953 回答