###実現したいこと
Youtubeにあるように、無限ロードでの「コメントの人気順ソート」をMySQLにて実装したいです。
「誰がいつどのコメントへ」は評価のたびにINSERTされますが、「その集計とランク付け」は毎時間のUPDATEとするつもりです。
しかし閲覧と集計の時刻によって読み込みがズレる問題を想定しており、解決方法についてアドバイスを頂戴したく存じます。
###例
例えば以下の評価テーブルa_ups
(a_downs
もありますが割愛します)と、コメントテーブル(p_comments
)があり、コメントテーブルは集計結果としてpopular_order
カラムに値が入った状態を考えます。
●評価テーブルa_ups
ID | user_ID | comment_ID | created_at |
---|---|---|---|
1 | 100 | 1 | 2020/01/02 12:00:01 |
2 | 200 | 3 | 2020/01/02 12:00:02 |
3 | 100 | 2 | 2020/01/02 12:00:03 |
4 | 300 | 3 | 2020/01/02 12:00:04 |
↓
↓ 上記を毎時間集計し、popular_order
カラムを更新する
↓ comment_ID=3
が最多で2件の評価を得ているのでpopular_order
カラムは1位の1
が入る
↓
●コメントテーブル(p_comments
)
ID | comment | popular_order | created_at |
---|---|---|---|
1 | かっこいいね | 2 | 2020/01/01 12:00:01 |
2 | かわいいね | 3 | 2020/01/01 12:00:02 |
3 | 素敵だね | 1 | 2020/01/01 12:00:03 |
4 | きれいだね | 4 | 2020/01/01 12:00:04 |
###想定している問題
閲覧の最中に集計された場合、「閲覧開始時のコメント順序」と「集計後のコメント順序」が変化してしまい困ります。
まずコメントは2件ずつ無限ロードされ、ORDER BY popular_order DESC
でソートすると考えまして、
1回目は
comment_ID=2
「素敵だね」
comment_ID=3
「かっこいいいね」
が読まれ
そして2回目は
comment_ID=1
「かわいいね」
comment_ID=4
「きれいだね」
と続くハズなわけですが、
もし2回目の無限ロードが集計以後に実行された場合、かつ集計によってpopular_order
の値が1回目から変化した場合にコメント順序ズレてしまうと気づきまして…
###考えている解決策
この問題の解決策として以下を考えましたが、微妙な印象です。
まず毎時間の更新履歴を、popular_order_1
,popular_order_2
,popular_order_3
,,,と24個のカラムで一日分p_comments
に持たせておき、POSTされた閲覧開始時刻にあったpopular_order_●
でソートします。
これならソート対象のカラムは閲覧開示時刻に基づくため、24時間以内なら集計が起こっても平気です。
1時に閲覧開始した人は、無限ロードの実行が2時でも3時でもpopular_order_1
でソートするわけです。
●コメントテーブル(p_comments
)
ID | comment | created_at | popular_order_1 | popular_order_2 | popular_order_3 |
---|---|---|---|---|---|
1 | かっこいいね | 2020/01/01 12:00:01 | 2 | 3 | 3 |
2 | かわいいね | 2020/01/01 12:00:02 | 3 | 2 | 4 |
3 | 素敵だね | 2020/01/01 12:00:03 | 1 | 1 | 2 |
4 | きれいだね | 2020/01/01 12:00:04 | 4 | 4 | 1 |
そしてもし閲覧開始時刻が24時間以上前の場合、コメントはレスポンスせずJSで強制的にページリロードさせ、無限ロードをリセットしてしまうという方法です。
これが自分の中での解決策なのですが、いかがでしょうか。
より良い方法やアドバイスなど頂戴できましたら幸いです。
宜しくお願いいたします。
あなたの回答
tips
プレビュー