2014-03-05 64 views
0

我正在開發Bukkit服務器的管理插件。我想給它禁止(正常,臨時和ip),靜音(正常和臨時)和警告玩家的功能。要存儲所有這些信息,我想使用SQL數據庫(SQLite或MySQL)。SQLite/MySQL的大表與多個小表?

信息可以以兩種方式存儲。

選項1:

4個小表:

  • playerlist [ID,播放器,IP,lastlogin](用於維護誰的加入每一個球員的名單)
  • banlist [ (跟蹤所有靜音信息)
  • mutelist [id,player,creationTime,reason,endtime,type](跟蹤所有靜音信息)
  • warnlist [ID,播放器,警告]

這就要求我單獨查詢每個表,然後從每個個體ResultSet解析。

選項2:

1大型表

  • playerlist [ID,播放器,IP,lastlogin,banReason,banEndTime,banType,muteReason,muteEndTime,muteType,警告]

這隻需要我查詢1個大表,獲取所有必要的信息,然後可以從單個ResultSet解析。


我想知道的是 - 總體上最好的選擇是什麼?根據我所看到的,人們的答案因人們使用數據庫的方式和大小而異。由於我不熟悉SQL數據庫,因此我不確定哪種情況會很好。

1)最小的數據冗餘:

回答

0

,因爲它是更加規範化,然後選擇2

優勢備選方案1的我會建議選擇1。 (例如禁令信息將只在禁令表中出現一次)

2)單一版本的真相。 (由於事件是在表中只記錄一次,事實的單一版本保持不變)

3)更新速度更快(由於信息不被存儲在多個位置,使得任何更新會更快)

在運行需要連接多個表的分析查詢的系統中採用非歸一化模型。由於連接大型表會導致性能問題,因此採用非歸一化模型。

+0

如果我考慮將實際的數據庫文件拆分爲多個文件,是否也適用同樣的事情? (例如:banlist.db,playerlist.db等) –

+0

是的。以上內容適用於數據庫的物理設計。 –