2011-07-20 98 views
0

比方說,我有一個用戶之間的消息服務,公共和私人消息。我希望每個人都能看到「公衆」,而「私人」的人真的是私人的。這兩種設計哪一種最好?非常簡單的數據庫設計問題

一個)

具有單個數據庫,稱爲 「信息」 與列

  • ID
  • 發件人
  • 接收機
  • 時間戳
  • 隱私(這將是一個布爾值,0爲私人和1公)

或者B)

有兩個數據庫,一個名爲「messages_public」等所謂的「messages_private」與同下面的列

  • ID
  • 發件人
  • 接收機
  • 時間戳

我知道,第二種方法是多餘的,但在這個意義上,在發生錯誤的情況下,私人信息不會被意外地爲大家展示(這將是更安全一個災難),我說得對嗎?另一方面,在第一種情況下,它確實可以。 SQL查詢中的一個簡單錯誤可能無法過濾私人消息,並且會顯示每個消息。

回答

3

我認爲任何設計都可以,但我更喜歡第一個,因爲它消除了冗餘。

在您的情況下,安全性將歸結爲您的應用程序代碼,這將不得不保證私人消息只被傳遞給適當的用戶。如果應用程序代碼中存在缺陷,則任一數據庫架構都可能將私人數據暴露給錯誤的用戶。

0

兩者都可能失敗,這將取決於你的錯誤!這就是爲什麼你先測試。第二種方法可能會像第一種方法一樣容易失敗,因爲結構是相同的。

1

更好的是把所有東西放在一張桌子上。無論如何,拆分表格可能沒有你可能認爲它的優點。

  • 如果攻擊者的工作出路轉儲整個公共表,然後 他們可能能夠得到messages_private傾倒出來爲好。

  • messages_private包含不只是我自己的私人信息,但 大家的,所以如果在我找 我自己的私人信息會出現這個假設錯誤,這將最終反正每個人傾倒。

3

你可能要考慮一個表中的一個數據庫,而是使用一個數據庫視圖爲您公共留言,是這樣的:

然後選擇公共郵件從public_messages查看。這可以幫助防止在代碼中的select語句中省略private = false的笨拙編程錯誤。

1

如果他們必須是「真正的私人」而不是「私人的」或「私人的」,那麼使用單一表格方法,加密私人信息,並在出路時解密它們。那樣的話,如果你很虛弱,那麼發生的最糟糕的事情就是顯示亂碼。

但最終,我只是說不要犯任何錯誤。

0

我認爲第二個將會使用它,並且上面的應用程序會更容易出現第一個的錯誤。順便說一句,安全應該在應用程序級別進行管理,即服務器和用戶應用程序本身的組態。 祝你好運!