python - GAE组织数据结构问题

标签 python database google-app-engine

好的。我正在与 GAE 合作。我想创建这样的东西:

我有类型“组”“主题”“标签”:

  1. 每个“组”可以有尽可能多的 根据需要“主题”

  2. 每个“主题”可以有多个“标签” 根据需要

  3. 每个“组”可以有多个“标签” 根据需要

它有点像圆圈。

现在我有这样的东西:

class TopicGroup(db.Model):
    value = db.StringProperty(required=True)

class Topic(db.Model):
    title = db.StringProperty(required=True)
    group = db.ReferenceProperty(TopicGroup, 'group', 'topics', required=True)

class TopicTag(db.Model):
    topic = db.ReferenceProperty(Topic, 'topic', 'tags', required=True)
    group = db.ReferenceProperty(TopicGroup, 'group', 'tags', required=True)
    value = db.StringProperty(required=True)

但这并不好(在我的模型中,“主题”只能有一个标签,但我需要“主题”根据需要拥有尽可能多的标签)

好吧,我的脑袋已经有问题了...有人可以帮忙吗?

最佳答案

多对多连接可以作为连接表(或关系模型)实现。在下面的解决方案中,有一个模型包含所有应用于单个 Groups (GroupTags) 的标签,还有一个模型包含应用于 主题(主题标签)。

Tag 本身与对 Tag 的引用解耦允许您执行更改标签拼写等操作,而无需更新每个 GroupTopic 应用了 Tag

此外,该模型还充分利用了 AppEngine 在其他实体引用它们的实体上创建自动反向引用这一事实。在下面的模型中,一个 Group 实体将有一个名为 topics 的属性,该属性是一个查询,它将获取 group 引用指向的所有 Topic 实体那个。类似地,每个 GroupGroupsTags 模型中获取一个 tags 属性,该属性赋予它所有属于的 Tag 实体给它。每个 Tag 实体都有一个 groupstopics 属性,该属性是对分配了给定标签的那些类型的所有实体的查询,使得按标签搜索(非常典型的操作)非常简单。

对于像您这样的系统建模,这是一种非常强大和灵活的方法。

class Group(db.Model):
    # All of my group-specific data here.

class Topic(db.Model):
    title = db.StringProperty(required=True)
    group = db.ReferenceProperty(Group, collection='topics')
    # other topic-specific data here.

class Tag(db.Model):
    text = db.StringProperty(required=True)

class GroupTags(db.Model):
    group = db.ReferenceProperty(Group, collection='tags')
    tag = db.ReferenceProperty(Tag, collection='groups')

class TopicTags(db.Model):
    topic = db.ReferenceProperty(Topic, collection='tags')
    tag = db.ReferenceProperty(Tag, collection='topics')

关于python - GAE组织数据结构问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4004770/

相关文章:

python - 使用 Jinja2 将值传递给 WTForms 字段

google-app-engine - GAE channel API - channel 创建成本

python - 在 python 2.6.x 中读取/写入 csv 文件中的值作为整数列表的字典

Python 单元测试模块差异考虑 `tzinfo=<UTC>` 和 `tzinfo=tzutc()` 不相等

java - 每次将软件分发给新用户时都手动为软件创建新数据库?

sql - 获取前 X 名用户,加上特定用户(如果他们不在前 X 名中)

django - 如何在 Google 应用引擎中通过 Django 添加模型表单?

python - 无法中断 lock.acquire() 而我可以中断 time.sleep()

python - TypeError:强制转换为 Unicode:需要字符串或缓冲区

mysql - 如何生成随机10位数字并放入数据库表中?