先日リリースしたアプリ「来期アニメ」は、バックエンドとしてNotionを管理画面とデータベース代わりに使っています。
アプリからNotionへは、NotionAPIでアクセスしています。
最低限の機能を予定通り実装できたので、ここまではNotion万歳でした。
しかし、次の一手として考えていた、各ユーザーが登録したお気に入りをカウントする機能の実装が、現状では難しいことがわかってきました。。
その理由をメモとして残します。
更新APIで現在のプロパティ値をインクリメントする方法がなさそう
更新API「Update page properties」では、プロパティに新しい値をセットすることは出来ますが、今の値に+1する、つまり、以下のようなことは出来ないように見えます。
UPDATE article SET favo_count = favo_count + 1 WHERE id = 999;
代替案として、ユーザーがお気に入りを押した時に、一旦、現状の最新のお気に入りカウントを取得して、それに+1(あるいは-1)して登録するという手もあります。
しかし、この方法は、API呼び出しコストが2回分かかる上に、複数のユーザーが同時にお気に入りを押した場合に、どうしても正確なカウントにはならない欠点があるのであまり気乗りがしません。
見落としているかもと思って、twitterでNotionAPIにメンション送って見ましたが返答なし。
NotionAPIにおけるRelationおよびRollupの対象は最大で25ページまで
何か他の方法はないかと調べてみると、Notionには、データベースのリレーションが使えることがわかりました。
これを使うために、アニメ一覧データベースとは別に、お気に入りカウント用データベースを作り、アニメ一覧へのRelationプロパティを追加、アニメ一覧にお気に入り数をカウントするための、Rollupプロパティ(SUM)を追加しました。

お気に入りレコードが無駄に多くなるのが難点ですが、概ね想定通り動いており、アプリにも組み込んで動作確認していたところ、ここで問題が発生しました!
なんとNotionAPIでは、RelationおよびRollupの対象ページ(=レコード)は、25件までということが判明しました。
つまり、25回以上、お気に入りがオン・オフされた場合は、それ以上カウントできないという。。これでは使いものになりません。

ちなみに、Notionのページでは25件以上でも問題なくRelation、Rollupできているので、NotionAPIだけの制限かと思われます。
代替案
・NotionとNotionAPIでもっと別なやり方がないか考える。
・費用もかかるし面倒なので気が進まないですが、サーバー側も自前でやる。
・そのうち更新APIが機能拡張されることに期待して、とりあえず、最新のお気に入り数を取得&更新でお茶を濁す。多少の誤差や遅さは気にしない。
結論がなくてすいません。ちょっと頭を冷やします。

以上
コメント
[…] […]