2つのDBクラスをJOINしてfilterする方法ってありますか?

11 views
Skip to first unread message

kazuharu takeuti

unread,
Jan 20, 2009, 11:39:01 PM1/20/09
to Google-App-Engine-Japan
日本語リソースの
エンティティの関連をモデリングする
http://d.hatena.ne.jp/technohippy/20080717#1216315927

を見ても、キーリストと.ReferencePropertyの組み合わせのやり方だけで、joinしてfilterはできませんでした。

db.ReferencePropertyだと参照できるだけでfilterはかけられませんでした。
キーリストでつなげるやり方だと複数のプロパティにfilterかけられないし。
mysqlのjoin的な使い方ができる方法を、ご存じの方おりましたらご教授ください。
よろしくお願い致します。

Takashi Matsuo

unread,
Jan 21, 2009, 12:20:01 AM1/21/09
to google-app-...@googlegroups.com
松尾です。

join 出来ないのは現在の Datastore の制限で、おそらく将来も変わらないと
思います。(もしかしたらできるようになるかも)

じゃあどうするかというと、de-normalize して検索に使用するプロパティを参
照元にも持つか、クエリを二回投げる事になります。

Happy coding :-)

-- Takashi Matsuo



2009/1/21 kazuharu takeuti <nya...@gmail.com>:

kazuharu takeuti

unread,
Jan 21, 2009, 12:51:39 AM1/21/09
to Google-App-Engine-Japan
毎回、お返事ありがとうございます。

de-normalize とはどういう意味なのでしょうか。知識不足ですみません。

参照元に入れるしかないんですね。joinできないのがわかってスッキリしました。
これで割り切って開発できそうです。

Ian Lewis

unread,
Jan 21, 2009, 1:29:16 AM1/21/09
to google-app-...@googlegroups.com
お疲れ様です。イアンです。

de-normalizeというのは、具体的に冗長データを作ることです。ちょっと分かりにくいと思いますので、例でご説明をさせて貰います。

User と Comment というエンティティがあるとします。

SQLでは、JOINを使って、一気にデータを取れますが、GAEではできませんので、どうしても、このクエリをしたいと、新しいエンティティを作って、JOINしたデータを管理します。User と CommentをJOINしたデータを別のUserCommentで格納しておきます。

モデルを書きますと、

from google.appengine.ext import db

class User(db.Model):
  name = db.StringProperty(verbose_name=u"Name")

class Comment(db.Model):
  user = db.ReferenceProperty(User)
  comment_text = db.StringProperty(verbose_name=u"Comment")

class CommentUser(db.Model):
  user = db.ReferenceProperty(User)
  comment = db.ReferenceProperty(Comment)
  name = db.StringProperty(verbose_name=u"Name")
  comment_text = db.StringProperty(verbose_name=u"Comment")

これで、CommentUser.all().filter(...)で、JOINしたデータの filter をかけます。 しかし、お手数ですが、CommentをDatastoreに格納するときに、CommentUserも格納しておき、Commentデータが編集や、削除されたときにも、CommentUserも更新しないといけません。

普段に二つのクエリをするほうが良さそうと思いますが、データが多い場合は冗長データを使えば良いと思います。

2009/01/21 14:51 kazuharu takeuti <nya...@gmail.com>:



--
=======================================
株式会社ビープラウド  イアン・ルイス
〒150-0012
東京都渋谷区広尾1-11-2アイオス広尾ビル604
email: ianm...@beproud.jp
TEL:03-5795-2707
FAX:03-5795-2708
http://www.beproud.jp/
=======================================

kazuharu takeuti

unread,
Jan 21, 2009, 4:24:44 AM1/21/09
to Google-App-Engine-Japan
イアンさん、お答えありがとうございます。
なるほど、もう一つJOIN用のモデルを作って、一度にfilterしたいプロパティを入れておけばいいんですね。
filterに使わないプロパティは参照するだけにすると。
こうしておけば余分な冗長データが増えなくて済むと。

具体的な例をあげていただいてありがとうございます。
おかげでモデル設計がやりやすくなりました。
感謝です!
> email: ianmle...@beproud.jp
> TEL:03-5795-2707
> FAX:03-5795-2708http://www.beproud.jp/
> =======================================
Reply all
Reply to author
Forward
0 new messages