「Google App Engine Anti Patterns by Takashi Matsuo on Prezi」より。
なお、この資料はとても参考になるので、一度目を通しておくといいと思います。
Google App Engineのアンチパターン(1) 正規化のし過ぎ
例
class Tag(db.Model):
name = db.StringProperty()
count = db.IntegerProperty()
class Post(db.Model):
tags = db.ListProperty(db.Key)
body = db.TextProperty(required=True)
created = db.DateTimeProperty(auto_now_add=True)
PostはTagのキーを保持すると、データストアの操作が冗長になります。
t = Tag.get_by_key_name(tag_input)
if t is None:
raise Http404
posts = Post.all().filter("tag =", t.key()).fetch(200)
修正例
class Tag(db.Model):
name = db.StringProperty()
count = db.IntegerProperty()
class Post(db.Model):
tags = db.StringListProperty(db.Key)
body = db.TextProperty(required=True)
created = db.DateTimeProperty(auto_now_add=True)
PostはTagの文字列を保持します。
そうすることで、データストアの操作が単純で高速になります。
posts = Post.all().filter("tag =", tag_input).fetch(200)
「検索する場合は上長に持とう」
Google App Engineの初心者がリレーショナルデータベースと同じ感覚で設計してしまうと、このアンチパターンになりがちです。
Google App EngineのBigTableは、従来のリレーショナルデータベースとは異なる設計思想が必要です。