App Engineのエンティティ設計メモ

はてなスターみたいな要件のエンティティ設計は?

はてブとか、はてなスターみたいに、特定のリソースに対してユーザーがブックマーク(fav)したりしなかったりする要件について。(twitterのfavは、ツイートとアカウントがひもづいてるので、ちょっとケースが異なる。)
この要件を、GAE+opensocialで実装する場合、(GAEによってJSON形式のWeb APIを用意し、それをopensocialから取得する)エンティティの設計はどうなるか。

案1 エンティティはリソースのみ

リソースのエンティティに複数プロパティで、favしたpersonのpersonIDを持たせる。
これだと、実装はシンプルになりそうだけど、personIDに情報をひも付けにくいので、あとからの要件追加に弱そう。(favにコメント機能をつけたいとか)
そうすると、personIDではなくKeyを持たせたほうがよさそう。

案2 エンティティはリソースとperson

リソースのエンティティに複数プロパティで、favしたpersonのkeyを持たせる。
これなら、あとから要件が増えても、personエンティティにプロパティを追加すれば、コメント機能とかには対応できそう。

Slim3はタイプセーフなリレーション(Slim3 日本語サイト(非公式): リレーションシップ)をサポートしているので、それらを活かしたもっといい方法があるのかも。