Google App Engineのアンチパターン(1) 正規化のし過ぎ

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は、従来のリレーショナルデータベースとは異なる設計思想が必要です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です