3

ユーザー数が増加しているMySQLデータベースがあり、各ユーザーには必要なアイテムと持っているアイテムのリストがあり、各ユーザーには特定のIDがあります

現在のデータベースは少し前に作成されており、現在、ユーザー ID を主キーとして行ごとに 50 列の WANT または HAVE テーブルに特定の行を持つ各ユーザーがあり、各アイテム WANT または HAVE には特定の ID 番号があります。

これにより、現在、ユーザーごとに 50 アイテムの追加が制限されており、データベースの検索やその他の機能が非常に複雑になっています。

データベースをやり直すとき - 代わりに、各行にユーザー ID とアイテム ID を持つ 2 列の WANT と HAVE テーブルを作成するだけでよいでしょうか。そうすれば、ユーザーごとのアイテムに「理論的な」制限はありません。

メンバーがプロファイル ページをロードするたびに - 欲しいアイテムと持っているアイテムのリストが、持っているテーブルまたは欲しいテーブルからの単純な SELECT WHERE ID = ##### ステートメントを使用してコンパイルされます。

さらに、ユーザーとユーザーのアイテムリスト、最も一般的なアイテム、ほとんどのアイテムを持つユーザー、あるユーザーが欲しいアイテムと他のユーザーが持っているアイテムの完全なユーザー検索を比較する必要があります... -何とか何とか

ユーザー数は 5000 から 20000 の範囲です

各ユーザーは平均して約 15 ~ 20 個のアイテムを持っています

これは実行可能な MySQL 構造になりますか、それとも戦略を再考する必要がありますか?

助けてくれてどうもありがとう!

4

4 に答える 4

4

これは確かに mysql で実行可能な構造になります。非常に大量のデータを処理できます。ただし、ビルドするときは、ユーザー/アイテム ID に適切なインデックスを付けて、クエリが適切かつ迅速に返されるようにしてください。

これは、データベース用語で 1 対多の関係と呼ばれます。

Table1 holds:
 userName | ID

Table2 holds:
userID | ItemID

必要な数の行を 2 番目のテーブルに入れるだけです。

あなたの場合、おそらくテーブルを次のように構成します。

users
id | userName | otherFieldsAsNeeded

items
userID | itemID | needWantID

このようにして、needWantID を簡単に検索できます。たとえば、Need の場合は 1、Want の場合は 2 です。ただし、後で、たとえばウィッシュリストに 3 を追加できます。

編集:アイテム情報をテーブルに保存していないことを確認してください。アイテムitemsとのユーザー関係を保存するだけです。説明、価格、その他必要なものをすべて保持するテーブル (itemDetails など) にすべてのアイテム情報を含めます。

于 2012-07-24T23:38:08.740 に答える
1

WantsテーブルとHaveテーブルの2つのテーブルをお勧めします。各テーブルには user_id と product_id があります。これは最も正規化されており、ユーザーごとに「無制限」のアイテムを提供すると思います。

または、user_id、product_id、およびタイプ ('WANT' または 'HAVE') を持つ 1 つのテーブルを持つこともできます。私はおそらくオプション1で行くでしょう。

于 2012-07-24T23:39:13.313 に答える
1

あなたが理論化しているのは、非常に正当なデータベース構造です。関係 (これはあなたが望むものです) の場合、many to manyこれが行われるのを見た唯一の方法は、あなたが言うように、列として user_id と item_it を持つ関係テーブルを持つことです。拡張することもできますが、それが基本的な考え方です。

この設計ははるかに柔軟で、必要なユーザーごとに無限のアイテムを使用できます。

欲しいものと持っているものを処理するために、2 つのテーブルを作成するか、1 つのテーブルを使用して 1 バイトのみを保持する 3 番目の列を作成し、ユーザー/アイテムの一致が欲しいものか必要なものかを示します。プロジェクトの詳細に応じて、どちらも実行可能なオプションになります。

したがって、最終的に得られるのは、少なくとも次の表です。

Table: users
Cols:
  user_id
  any other user info

Table: relationships
Cols:
  user_id
  item_id
  type (1 byte/boolean)

Table: items
Cols:
  item_id
  any other item info

それが役立つことを願っています!

于 2012-07-24T23:40:11.453 に答える
1

質問で述べたように、はい、WANT と HAVE に別々のテーブルを用意する方がはるかに理にかなっています。これらのテーブルには、行をユーザーに関連付ける Id 列と、実際に WANT または HAVE アイテムが何であるかを指示する列を含めることができます。この方法により、より多くのスペースを拡張できます。

これらの行が多数ある場合は、迅速なクエリを維持するためにサーバーの容量を増やす必要があることに注意してください。何百万もの行がある場合、サーバーに大きな負荷がかかります (設定によって異なります)。

于 2012-07-24T23:40:45.430 に答える