0

Netflix のキューにあるアイテムを並べ替えているとします。私が見たこの種のすべての例では、最後のアイテムを一番上に移動すると、データベース内のすべてのレコードが一度に 1 つずつ更新されます。

1. One Fine Day              ==> change sort order from 1 to 2
2. Two and a Half Men        ==> change sort order from 2 to 3
3. Three Kings (move to top) ==> change sort order from 3 to 1

これを行うより良い方法はありますか?アイテムを再注文するたびにデータベースの更新が 1 回しか必要ないものでしょうか? このことを考慮:

1. One Fine Day              ==> do nothing (sort order stays at 1)
2. Two and a Half Men        ==> do nothing (sort order stays at 2)
3. Three Kings (move to top) ==> change sort order from 3 to 0

他の 2 つのアイテム間でアイテムを移動すると、並べ替え順序の違いが分割されます。

1. One Fine Day              ==> do nothing (sort order stays at 1)
2. Two and a Half Men        ==> do nothing (sort order stays at 2)
3. Three Kings (move to mid) ==> change sort order from 3 to 2.5

さらに一歩進んで、数字だけでなく、より大きな文字セットを使用することもできます。たとえば、base64 に移動してアルファベット順に並べ替えると、アイテム間の作業スペースを確保するためにすべてのアイテムを並べ替える前に、ほぼ無制限に並べ替えることができます。

とにかく、頼りにするときに DB をヒットする最も賢い方法は何ですか?

4

1 に答える 1

0

私が理解しているように、あなたのシナリオは次のとおりです。

  1. 簡単にするために、3 つのテーブルMoviesUsersおよびUserPreferenes(最後のテーブルは列UserIdMovieIdおよびOrdinal) があるとします。
  2. ユーザーがお気に入りの映画の並べ替えに対する好みを変更するたびに、UserPreferencesテーブルを更新する必要があります。
  3. ただし、それには通常、少なくとも 2 つのレコードOrdinalの列を更新する必要があります(いくつかの例外はありますが、全体的なロジックをそれらのケースに限定するつもりはありません)。
  4. では、問題は次のようになります。複数の更新を回避し、代わりに 1 つのレコードのみを更新するにはどうすればよいでしょうか?

上記が正しければ、回避策はdenormalizationです。一般的な解決策はありません。選択する方向ごとに警告が出るリスクがあるため、考慮すべき代替案がいくつかあります。

  1. 列を保持し、ユーザーのお気に入りの映画 ID のシーケンスを別の列に格納するUserPreferencesことにより、 に3 つではなく 2 つの列のみを含めるには、 .UserIdOrderedMovieIds

  2. Ordinal列をユーザーの好みを示す有限数の列に変換するには: Ordinal1Ordinal2、... OrdinalN(もちろん、これはテーブルの最大列数によって制限されます)。

于 2013-01-24T22:23:19.047 に答える