asatoの技術的な日常日記

「成長に最大の責任をもつ者は、本人であって組織ではない。自らと組織を成長させるためには何に集中すべきかを、自らに問わなければならない」  非営利組織の経営 - ピーター・ドラッカー

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Datastoreのデータモデル設計のふりかえり, パート3

はじめに


パート1パート2を読んでいない方は、この節を読んで下さい。

個人的に趣味で、Goole App Engine/Java(実際はScalaを使用)を使い始めて一年ぐらいになります。そこで、このシリーズでは、Datastoreのこれまでに設計したデータモデルについて少しふりかえりながら、
-設計上の失敗点
-データモデルのパターン(デザインパターンと言う意味ではない)
-データモデルの進化のパターン(プロパティの追加や削除など)
などについて考えていきたいと思っています。

基本的には、JDO使用で、一部、Objectifyを使ってます。

事例として作ってるWebサイトはGoodsHomeというもので、もともとは、新刊の定期自動チェックのために作ってました。今は、モノ(商品)を中心としてファンやユーザーがつながれるようなソーシャルなサイトにしようと思ってます。

現状、Kind数(クラス数)は、47でした。このシリーズでは、これらモデルの中から、単純なモデルから順に見ていきたいと思います。

考察


今回のモデルは、商品のブックマークを表すモデルです。各ユーザーは、商品IDをもとに、その商品をブックマークできます。このモデルは、Datastoreに慣れていない初期に作ったモデルです。
kind_Bookmarks.png
BookmarksとBookmarkの二つのKindを定義しました(JDOを使用)。Bookmarkは、各商品を対象としたブックマークを表します。asinは、amazonの商品IDです。userIdは、ブックマークしたユーザのIDを表します。Bookmarksは、単にuserIdごとに、Bookmarkの一覧を保持するだけのものです。

なお、JDOを使用しているので上記のようにモデルを表していますが、実際には、Datastore上では、以下のようにデータが保存されますので注意してください(詳しくはGAEのドキュメントを参照)。
ds_ss1.png
ds_ss2.png



このモデルに対する操作は、三つです。
(a) エンティティの作成
(b) bookmarksの更新
(c) bookmarksの読み取り

特徴は以下です。
(1) エンティティ間の関係がある。1対nの関係。
(2) トランザクションは必要である。
-Bookmarks(Parent)
(3) bookmarks以外の(JDO上の)プロパティがない。
(4) 各エンティティは、(特に理由がなければ設計上は)削除されない。
-Bookmark(Child)
(5) 各プロパティは、読み取り専用である。
(6) 各エンティティは、削除される。


下記の図は、上記のようなモデルをより一般的に表したものです。
ds_patten3.png


設計上の悩み


設計上失敗していると感じるのは、Bookmarksがなぜ必要なのか、という点です。不要な理由はあります。
-性能上の欠点: ブックマークの追加や削除が行われるとindexのプロパティ値の更新が発生する

そもそも、なぜ現状のようなモデル設計になっているかというと、不慣れだったこともありますが、ユーザーIDをもとにブックマークの一覧どのように保持・取得するかという観点から、現状のモデルを思いついた(それ以外は思いつけなかった)ということがあります。

実は、現状のモデルはバージョン2で、バージョン1では、BookmarkはuserIdを保持していませんでした。変更した理由は、性能上の理由と言うよりは、クエリの行いやすさの理由だった気がします。あるユーザーがその商品をブックマークしているかどうかを
userId == '%s' && asin == '%s'
のようにクエリできるようにしたかったからです。
kind_Bookmarks_v1_2.png

ちなみに次のバージョンでは、Bookmarksを削除する予定です。それと、ブックマークした日時を保存するプロパティの追加も検討しています。
kind_Bookmarks_v_2_3_4.png



パート4に続く。


付録:データモデルのパターン


パート1で特定したデータモデルのパターン
kind_patten1.png

パート2で特定したデータモデルのパターン
kind_patten2.png


パート3で特定したデータモデルのパターン
ds_patten3.png
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://asatohan.blog77.fc2.com/tb.php/109-23b97352
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。