2017-09-18 3 views
1

私はまだNoSQLデータベースを初めて使用しており、何年も前からRDBMS(Oracle、MySQL)を使用しています。現在、私たちのデータベースの1つをIn-Memory NoSQL DBに移行することを検討しており、我々は最良の設計アプローチに固執しています。NoSQL(Redis)の設計アドバイス

私たちはRedisを検討していますが、別のKey-Valueストア(RocksBDやLMDBなど)と連動するのか、単独で使用するのが最適かは、私があなたから受け取ったアドバイスに基づいています。 (あなたは、私たちの問題を解決するための全く別のアプローチに関するアドバイスは無料です)。

In-Memory NoSQLに移行するテーブルには、人口統計(姓、名字、住所、生年月日、出身国など約40人の人口統計フィールドなど)と、写真、署名、10個の指紋のすべて。

クエリは、このような我々は非常に簡単に写真を含む(Redisのキーと値のストアですべてを保存することができる場所FIRSTNAME = 'ジョーンズとlastname =「アンドレ」とdateOfBirthの> 1984年9月13日

取得など人口統計上で実行されます署名、フィンガープリント、すべての人口統計など)がありますが、DBが最終的に約2億件のレコードに増加するため、RAMが狂っていることが心配です。そこで、頻繁に検索される人口統計の一部(例:名字、姓、年齢など)を保存し、残りのデータをLMDBやRocksDBなどのキー値ストアに保存することを検討しました赤色よりも少ないメモリ)。この実装では、誰かがfirstname = jonesとlastname = markの場所で検索を行いたい場合、redisを検索し、取得したレコードのIDを取得し、キー値ストア(lmdbまたはrocksDB)からレコードを取得します。 書き込みに関する心配がほとんどなく、主に読み取りパフォーマンスに悩まされています。 非常に高速な読み取りが望まれます。

  1. これは良い設計アプローチですか、より良いパフォーマンスにつながるより良い設計アプローチです。目標はRAM要件を最小限に抑え、非常に優れた読み取りパフォーマンスを得ることです。

  2. ところで、この性質のバイオメトリクスを記憶しておくのもよいアプローチですか?このようなシャロンジュは

を解決しているどのように

  • はまた、我々は、検索をして、人口統計のサブセットに対してクエリを実行しながら、私たちは主に、データセット全体を取り出すことに注意してください。 (それは私たちが人口統計とバイオメトリックを検索する各マッチ個体のためです)

  • +0

    [もっと速い回答を得るために、どのような状況で「緊急」や他の類似のフレーズを追加することができますか?](// meta.stackoverflow.com/q/326569) - 要約は、ボランティアに対処する理想的な方法ではなく、おそらく回答を得ることに逆効果があります。これをあなたの質問に追加しないでください。 – halfer

    +0

    名前= 'jhon' && last = 'doe'のような条件がキー値ストアに実装されるようになっているかどうかわかりません。 – ren

    +0

    はい。 redisサポートそのような検索 – SWILL

    答えて

    0

    私はRedisの素晴らしいファンです。素晴らしいストレージとインデックス作成ツールです。私の知る限り、100%NoSQL設計ではあなたの要件は本当にうまく適合しません。

    データをSQLに保存し、Redisで複合インデックスを作成することをお勧めします。 PK-lookup超高速SQL(PostgreSQL)を取得し、RedisでPKによるデータのインデックスを作成します。メモリ使用に問題はなく、大量のデータを取得するために複数のPKクエリを実行するとすべてが終了します。または、CHARS列のみを索引付け/キャッシュし、イメージとオーバーサイズの値をSQLに保持する方法を適用できます。または、アクセスされたサイズのデータ​​を一時的にキャッシュし、最近アクセスされなかったデータのキーを退去させる。

    メモリについて、あなたが指摘しているのはRedis Clusterの使用によって解決されます。

    [UPDATE]通常、インデックス化する必要があるすべての値に対してRedisキーを作成しようとします。文字列をインデックス化する必要がある場合は、モノスコアのソートセットを使用し、ZINDEXBYRANGEを利用します。datetimeの場合は、スコアをタイムスタンプに設定してZRANGEBYSCOREを使用します。あなたのアクセス/記憶パターンに応じて、データの一部を保存し、そのバルクをSQLに残すことができます。スピードについては、キー/値をどのように設計するか、タスクに割り当てるRAMの量に依存するため、実際には言えません。

    +0

    あなたの入力のためにそんなにありがとう。あなたの提案は、RDBMSとNo-SQL DBを維持することを必要とします。それが最善の方法であると考えられます。 Howerever、私はredisがそのような検索をサポートしていることを認識しています(例えば、firstname = 'jones'とlastname = 'eva'とdateofbirth> 1989年12月12日)。このようなクエリでredisがうまく機能しないという意見はありますか?レコードを取得するための2回の呼び出し(rdbmsの最初の呼び出しとredixの呼び出し)は、redisの呼び出しよりも優れたパフォーマンスを発揮すると思いますか? – SWILL

    +0

    @SWILL返信用の更新を参照 – tuned

    0

    あなたの要件が200万人のレコードを保存し、異なる条件でできるだけ早くそれらを取得するならば、あなたにとって最適なデザインを決める唯一の方法は概念の証明としてそれを試してみてください。

    ただし、直感的には、適切なインデックスを持つリレーショナルデータベースが最適なオプションであると思われます(特に経験がある場合)。

    別のオプションとして、多くのマシンにデータを配布することもできますが、これは難しい方法です。

    +0

    あなたの入力のために多くのありがとう – SWILL

    関連する問題