2

質問調査システムを構築するという要件があります。簡単に言えば、質問が必要で、回答とユーザーの回答レコードが事前に定義されています。

  • 質問には質問 ID、質問テキストが必要です
  • 回答には回答 ID、回答テキストが必要です
  • ユーザーの回答レコードには、レコード ID、ユーザー ID、質問 ID、回答 ID、日付、OS、IP、ブラウザ情報が必要です。

ユーザー レコードについては、すべての履歴を保持する必要があるため、"is live" 列が必要です。したがって、各ユーザーの最新の回答のみが true です。ユーザーが同じ質問に再度回答すると、このユーザーの既存の回答レコードはすべて history( is live = false ) になります。

シンプルな構造のようです。しかし、100,000 を超える質問、100 万を超えるユーザー、および各質問の各ユーザーが 20 を超える回答レコードを持っている場合、レコードは 100,000 * 1,000,000 * 20 = 2,000,000,000,000 レコードを超えます。すると大問題になる。

また、このデータをどのように使用する必要があるかを説明する必要があります。ユーザーのレコードを使用して、質問の回答基準を定義することにより、ユーザーのグループをターゲットにできる別のシステムを提供する必要があります。例えば:

  1. (Q1=A1 && Q2=A3 && Q3=A5 && (Q4=A8 || Q5=A9)) 基準 1
  2. (Q1!=A1 && Q2=A3) 基準 2
  3. (Q4=A8 || Q5!=A9) 基準 3

基準を定義した後:

  1. 条件に一致するすべてのユーザー ID を取得するために 1 つの API を提供する必要があります (api1)
  2. ユーザーのすべての基準を取得するために 1 つの API を提供する必要があります (api2)

API は高速でライブである必要があります。そして api は頻繁に呼び出されます。

1 つのテーブルに 200,000,000,000 のレコードがあると想像してみてください。API呼び出しは非常に遅くなるか、dbを殺すことさえあります.

だから、私は良くない解決策をいくつか持っています。議論できるようにここにリストします:

  1. 各質問には、この質問のすべてのユーザー レコードを保存するための 1 つのテーブルがあります。
  2. 各ユーザーは、このユーザーのすべての質問レコードを保存するための単一のテーブルを取得しました。
  3. 1と2の両方

しかし、解決策があまり良くなく効率的ではないことがわかります。そこで、ここで議論したいと思います。テクノロジーの種類は問いません (sql、nosql、hadoop など...)

ここにあなたの考えを入れてください。

4

1 に答える 1

2

配列に回答を格納する「ユーザー」コレクションを1つだけ使用して、mongoDBを試してみます。

{userId: 1, 
 name: "nick",
 ...,
 "answers": [
    { questionId:1,
      answerId: 1,
      date: Date(...),
      ...,
      isLive: 1},
    { questionId:1
      answerId: 2,
      date: Date(...),
      ...,
      isLive: 0}
 ]
}

次に、プロパティ「answers.isLive」でマルチキー インデックスを使用して、「ライブ」回答への高速アクセスを確保します。

「answers.questionId」と「answers.answerId」の別のマルチキー インデックスにより、基準を使用してデータを取得するパフォーマンスが向上します。

あなたのような数では、最初からあなたのコレクションをシャーディングすることを検討します.

于 2013-01-04T15:43:23.160 に答える