Java MPTT,如何使用JDO在googleappengine中实现?

Java MPTT,如何使用JDO在googleappengine中实现?,java,google-app-engine,jdo,mptt,Java,Google App Engine,Jdo,Mptt,我正在从PHP/MySQL迁移到Google应用程序引擎,并使用JDO作为数据存储的接口。将支持修改的预订单树遍历(MPTT)的表迁移到JDO模型的推荐方法是什么?在花了一些时间研究了在GAE数据存储上实现分层数据存储的不同方法后,我决定尝试直接实现MPTT。以下代码段显示了该模型: @PersistenceCapable(identityType = IdentityType.APPLICATION) public class MPTTObject { @PrimaryKey

我正在从PHP/MySQL迁移到Google应用程序引擎,并使用JDO作为数据存储的接口。将支持修改的预订单树遍历(MPTT)的表迁移到JDO模型的推荐方法是什么?

在花了一些时间研究了在GAE数据存储上实现分层数据存储的不同方法后,我决定尝试直接实现MPTT。以下代码段显示了该模型:

@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数据存储上分层数据存储的一些有用链接如下:


在花了一些时间研究了在GAE数据存储上实现分层数据存储的不同方法之后,我决定尝试直接MPTT实现。以下代码段显示了该模型:

@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数据存储上分层数据存储的一些有用链接如下:


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


您可以看看MPTT的JPA实现,并将相同的思想应用到JDO:


为什么选择MPTT?对于大多数情况,祖先列表可能是更好的选择。为什么选择MPTT?对于大多数情况,祖先列表可能是一个更好的选择。您不应该将密钥存储为编码字符串,而应该将它们存储为
Key
对象。我使用编码字符串的原因是能够将应用程序移到app engine之外,而不需要太多的修改。关键对象是AppEngine独特的,而通过使用编码字符串,我仍然可以利用索引应用程序引擎提供。但是,使用编码字符串,您将遇到其他问题,例如从主/从移植到HRD。是的,您完全正确,但我没有考虑到这一限制在我的决定中,因为我直接从人力资源部开始。但是,您能告诉我使用编码字符串可能导致的任何其他潜在问题吗?(我的GAE经验只有一个月:()提前非常感谢!您不应该将密钥存储为编码字符串,而应该将它们存储为
密钥
对象。我使用编码字符串的原因是能够在较少修改的情况下将应用程序移出app engine。密钥对象是app engine独有的,而通过使用编码字符串,我仍然可以利用索引AppEngine提供了。使用编码字符串,你会遇到其他问题——比如从主/从移植到HRD。是的,你完全正确,但是我没有考虑到这个限制,因为我从HRD开始直接。但是,你能指出我的其他潜在问题吗?使用编码字符串?(我使用GAE的经验只有一个月:()提前感谢!