matsuyuta's Room
データの活用を考える
-
コメントは受け付けていません。
[ GAE Google App Engine ][ Phthon ][ Google Bigtable ]
私がつくったアプリ↓
協調型意思決定支援システム「○ 賛否両論 ×(ベータ版)」http://sanpiryoron.appspot.com/
OpinionDataの中に、以下のようなプロパティ(カラム)を作った。
reaction_cnt = db.IntegerProperty(default=0,verbose_name='リアクション数') agree_cnt = db.IntegerProperty(default=0,verbose_name='賛同数') disagree_cnt = db.IntegerProperty(default=0,verbose_name='反対数')
これは、リアクション数、賛成数、反対数をカウントして、
その数を保存している。
最初は、表示するごとに、
クエリーを投げて、リアクション数、賛成数、反対数の
レコードをカウントさせようと考えていた。
でも、
パフォーマンスがよくないとのことなので、プロパティにカウント数を保持する方向にした。
参考:http://groups.google.co.jp/group/google-app-engine-japan/browse_thread/thread/2fba1e88210cb086
(カウントの指定はこんな感じ)
(ex. opinion.reaction_cnt += 1)
このカウントをすることで、
少し考えなくてはならなくなったことが1つ。
カウントが更新されるたびに、
更新日付(update_date)が更新される。
今回のアプリでは、オピニオンの編集ができないので構わないが、
オピニオンの編集日付が必要な場合は、もう少しやり方を考えなければならない。
カウントで、もうひとつ
一覧表示で、1ページに表示する件数をしぼっているのだが、
これは、本(↓)にあったとおりなので、そちらを参照されたし。クエリーの条件文で、つまづいたところがあった。
解決策は「IN」での指定を「=」での指定に変える。datas = OpinionData.gql('WHERE tag IN :1 ORDER BY update_date DESC LIMIT 10',tag)だと×
datas = OpinionData.gql('WHERE tag = :1 ORDER BY update_date DESC LIMIT 10',tag)にしたら、うまくいった。
-
コメントは受け付けていません。
[ GAE Google App Engine ][ Phthon ][ Google Bigtable ]
私がつくったアプリ↓
協調型意思決定支援システム「○ 賛否両論 ×(ベータ版)」http://sanpiryoron.appspot.com/
Google App Engine には、SQLと似たような
GQLというものがある。
でも、このGQL、Select文のクエリーしかないうえ、
Order By句はひとつの項目しか指定できないし、
制限が多い。
UserData、OpinionData、ReactionDataのデータをJoinして表示する場合、
ReferencePropertyというものを使えば良いということで、
さらに、DB.Modelは変更した。
どんな感じになったかというと<pre>class UserData(db.Model): user = db.UserProperty(required=True,auto_current_user=True) sex = db.StringProperty(choices=('男','女'),verbose_name='性別') birth_year = db.IntegerPro・・・(省略) life_area = db.StringProperty(multiline=False,default= '不明',choices=('海のちかく','山のほう','大都会','田舎','外国','ふつうの町'),verbose_name='住んでるところ') intro_mem = db.TextProperty(verbose_name='自己紹介') del_flg = db.IntegerProperty(default=0,verbose_name='削除フラグ') add_date = db.DateTimeProperty(auto_now_add=True,verbose_name='作成日時') update_date = db.DateTimeProperty(auto_now=True,verbose_name='更新日時') class OpinionData(db.Model): user = db.UserProperty(required=True,auto_current_user=True,verbose_name='ユーザー') uid = db.ReferenceProperty(UserData,verbose_name='ユーザーID') tag = db.StringProperty(required=True,multiline=False, choices=('人間・人生','日本','世界','おれんち','食べ物', 'ファッション','買い物','健康・医療', 'スポーツ・音楽・芸術','政治・経済','社会', '科学・IT','自然','教育'),verbose_name='タグ') opinion = db.TextProperty(required=True,verbose_name='オピニオン') reaction_cnt = db.IntegerProperty(default=0,verbose_name='リアクション数') agree_cnt = db.IntegerProperty(default=0,verbose_name='賛同数') disagree_cnt = db.IntegerProperty(default=0,verbose_name='反対数') del_flg = db.IntegerProperty(default=0,verbose_name='削除フラグ') add_date = db.DateTimeProperty(auto_now_add=True,verbose_name='作成日時') update_date = db.DateTimeProperty(auto_now=True,verbose_name='更新日時') class ReactionData(db.Model): opinion = db.ReferenceProperty(OpinionData,collection_name='opinions',verbose_name='オピニオン') user = db.UserProperty(required=True,auto_current_user=True,verbose_name='ユーザー') uid = db.ReferenceProperty(UserData,verbose_name='ユーザーID') reaction = db.StringProperty(required=True,choices=('賛成','反対'),verbose_name='リアクション') add_cmnt = db.TextProperty(verbose_name='追加コメント') del_flg = db.IntegerProperty(default=0,verbose_name='削除フラグ') add_date = db.DateTimeProperty(auto_now_add=True,verbose_name='作成日時') update_date = db.DateTimeProperty(auto_now=True,verbose_name='更新日時')</pre>ユーザ情報は、UserAPIを使うことにしたので、すべてのモデルに以下のプロパティをいれた。
user = db.UserProperty(required=True,auto_current_user=True)
ただ、たとえば、オピニオン一覧で、
オピニオンを作ったユーザを表示する場合、
このuserを使うと自分の作ったオピニオンしかUser名が出力されない。
ログインしているユーザのデータしかアクセスできないのが原因らしい。
結局、uidという項目をOpinioData、ReactionDataにつくって
UserDataをリファレンスすることで、3つのモデル(テーブル)にリレーションをはることになった。
ちなみに、OpinionDataとReactionDataは「Opinion」というプロパティでリレーションがはられている。
これで、GQLでselect文しかなげれなくても、
一つのモデル(テーブル)に検索かければ、
芋づる式(参照、後方参照)により、
3つのモデル(テーブル)のデータにアクセスできるようになった。
ちなみに、アプリケーションの中でプロフィールの表示で
http://sanpiryoron.appspot.com/profile/show
ユーザデータと、オピニオンデータ、リアクションデータを
最初はいっぺんに表示させていた。
これは、「後方参照」という方法を使っていた。
しかし、「後方参照」は、
日付の新しい順に並び変えたり
表示させる件数をしぼったりすることができない。
結局、「オピニオン一覧へ」「リアクション一覧へ」というリンクを張って
別々にクエリーを投げるような形にした。
「後方参照」を使ったままだとしたら、
プロフィール表示画面に
ありったけのオピニオン、リアクションを表示させることになるところだった。
追記:
クエリーの条件文で、つまづいたところがあったので追記です。
解決策は「IN」での指定を「=」での指定に変えることです。datas = OpinionData.gql('WHERE tag IN :1 ORDER BY update_date DESC LIMIT 10',tag)だと×
datas = OpinionData.gql('WHERE tag = :1 ORDER BY update_date DESC LIMIT 10',tag)にしたら、うまくいった。




