0

我有一个 PHP 应用程序,它可以连接到多个后端(目前是 MySQL 或 XML),并且我也在尝试使用 MongoDB。我显然在努力解决的一个看似次要的问题是 Mongo 要求 '_id' 是主键的名称。后端通常由应用程序很好地抽象,但应用程序确实需要定期使用 id,所以我使用类似的代码访问它,$result['id']到目前为止,它已经很好地抽象了。

但是现在我面临着试图(有效地!)处理一个不允许我使用 'id' 作为其主键的数据库,而且我不确定最好的选择是什么。到目前为止,这是我的想法:

  1. 只需保留 Mongo 的 '_id' 值,并将应用程序变量设置$id"id""_id"取决于后端。应用程序应该使用$idID 字段来访问,而不是硬编码的"id". 请注意,所有其他字段都通过其字符串名称访问,例如,$result['user']这将违反应用程序中的规范。

    优点:允许在可能的情况下直接返回 MongoCursor 对象,确保最小的内存使用和快速访问数据。

    缺点:不向后兼容,需要(相当繁琐)重构使用此应用程序的任何代码。

  2. 将返回的 MongoCursor 对象包装在一个新的迭代器类中,该迭代器类返回具有适当"_id"映射到的每个项目"id"。当与 Mongo 通信时,应用程序会将入站调用映射"id"回。"_id"

    优点:保留 1. 的大部分内存效率,同时防止大多数向后兼容问题。

    缺点:不完全确定如何实现这样的对象,不相信它可以干净地完成,或者它实际上会像我想象的那样工作。为了做到这一点,我还想为其他后端实现类似的迭代器包装器。

  3. 使用 中所述将结果加载到内存iterator_to_array()MongoCollection.find(),进行适当的转换,然后返回数组。

    优点:概念上比 2. 简单,可以很好地与我的应用程序的其余部分配合使用。

    缺点:在内存方面显然是一个糟糕的选择。鉴于该应用程序不是世界末日,但仍然不理想。

这些选项中的任何一个是否作为该问题的特别合理和强大的解决方案脱颖而出?任何人都可以建议以与后端无关的方式处理主键的其他替代方案吗?未来可能会出现额外的后端,因此也欢迎与其他数据存储系统相关的给定方法的问题或好处。

我目前倾向于 2.,但我欢迎你的想法。

4

1 回答 1

0

我最终选择了选项 2,包装了迭代器并隐藏了现有的 '_id' 字段。不干净,也不优雅,但我能用我所拥有的做最好的。在这方面工作真的让我很喜欢 Python。

于 2012-06-28T23:18:11.050 回答