【问题标题】:MPTT, how to implement in Google App Engine using JDO?MPTT,如何使用 JDO 在 Google App Engine 中实现?
【发布时间】:2011-10-22 04:50:11
【问题描述】:

我正在从 PHP/MySQL 迁移到 Google App Engine,并使用 JDO 作为与数据存储区的接口。将启用了修改前序树遍历 (MPTT) 的表迁移到 JDO 模型的推荐方法是什么?

【问题讨论】:

  • 为什么选择 MPTT?在大多数情况下,祖先列表可能是更好的选择。

标签: java google-app-engine jdo mptt


【解决方案1】:

在花了一些时间搜索在 GAE 数据存储上实现分层数据存储的不同方法后,我决定尝试直接 MPTT 实现。以下代码 sn -p 呈现模型:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class MPTTObject {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
    private String encodedKey;

    @Persistent
    private String parentEncodedKey;

    @Persistent
    private int left;

    @Persistent
    private int right;

如果数据存储操作是读取密集型的,该解决方案效果很好,但当操作是写入密集型时,它就相当“繁重”了。这一事实与必须在 GAE 中完成操作的时间限制相结合,使得该解决方案的吸引力降低。

另一种似乎更有效的方法是为层次结构中的每个节点存储父子节点的完整列表。

有关 GAE 数据存储上的分层数据存储的一些有用链接如下:

【讨论】:

  • 您不应该将您的密钥存储为编码字符串 - 而是将它们存储为 Key 对象。
  • 我使用编码字符串的原因是能够将应用程序移到应用程序引擎之外,并且尽可能少地进行修改。关键对象是应用引擎唯一的,而通过使用编码字符串,我仍然可以利用应用引擎提供的索引。
  • 使用编码字符串,但是,您会遇到其他问题 - 例如从主/从移植到 HRD。
  • 是的,你说的完全正确,但我在决定中没有考虑到这个限制,因为我直接从 HRD 开始。但是,您能否指出使用编码字符串引起的任何其他潜在问题? (我的 GAE 经验只有一个月 :( ) 提前非常感谢!
【解决方案2】:

您可以查看 MPTT 的这个 JPA 实现,并将相同的想法应用于 JDO:

https://github.com/hacker-works/mptt-jpa

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2012-06-14
    • 2023-04-03
    相关资源
    最近更新 更多