matsuyuta's Room

データの活用を考える

       
  • 2009年 10月 5日 · カテゴリー: GAE DAYS; Tagged as: , ,
    このエントリーを含むはてなブックマークはてなブックマーク - DAYS 7 カウント このエントリをつぶやくこのWebページのtweets Bookmark this on Delicious この記事をクリップ!Livedoorクリップ - DAYS 7 カウント BuzzurlにブックマークBuzzurlにブックマーク Share on Tumblr FC2ブックマークへ追加 Yahoo!ブックマークに登録 Googleブックマークに追加

    [ 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)
    

    にしたら、うまくいった。

    コメントは受け付けていません。
  •    
  • 2009年 10月 5日 · カテゴリー: GAE DAYS; Tagged as: , ,
    このエントリーを含むはてなブックマークはてなブックマーク - DAYS 6 リレーションは?Joinは? このエントリをつぶやくこのWebページのtweets Bookmark this on Delicious この記事をクリップ!Livedoorクリップ - DAYS 6 リレーションは?Joinは? BuzzurlにブックマークBuzzurlにブックマーク Share on Tumblr FC2ブックマークへ追加 Yahoo!ブックマークに登録 Googleブックマークに追加

    [ 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)
    

    にしたら、うまくいった。

    コメントは受け付けていません。
 
Get Adobe Flash playerPlugin by wpburn.com wordpress themes