かなりの数のフィールド(必要に応じてプロパティ)を含むUserモデルオブジェクトがあります。「名」、「姓」、「都市」、「生年月日」と言います。各ユーザーは「一意のID」も取得します。
それらで検索できるようにしたいと思います。どうすればそれを適切に行うことができますか?どのようにそれを行うのですか?
私の理解(ほとんどすべてのKey-Valueストレージで機能します-最初にKey、次にValueになります)
u:123456789 = serialized_json_object
(ユーザーのキーの単純なプレフィックスとしての「u」、123456789は「一意のID」です)。
ここで、名と姓で検索できるようにしたいと考えて、次の場所に保存できます。
f:スティーブ= u:384734807、u:2398248764、u:23276263 f:アレックス= u:12324355、u:121324334
したがって、キーは「f」です。これは名のプレフィックスであり、「Steve」は実際の名です。「u:Steve」の場合、「Steve」であるすべてのユーザーIDを値として保存します。
これにより、すべての検索が非常に簡単になります。いくつかのフィールド(プロパティ)によるクエリ-たとえば、名(つまり「Steve」)と姓(つまり「l:Anything」)によるクエリはまだ簡単です-最初に「f:Steve」からユーザーIDのリストを取得し、次に「l」からリストを取得します:Anything "、交差するユーザーIDを見つけてください。
問題(そしてかなりの数があります):
ユーザーの保存、更新、削除は面倒です。それはアトミックで一貫した操作でなければなりません。また、値のサイズが特定の値に制限されている場合、(潜在的な)問題が発生します。そして、ここでの答えは本当にありません。ユーザーIDのリストを圧縮するだけですか?でも、あまりクールではありません。
検索する新しいフィールドを追加するID。最終的。「都市」で言います。「c:LosAngeles」= ...、「c:Chicago」= ...と同じように実行できますが、最初からこれらすべての「検索の選択肢」を予測していなかった場合は、次のようになります。夜の仕事など、既存のすべてのユーザーレコードを作成して、それらの「c:CITY」を更新できるようにするために...非常に大きな仕事です。
ロックに関する問題。ユーザー「u:123」は自分の名前「Alex」を更新し、ユーザー「u:456」は自分の名前「Alex」を更新します。どちらも「f:Alex」をIDで更新する必要があります。つまり、上書きの問題が発生するか、1つの更新が別の更新を待機します(そして、それらが多数ある場合はイメージングしますか?!)。
それを行うための最良の方法は何ですか?多くの分野で検索したいということを念頭に置いて?
PSお願いします、質問はHBase / Cassandra / NoSQL/Key-Valueストレージについてです。お願いします-MySQLを使用してSELECTについて「読む」ためのアドバイスはありません。「後で」スケーリングの問題について心配します。私が私の質問を私がしたのとまったく同じようにしたのには理由があります。:-)