16

多肢選択式クイズを実装しようとしており、すべての質問と回答を SQLite データベースに保存したいと考えています。多くの質問があり、各質問に対して 2 つ以上の可能な回答が表示されます。

私の質問は、質問と回答をデータベースにどのように保存すればよいですか? スキーマについて 2 つのアイデアがあります (太字の主キー)

  1. as (多対多)

質問 ( questionID :int , questionString:String, correctAnswerID:int)

回答 ( answerID :int , answerString:String)

question_and_answers ( questionID , answerID )

2.

質問 ( questionID :int, questionString:String, correctAnswerID:int)

回答 ( answerID :int, answerString:String, questionID:int外部キー)

どちらが良いかわかりません、または別の方法があるかどうかはわかりませんか?

非常questions_and_answersに大きくなり、検索時間が長くなり、メモリの問題が発生する可能性がありますか? question_and_answers繰り返しになりますが、主キーでインデックスが作成されると思います。2 番目のスキーマでanswersは、 ?answerIDではなくquestionID? テーブル全体を検索する必要があるため、検索時間が長くなることを意味しますか?

10,000 ~ 20,000 の回答があるかもしれません。(クイズはモバイルデバイスで実行される場合があり、質問は「即座に」表示される必要があります)

注: 質問間で回答が重複することはあまりないと思います。questions_and_answersテーブルに必要な余分なスペースを考えると、オーバーラップの量が保存されるデータが少なくなるとは思わない

4

2 に答える 2

11

実際のドメインをモデル化するため、2 番目のスキーマの方が優れています。各質問には一連の回答があります。重複した回答を一度保存​​してデータを「圧縮」できたとしても、実際のドメインとは一致しません

途中で、回答を編集したくなるでしょう。スキーマ 1 では、その回答が既に存在するかどうかを最初に検索することを意味します。存在する場合は、質問がまだ古い回答に依存しているかどうかを確認する必要があります。存在しない場合でも、他の質問がその回答に依存しているかどうかを確認し、その回答を編集するか、新しい回答を作成する必要があります。

スキーマ 1 は、生活を非常に困難にします。

インデックスの質問に回答するには、questionId にインデックスを追加する必要があります。そのインデックスを取得したら、質問に対する回答の検索は拡大するはずです。

さて、まったく別の話ですが、なぜこれにデータベースを使用するのでしょうか? json などの標準形式の単純なドキュメントとして保存することを検討してください。質問をするときはいつでも、ほとんどの場合、答えが必要になります。逆もまた同様です。複数のクエリを実行する代わりに、ドキュメント全体を 1 ステップでロードできます。

さらに高度なストレージ (クエリ、冗長性など) が必要な場合は、MongoDB や CouchDB などのドキュメント データベースに移行できます。

于 2012-04-10T03:44:13.107 に答える