【问题标题】:appengine data structure - child, parent or both?appengine 数据结构 - 孩子、父母或两者兼而有之?
【发布时间】:2010-01-09 22:41:29
【问题描述】:

我正在尝试使用 google appengine 并将数据存储与 php 和 quercus 一起使用。 我不熟悉 Java 或 Python,所以在这里进行了大量的学习。我已经进行了页面渲染,并且能够将数据进出数据存储区。

我正在构建的应用程序包含用户、组、主题和 cmets。 一个组有用户,用户可以属于多个组。 当用户登录时,我会显示他们所属的组以及这些组的主题。

我已经在 MySql 中构建了这个,现在正在研究如何将它放入 appengine。

在我看来,组是父级,其主题和用户是子级。主题有 cmets 作为子项。

但是,当用户登录时,我必须获取用户所属的组。因此,我正在考虑一个单独的父实体来存储用户、联系人和登录信息,并且该用户将拥有包含每个用户所属的组 ID,以便我知道要获取哪些组。

用户是组的孩子,因此我可以显示组的所有用户,但也许有更有效的方法来做到这一点。

像这样

Groups(EntityGroup) - GroupName, Owner ↳ 主题 - 主题名称、内容、所有者 ↳ 评论 - 评论,所有者 ↳ 用户 - 用户 ID 用户(实体组) - 用户名、电子邮件、密码 ↳ userGroup - groupid

那么,当用户登录时,逻辑是这样的

SELECT groupid FROM Users where password=hashofpassword+uniqueusername foreach(groupid 作为组){ 从组中选择用户; 从组中选择主题 foreach(topicid 作为主题){ 选择厘米; } }

我这样看的原因是因为当用户登录时,我不能很好地查看用户的每个组,我只想将登录信息存储在一个地方。

请不要将我推荐给 code.google.com 文档,因为我已经经历了很多次,但我并不完全了解 appengine 发生了什么。

另外,我在上面概述的方式是可视化数据存储的正确方式吗?我认为可视化数据一直是一场斗争,这可能会导致一些挑战。

【问题讨论】:

    标签: google-app-engine data-structures google-cloud-datastore


    【解决方案1】:

    在我看来,用户和组之间存在多对多关系,是吗?一个用户可以属于多个组,一个组可以有多个订阅它的用户。表示这一点的最合乎逻辑的方式是 AppEngine 给 User 实体一个 ListProperty,它包含他所属的组的 eahc 的密钥。在 Python 中,它看起来像这样:

    class User(db.Model):
        userName = db.StringProperty()
        email = db.EmailProperty()
        password = db.StringProperty() 
        groups = ListProperty(db.Key)
    

    每当用户订阅组时,您都会将组的密钥添加到组列表中。

    同样,Group 实体将有一个 ListProperty,其中包含属于它的每个用户的键。

    您不希望将用户设置为组的子级,因为这会使用户很难或不可能属于多个组。

    您将遇到的困难是,当用户加入群组时,您需要在事务中更新群组——您一次只能将一个用户添加到群组中;否则,您有可能一个写入将覆盖另一个。据推测,用户可以在事务之外更新,因为他或她一次只能加入一个组。

    【讨论】:

    • 谢谢亚当,这证实了我的想法。我不必担心一次将用户添加到多个组中。我并没有考虑用户实体或组的“列表属性”,尽管我已经看过几次了。我在为用户所属的每个组考虑一个孩子,但我会仔细研究 ListProperty,因为这听起来像是要走的路。感谢您非常彻底的回复。
    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 2011-06-17
    • 2015-10-14
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多