python - GAE : from RDBMS to NDB problems

标签 python google-app-engine app-engine-ndb

我正在学习在 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 票

我如何获取此信息,特别是计票数。

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

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

提前致谢。

最佳答案

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

以下是我会做的一些不同的事情:

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

  • 从 Book.getCapters() 函数来看,您似乎想让一本书成为一堆章节的祖先。这大概就是祖宗的善用吧。我没有看到创建章节的代码,但请确保将适当的书籍指定为祖先。

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

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

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

相关文章:

python - 覆盖 Django ModelForm 中的保存方法

python - 如何让 get_pressed 在 pygame 中工作?

python - 谷歌应用引擎 : How to read text file using python?

python - 我正在尝试在 ndb 中使用带有 filter() 的 @classmethod 并收到错误。新开发银行新手

python - 谷歌应用引擎 (Python) : Allow entity 'previewing before ' submit'

google-app-engine - 使用 ndb.KeyProperty 如何引用相同的模型?

python - 如何使用 django 在 session 中创建对象的实例?

python - 在 python 中关闭流的不同方法

python - 日志中的文件不可访问错误 (setuptools)

image - GAE webapp2_extras session 内存限制(在 session 中存储临时图像)