1

私はオンラインサービス(オンライン語彙トレーナー)を持っています。各ユーザーには語彙があります。

さて、Mysql-DBをどのように構成すればよいかわかりません。

私の知る限り、私にはさまざまな可能性があります。

  1. すべてを1つのテーブルに(MyISAM):すべての語彙を1つの大きなMyISAMテーブルに格納し、各ユーザーの語彙を識別するための列「userid」を追加します

  2. すべてのユーザーには独自のテーブル(MyISAM)があります。ユーザーが作成されるたびに、プログラムは「vocabulary_ {userid}」のような名前のテーブルを追加します。ここで、{userid}はテーブルをユーザーに接続します。

  3. 1つのテーブル内のすべて(InnoDB):ポイント1と同様ですが、MyISAMの代わりにInnoDBを使用します。

問題は、1つの大きな語彙テーブルが最大1億行に達する可能性があることです。MyISAMの場合、問題は、すべてのクエリがテーブル全体をロックすることです。したがって、オンラインに多くのユーザーがいる(そして多くのクエリを送信している)場合、テーブルが頻繁にロックされる可能性があると思います。そして、InnoDBの場合、私はかなりの数のSELECT、UPDATE、およびINSERTコマンドを持っているので、これが良い解決策であるかどうかはわかりません。

誰かが私を助けてくれることを願っています。前もって感謝します。

4

3 に答える 3

3

ほとんどの場合、InnoDBを使用することをお勧めします。InnoDBは1億行を処理でき、最大サイズは64TBです。

リレーショナルデータセットがあるようには聞こえませんが、より多くのキー/値ストアがあります。たぶんRiakがより良い解決策です。

于 2012-12-28T21:52:19.367 に答える
1

場合によります

ユーザーごとに1つのテーブル(シャーディングとも呼ばれます)を使い始めると、最初は問題が発生します。

あなたが今スケールの必要がないならば。良いインデックスを持つ1つのテーブルに行きます。私はMyISAMを使用しませんが、代わりにInnoDBを使用します。そうしないと、MyISAMの最大の問題(ロック...)に見舞われる可能性があります。

于 2012-12-28T21:52:38.860 に答える
1

このための通常のリレーショナル設計では、次の3つのテーブルを使用すると思います。

  1. ユーザー—ユーザーID、およびその他の属性:名前、電子メールなど
  2. 語彙—質問からは最も明確ではありませんが、おそらく品詞や意味などの属性を持つ単語で、おそらく単語IDが含まれます(一部の単語のスペルには複数の意味があるため)。
  3. User_Vocabulary —ユーザーID、単語ID、および「学習日」などの属性を持つテーブル。

クエリの実行中にMyISAMがテーブルをロックする場合、User_Vocabularyテーブルを同時に更新する必要がある場合は、MyISAMを使用する余裕がありません。したがって、すべてのテーブルにInnoDBを使用します。

于 2012-12-28T22:03:26.443 に答える