グラフ データベースに保存されているアクティビティがあります。場合によっては、複数のアクティビティがグループ化され、1 つのアクティビティに集約されます。
処理されたアクティビティ フィードは次のようになります。
Activity 1
Activity 2
Grouped Activity
Activity 3
Activity 4
Activity 5
アクティビティには、更新されたタイムスタンプと一意の ID があります。
アクティビティは更新時刻順に並べられ、グループ化されたアクティビティの場合は、その子アクティビティ内の最新の更新時刻が使用されます。
アクティビティはリストのどこにでも挿入できます (たとえば、誰かをフォローし始めると、その人の過去のアクティビティがリストに挿入されます)。
アクティビティは、リストのどこからでも削除できます。
データ量が多いため、マイクロ秒のタイムスタンプを使用すると競合が発生する可能性があります (2 つのアイテムが同じタイムスタンプを持つ可能性があります)。
カーソル識別子は一意で安定している必要があります。フィード アイテムを追加および削除しても、識別子は変更されません。
カーソル ベースのページングを導入して、クライアントがTwitter の. このブログ投稿でそれらの実装について話しているのを見つけただけなので、それらがどのように構築されているかについての情報はあまりないようです。ただし、カーソルの識別子がたまたま削除されたアイテムを指している場合、問題があるようです。
上記の場合、上記のカーソルとして使用できる識別子を作成するにはどうすればよいですか? 最初は、タイムスタンプを一意の id: と組み合わせることを検討しました1371813798111111.myuniqueid
。ただし、アイテム1371813798111111.myuniqueid
が削除された場合、タイムスタンプ付きのアイテムを取得できますが、1371813798111111
そのタイムスタンプ付きのどのアイテムから始めるべきかを判断できません。
私が取ったもう 1 つのアプローチは、各フィードの結果に増分番号を割り当てることでした。番号は順番に増加しているため、番号/ID が欠落している場合は、次のものを選択できます。ただし、これに関する問題は、フィードの途中でフィード項目の削除と追加を開始すると、カーソル ID が変更されることです。この問題に対して私がしなければならなかった解決策の 1 つは、各数値の間に大きなギャップを設けることですが、各数値の間のスペースに新しいアイテムを決定論的に追加する方法を決定することは困難です。さらに、新しいアイテムが追加され、ギャップが埋められると、同じ問題が発生します。
簡単に言えば、リスト内のどこからでもアイテムを追加および削除できるアイテムのリストがある場合、各リストアイテムの ID を生成して、ID のアイテムが削除された場合でも引き続き使用できるようにする最良の方法は何ですか?リスト内の位置を決定しますか?