gpt4 book ai didi

python - GAE : from RDBMS to NDB problems

转载 作者:太空宇宙 更新时间:2023-11-04 03:59:05 26 4
gpt4 key购买 nike

我正在学习如何在 GAE 中工作。我已经阅读了很多论文,所有来自 Google 的 NDB 文档以及这里的一些问题。我已经习惯了 SQL,但将我过去 20 年的思维方式转变为 NoSQL 对我来说有点困难,这里提供的所有这些不同的解决方案让我发疯。

我有下一个简单的结构:书籍可以有章节可以投票的章节例如,《哨兵》这本书可以有 3 个章节,每个章节分别有 0、8 和 12 票。

在传统的 SQL 中,我只是制作从 VOTES 到 CHAPTERS 和 BOOKS,以及从 CHAPTERS 到 BOOKS 的外键。

我为我的模型这样做:

class Book(ndb.Model):
title = ndb.StringProperty(required=True)
author = ndb.StringProperty(required=True)
created = ndb.DateTimeProperty(auto_now_add=True)

# Define a default ancestor for all the books
@staticmethod
def bookKey(group='books'):
return ndb.Key(Book, group)

# Search all
@classmethod
def getAll(cls):
q = Book.query(ancestor=cls.bookKey())
q = q.order(Book.title)
books = q.fetch(100)
return books

@classmethod
def byId(cls, id):
book = Book.get_by_id(long(id), cls.bookKey())

# Get all the Chapters for a book
def getChapters(self):
chapters = Chapter.query(ancestor=self).order(Chapter.number).fetch(100)
return chapters

class Chapter(ndb.Model):
""" All chapters that a book have """
title = ndb.StringProperty(required=True)
number = ndb.IntegerProperty(default=1)
created = ndb.DateTimeProperty(auto_now_add=True)

book = ndb.KeyProperty(kind=Book)

# Search by Book (parent)
@classmethod
def byBook(cls, book, limit=100):
chapter = book.getChapters()
return chapter

# Search by id
@classmethod
def byId(cls, id, book):
return Chapter.get_by_id(long(id), parent=book)

class Vote(ndb.Model):
""" All votes that a book-chapter have """
value = ndb.IntegerProperty(default=1)

book = ndb.KeyProperty(kind=Book)
chapter = ndb.KeyProperty(kind=Chapter)

嗯,我的疑问是:

  1. 这种方法是否正确?
  2. 我创建的函数 bookKey() 最好有一个“虚拟祖先”以确保所有实体都使用祖先?
  3. 我是否必须在 Vote 类中定义一本书和一章的引用,因为它是外键(就像我想的那样)?
  4. 是否明确定义了从书中检索章节的方法?我的意思是,在 Chapter 类中,byBook 函数使用了 Book 类中的一个函数。还是我必须避免使用其他实体的函数以获得更干净的代码?
  5. 如何检索某个章节的所有投票?
  6. 获得特定章节和特定书籍的所有投票总和的正确方法是什么?

最后,我将显示一个包含我所有书籍的表格。在表中,我想得到每本书的所有选票的总和。例如:

名字 |票数哨兵 | 30票女巫 | 4票

我怎样才能得到这个信息,特别是统计的选票。

然后,单击书名,我想显示他的所有章节(我想那时候我必须在 Chapter 模型上使用 byBook 函数,对吧?)。

获取此类数据需要哪个GQL?

提前致谢。

最佳答案

好的开始。 GAE 的数据存储有点令人困惑。因为它是无模式的,所以我发现处理实体比处理数据库表更类似于处理内存中的对象/数据结构。

这里有一些我会做的不同的事情:

  • 看来您是在同一个祖先下创作所有书籍的。糟糕的主意。在性能方面把你搞砸了。除非您需要对不在当前代码中的一组书籍执行某些事务性操作,否则这是不正确的。

  • 从 Book.getChapters() 函数看来,您想要将一本书设为一堆章节的祖先。这大概是一个老祖宗的用武之地吧。我没有看到您创建章节的代码,但请确保将适当的书指定为祖先。

  • 我只是将投票作为一个属性包含在一本书或一章中。无需将其设为需要发出额外查询的单独类型。

  • 如果每本书的章节数量有限,我会考虑对章节使用 StructuredProperty。 StructuredProperties 本质上是父实体(书籍)中的结构化数据。您会受到 Book 实体的最大大小 (1MB) 的限制,但如果它适合,它将为您节省进行额外查询的成本,因为无论如何您都不会在没有适当书籍的情况下查询章节。

关于python - GAE : from RDBMS to NDB problems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16672384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com