私は70問の質問票を持っており、回答を保存する必要があります。
問題:それは年間1億レコードです。
私はさまざまなタイプのストレージでの経験がありますが、これらの膨大な数に対処する必要はありませんでした。今、私はすべての間違った決定が大きなマイナスの影響につながる可能性があることを恐れています。
情報データについて:
データ定義(疑似コード)
COLUMN | TYPE | MAX. LENGTH
-----------------------------------------
id | Integer | 10
questionnaire_id | Integer | 10
answered_at | Datetime | -
answered_by | Integer | 10
answer1 | Integer | 2
answer2 | Integer | 2
answer3 | Integer | 2
answer4 | Integer | 2
...
answer35 | String | 2
answer36 | String | 2
...
answer70 | String | 2
優先度:
ベストプラクティスまたはチェックリストがあり、それによって私のオプションが減り、それにより間違った決定が下りますか?
前もって感謝します!
編集:デイブから着想を得て正規化
# questionnaire
- id (PK, AI)
# questions
- id (PK, AI)
- questionnaire_id (FK)
- label
# submits
- id (PK, AI)
- questionnaire_id (FK)
- answered_by
- answered_at
# answers
- id (PK, AI)
- submit_id (FK)
- question_id (FK)
- value // Integers only (strings are mapped: A => 1, B => 2)
このテーブルでは、追加のキー/インデックスはなく、1行あたり160バイトなので、年間100,000,000行は約16GByteになります。適切なハードウェア/仮想リソースがあれば、適切なDBMS(SQL Server、postgres、[YourFavouriteDBHere]、...)がそれに対処でき、(適切なインデックス付けを前提として)効率的にクエリを実行できるはずです。キーや他のインデックスが占める余分なスペースは、スペース要件をあまり膨らませるべきではありません。もしそうなら、構造がより一般的に最適ではない可能性があります。
したがって、単にデータを保存するだけで心配はありません。
一部のデータベースは、圧縮、スパーステーブル、およびその他の手法をサポートしています。これらの手法は、スペースが主な関心事である場合にこの構造に非常に役立ちますが、最初に検討する前に、これが実際に必要な構造であることを確認してください。
他の人がコメントで議論しているように、現在の構造は実行する必要がある分析に最適ではない可能性があるため、ヘルプが必要な場合は、質問を編集してそのような詳細を含める必要があります。 すべてのデータベース設計で重要なことは、希望の出力と入力を考慮することです。
残念ながら、現時点で必要なすべての選択クエリがわかりません。
データに対して実行する予定のレポートの種類についてsomeのアイデアが必要です。これは、実行するすべてのクエリである必要はなく、またはそれに近いものである必要はありませんが、some予想されるレポートを最適化することは、最終的に出てくる何か/何か。
可能な限り、入力だけに基づいて設計しないでください。
出力についての考えがなければ、おそらくはい:日付にインデックスを付けたテーブルにデータを投げるだけです。これは、少なくとも、データをフィルター/パーティション/集計する主要な方法の1つである可能性が高いためです。レポートで、実行する必要のある分析がわかっている場合は、ETLを介してデータを別のデータに変換します。ただし、最初に出力についての考えがある場合は、2つの構造(1つはアクティブな記録用、もう1つはレポート用)を作成して維持する必要がないようにすることができますandからデータを変換するプロセスもう一方へ。もちろん、この2つの構造システムmightは最適ですが、詳細を説明しない限り、どちらか一方の方法を説明することはできません。
データ型を縮小します。必要に応じて、INT
からTINYINT
に変更すると、300MB以上節約できます。必要に応じて、代理の代わりに「自然な」PKを使用します。例:PRIMARY KEY(submit_id, question_id)
for answers
参照: http://mysql.rjweb.org/doc.php/schema_best_practices_mysql
あなたは70の質問が時間とともに少し変わるかもしれないと言います。これは深刻な問題であるか、軽微な迷惑である可能性があります。これらを尋ねて答えてください:
ALTER TABLE
新しい列を追加するにはいくらかコストがかかりますが、ほとんど起こりません。約40GB /年になります。
たとえば、週ごとにデータを要約することは理にかなっていますか?その後、生データをクエリするよりもはるかに迅速に、1年間のレポートを迅速に作成できます。