在GQL中更喜欢什么; StringListProperty还是ListProperty?

时间:2011-01-12 19:34:34

标签: performance google-app-engine gql gqlquery

我正在构建一个具有多对多关系的应用程序; 实体“图片”的项目可以链接到任意数量的图库(“图库”)。当然,画廊可以容纳任意数量的图片。

因此,按照Google Suggestion的说法,我将使用“图片”中的列表来保存“图库”的外键。这是BigTable方法。

(旧式的Relational DB方法是在'Picture'和'Gallery'之间有一个表/实体。)

这是我的问题:存储密钥时,我应该在“图片”上找到“StringListProperty”还是“ListProperty(db.Key)”更好?

我看到 StringList 的一个原因是,我可以存储其他值,然后是Keys,但另一方面,无论如何都是脏样式。但我也很确定Google建议不要在实体上使用多个List,因为索引会爆炸。所以这会让我成为一个后门。

对于类型为“ Key ”的 ListProperty ,如果该值实际上是一个Key,则一个点将是自动验证。

由于将字符串转换为键非常容易,反之亦然,我认为没有任何理由可以选择其中一种列表类型。

说到性能问题,我不知道如何测试它 - 但看起来这将是决定的主要因素。

对您的输入感到好奇。特别是如果某人已经对此进行了性能测试,或者会非常友善并且做到这一点。

干杯, //汉纳斯

2 个答案:

答案 0 :(得分:0)

如果您打算存储密钥列表,请使用db.ListProperty(db.Key)。它们将以二进制表示形式存储,这比您在字符串列表中使用的字符串表示更紧凑。

将键与列表中的其他对象混合是很混乱的。在一个实体中有多个列表是可以的,只要你不在同一个自定义索引中索引多个列表 - 这就是导致爆炸索引的原因。

答案 1 :(得分:0)

使用db.ListProperty(db.Key),这将使数据获取比字符串更容易..如果Gallery模型具有属性pic_list,其类型为db.ListProperty(db.Key),其中包含图片实体的键..假设图片是你的实体的名称..然后Picture.get(// GalleryObject // .pic_list)将获得所有的图片..