2012-04-10 53 views
12

我想實現一個多項選擇測驗,並希望將所有問題和答案存儲在SQLite數據庫中。我會有很多問題,每個問題都會有2個或更多可能的答案來顯示。在數據庫中存儲多項選擇測驗 - 決定模式

我的問題是,我應該如何將問題和答案存儲在數據庫中?我有一個模式兩種想法(粗體主鍵)

  1. 爲(多對多)

問題(questionID:INT,questionString:字符串,correctAnswerID:INT)

答案(answerID:INT,answerString:字符串)

questions_and_answers(questionIDanswerID

2.

問題(questionID:INT,questionString:字符串,correctAnswerID:INT)

答案(answerID:INT,answerString:字符串,questionID: int 外鍵

我不確定哪一個更好,或者如果有其他方法?

也許questions_and_answers會變得非常大,並導致檢索時間長和內存問題?然後再次,我假設question_and_answers將被索引在主鍵上。在第二個模式中,answers將在​​上索引,而不是questionID?這意味着搜索時間將會增加,因爲整個表格將不得不被搜索?

可能有〜10,000 - 20,000個答案。 (測驗可能在移動設備上運行,問題需要立即顯示)

注意:我不認爲問題之間的答案會有太多重疊。考慮到questions_and_answers

+0

你的答案是否真的可能在多個問題上被重複? – Tenner 2012-04-10 03:37:19

+0

粗略推測,我會說可能有30%的答案會出現在多個問題 – 2012-04-10 03:42:05

回答

7

要求的額外空間,我不認爲重疊的數量意味着存儲的數據更少。您是第二種模式,因爲它模擬了實際的域:每個問題都有一個一組答案。即使您可以通過存儲重複答案一次來「壓縮」數據,但它與實際域不匹配。

在路上你會想要編輯答案。對於模式1,這意味着首先搜索該答案是否已經存在。如果確實存在,那麼您將不得不檢查是否有任何問題仍然依賴於舊答案。如果它不存在,您仍然需要檢查是否有其他問題依賴於該答案,然後編輯該答案或創建一個新答案。

模式1讓生活變得非常困難。

要回答您的索引問題,您需要在questionId上添加一個索引。一旦你有了這個索引,查找問題的答案應該縮放。

現在,完全不同的說明,爲什麼要爲此使用數據庫? 考慮以像json這樣的標準格式將它們存儲爲簡單文檔。無論何時您查詢問題,您幾乎都會想要答案,反之亦然。而不是執行多個查詢,您可以一步載入整個文檔。

如果您後來發現需要更高級的存儲空間(查詢,冗餘等),您可以將其移動到像MongoDB或CouchDB這樣的文檔數據庫。

+0

我剛纔想到如何去刪除一個問題,並意識到它會在模式1上更難。模式2使更多現在感覺到我了!我以爲我會使用數據庫,因爲我認爲搜索/管理/存儲/編輯問題會更容易。我從來沒有想過將它們存儲爲文檔 - 您認爲它會提供明顯更好的性能嗎?感謝您的回答 – 2012-04-10 03:58:08

+1

如果您對數據的使用情況與我預期的相同,那麼基於文檔的解決方案可以輕鬆執行得更好。與(問題+答案)相比,文檔解決方案只有1個查找(文檔)。 – 2012-04-10 04:17:45

-1

看來僵局(圓環)爲questionID列在稱爲外鍵接聽表和correctAnswerID列在問題表稱爲外鍵。

最好在答案表中創建一個位類型列以標記正確的答案並刪除correctAnswerID列。

相關問題