edo1z blog

プログラミングなどに関するブログです

GAE 多対多モデルのデータ削除について

Google app engin の datastoreで多対多を下記ページなどを参考につくりました。
http://code.google.com/intl/ja/appengine/articles/modeling.html

グループとユーザの関係を多対多で構築しています。models.pyの内容は下記になります。
※私は、GAEをPythonとDjango(パッチ)でつくっています。

class Users(db.Model):
    name= db.StringProperty()
    group=db.ListProperty(db.Key)

class Groups(db.Model):
    name=db.StringProperty()
    owner=db.IntergerProperty()


グループのオーナーがグループを削除する為のスクリプトを書こうと思っているのですが、グループを削除する際に、参加しているユーザーのgroupから、削除するグループのkeyを削除する必要があります。これについて最も効率的な方法を教えていただけますでしょうか。

GAEはデータの変更・削除に結構時間がかかります。仮に数万人所属しているグループがあったとし、このグループをオーナーが削除する場合、グループに所属しているユーザーのgroupに全てアクセスし、該当グループのkeyを削除する操作は非効率(30秒を超える可能性が十分あるの)ではないかと思っています。

宜しくお願いします。

投稿日時 - 2011-05-22 17:11:48

と、OkWebで質問した。
下記を回答いただきました。

GAEは、ちょっと特殊ですからね……。あんまりいい方法とは思えないのですが、削除するときは、単純にGroupsのownerをクリアするだけにしてはどうでしょうか(ownerが、グループの作者を示すデータですよね?)検索時に、グループのownerがないときは「そのグループは抹消済み」として表示しないようにするなど対処しておくわけですね。

そして、それとは別に、CRONなどを使って定期的にownerが空のGroupsを検索し、そのGroupsが保管されているUsersを少しずつ(一度に最大1000ずつとか)取り出してはgroupを更新していく、というのはどうでしょうか。いわば、ガベージコレクションをCRONで作るわけです。あるいは、最悪、手動で定期的に削除してもよいでしょうし……。


残念だけどそういうことなのか。