3

私はMySQLに慣れており、KeyValueStoreの使用方法を理解しようとしています。私が見たことがないのは、データベース設計の例や、情報を挿入して取得する方法のような優れた初心者です。

これは、MySQLのデータをKey Valueストアに保存する方法を正しく表していますか?

TYPE: MySQL
TABLE: users
COLUMNS: user_id(primary), username, location

TYPE: Key Value Store
TABLE: users
KEY: user_id
VALUES: username, location

だから、私が上で正しければ。一般的なユーザー情報の取得は、理解するのに十分簡単です。しかし、Key Valueストアで次のクエリを実行するにはどうすればよいですか?

SELECT username FROM users WHERE location = 'mexico'

これを簡単に実行できると私が思った方法は、別のテーブルを作成することです。(5,000人を超えるユーザーがいると仮定します。数百人しかない場合は、これを行う他の方法があると確信しています)

--Original Table--
TYPE: Key Value Store
TABLE: users
KEY: user_id
VALUES: username, location

--Additional "query" Table--
TYPE: Key Value Store
TABLE: user-location
KEY: location
VALUES: user_id

ただし、新しい誰かが参加したり、場所を更新したりするときに、2つのテーブルを調整する必要があります。大したことではないと思います。アプリケーションコードを非常に正確にする必要があります。

これはこれらの問題を解決するための最良の方法ですか?それとも私は何かが足りないのですか?

4

3 に答える 3

2

回答を更新(2014年1月)

DynamoDBは、グローバルセカンダリインデックスのサポートを開始しました。これは、場所にインデックスを設定し、メキシコに住んでいるインデックスのみを高速に取得できることを意味します。

執筆時点では(これは変更される可能性があります)、既存のテーブルにインデックスを追加できないことに注意してください。

元の回答(2013年3月)

一般的なNoSQLに関する注意:
NoSQL DBMSは通常、スケーラビリティに重点を置いています。
また、通常、サーバー側のコードが増えるという点でアプリケーションのオーバーヘッドが追加されます。

「メキシコからユーザーにクエリを実行する必要がある回数」を自問する必要があります。
その答えは、データベースをモデル化するときに正しいアプローチを導く可能性があります。
これは、「完璧なフィット」や実際の「noobサンプル」がない理由でもあります(少なくとも私の知る限り)

特にDynamoDBを見ると、(他のNoSQLソリューションとは対照的に)セカンダリインデックスの贅沢がないため、インデックスとしてのテーブルを作成する必要があります。モデルでは、ハッシュキーが場所で、範囲キーがユーザーIDであるテーブルを作成できます。したがって、QUERY API呼び出しを使用すると、すべてのMEXICOユーザーを取得できます。

IDを単一のオブジェクトに連結したままにするなど、他の実装も考えられますが、DynamoDBでは64KBのオブジェクトしか許可されていないため、ここでスケーリングの問題が発生する可能性があります。

于 2012-03-19T16:55:32.017 に答える
1

個別のインデックステーブルを自分で管理しないでください。

代わりに、新しいグローバルセカンダリインデックス機能を使用してください。

于 2014-01-09T21:09:17.340 に答える
0

場所に基づいて多くのルックアップを実行するように設計されている場合は、Locationをハッシュキー、userIdを範囲キーとしてユーザーテーブルを再設計する必要があります。ただし、上記の方法では、名前またはuserIDでユーザーを照会する機能が削除されます。また、新しいユーザーを挿入しても、userIDの一意性を確認できません(MySqlの主キーが実行していたことと矛盾します)。

現在、場所に基づいて頻繁に検索しない場合は、スキャン操作を実行する方が良い解決策になる可能性があります。

最善のアプローチは、あなたが述べたように、必要に応じてAPIレベルでこれらすべての処理を行うことです。

于 2012-03-30T08:28:16.370 に答える