2010-11-19 25 views
1

如果您必須爲付費用戶和試用用戶設計一個數據庫,您是否會將它們放在同一個表中並用字段區分它們?或者你會把它們放在兩個單獨的表格中嗎?同一個表中的數據庫付費用戶和試用用戶

或者,你會做兩全其美的,並把它們在同一個表,但創建兩個視圖1)PaidUsers和2)TrialUsers

謝謝!

+0

是的,我會的。這個問題是什麼? – Karl 2010-11-19 00:41:33

+0

有3種不同的數據庫設計選項 1)在同一表中支付和試用 2)付費和在不同表中試用 3)付費和試用在與視圖相同的表中將它們分成單獨的視圖。 – Steve 2010-11-19 00:55:46

+0

您可能會丟失一個非常重要的東西:視圖對您的數據庫設計沒有任何幫助。每次查詢視圖時,定義視圖的sql也會得到執行,因此,如果在應用程序中使用某些查詢,則定義視圖是很有用的。但是,由於您只是開始設計數據庫 - 您不知道哪些查詢會頻繁發生,換句話說,在數據庫設計的開始階段創建視圖沒有多大意義。 – vonPetrushev 2010-11-19 01:37:03

回答

0

由於您的付費用戶可能會涉及到一些額外的數據,但仍然有相同的字段集爲非付費,要做到這一點,正確的做法是[is-a]方法:

用戶
ID
用戶名
密碼
全稱
...

Paiduse [R
USER_ID [fk->User::id]
ACCOUNT_ID
....
[其他addidional數據]

編輯:現在,試用用戶將在User所有記錄不具有條目Paiduser 。我假設Paiduser fieldset是試用/普通用戶[User]的字段集的超集。

編輯2:要獲得試用用戶的列表,這是UserPaiduser之間的「差集」,下面的SQL應該工作:

select u.* 
from (User as u 
     join Paiduser as p on u.id<>p.user_id) 
+0

那麼我假設你也有一個名爲TrialUser的表?所以你認爲選項#2。 – Steve 2010-11-19 01:21:11

+0

請參閱上面的編輯。 – vonPetrushev 2010-11-19 01:33:46

+0

我想要考慮這個設計,但因爲它是一個新的什麼是一般的SQL調用來獲得試用用戶?類似於SELECT * FROM User,PaidUser WHERE User.ID <> PaidUser.user_id; – Steve 2010-11-19 01:53:58

0

最好的解決方案可能取決於數據庫類型。我的經驗是使用MySQL和SQL Server。我一直把所有的用戶放在一張桌子上。然後根據需要使用字段進行區分。這可能適用於有償/無償或其他任何事情。這個解決方案符合3NF標準,對我來說更容易維護等。使用多個表的原因是什麼?

+0

將它們拆分成不同表格的原因是付費用戶不會因爲忘記檢查sql中的「付費」字段而與試用用戶混淆。 – Steve 2010-11-19 00:57:37

+0

你是對的,假設沒有與付費用戶有關的額外信息,並且幾乎可以肯定的是,帳號是最明顯的可能性。 – 2010-11-19 01:31:10

+1

-1:數據庫設計有**絕對沒有**做與您的關係數據庫的選擇:mysql,mssql,postgresql,sqlite - 無所謂。 – vonPetrushev 2010-11-19 01:39:00

1

我只是表達意見如下一些性能方面的考慮。

在單用戶查詢(例如登錄檢查或單個用戶的數據檢索)中,這兩種策略之間沒有顯着差異。

但是,如果您需要一些統計數據,例如,一個用於付費用戶,另一個用於試用用戶。分離到兩張桌子可能是一個好主意。否則,如果您需要某些統計數據(無論是付費用戶還是試用用戶),單表可能是一個好主意。


如果您需要兩種方案,該怎麼辦?那麼,我認爲這將是兩種用戶之間存在一些共同屬性的情況。

這些常用屬性應放在一個表中,並且特定用戶的專用屬性應放在從前表繼承的「子表」中。就像vonPetrushev所說的那樣。

相關問題