私はGAEで働くことを学んでいます。私は多くの論文、Google からのすべての NDB ドキュメント、およびここでいくつかの質問を読みました。私は SQL にとても慣れていますが、過去 20 年間の私の考え方を NoSQL に変えるのは少し難しく、ここで提供されたさまざまなソリューションはすべて私を夢中にさせます。
私は次の単純な構造を持っています: BOOKS than can have CHAPTERS Chapters that can have VOTES たとえば、Book "Sentinel" は 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)
さて、私の疑問は次のとおりです。
- このアプローチは正しいですか?
- 私が作成した関数 bookKey() は、すべてのエンティティが祖先を使用していることを確認するために、「ダミーの祖先」を持つのに適していますか?
- Vote クラスで本と章の参照を定義する必要がありますか?それは外部キーであったためです (私が行ったと思うように)。
- 本から章を取得する方法は明確に定義されていますか? つまり、Chapter クラスでは byBook 関数が Book クラスの関数を使用しています。または、よりクリーンなコードを作成するために、他のエンティティの関数を使用しないようにする必要がありますか?
- チャプターのすべての投票を取得するにはどうすればよいですか?
- 特定の章と特定の本に対するすべての投票の合計を取得する正しい方法はどれですか?
最後に、すべての本を含む 1 つのテーブルを表示します。テーブルには、各本の投票の合計が必要です。例えば:
名前 | センチネル | 投票 30 票 4票
この情報、特にカウントされた票を取得するにはどうすればよいですか。
次に、本の名前をクリックして、彼のすべての章を表示したいと思います (そのとき、Chapter モデルで byBook 関数を使用する必要があると思いますよね?)。
この種のデータを取得するために必要な GQL はどれですか?
前もって感謝します。