2011-10-31 24 views
0

我創建一個小型的數據庫,管理員將能夠購買模塊分配給用戶。此外,管理員將能夠從模塊中取消分配用戶(放棄該許可證),並將其他用戶重新分配給該模塊。我還想記錄這些作業的日誌,以便查看這些更改的發生頻率。數據庫設計和SQL語句速度

我的一個選擇是有型的一個表:
User_Licenses(user_license_id, user_id, module_id, date_from, date_to)
其中DATE_TO保持空白的活躍用戶。這意味着,爲了看用戶是否有訪問該模塊我不得不請與:

SELECT user_id FROM User_Licenses 
WHERE user_id = 1 
AND module_id = 1 
AND date_from <= TODAY 
AND date_to = NIL 

我的另一種選擇是有2個表類型:

User_Licenses(user_license_id, user_id, module_id, active_user_log_id) 
Active_User_Log(active_user_log_id, date_from, date_to) 

哪裏每次分配新許可證時,我都會創建一個日誌條目,並在每次未分配許可證時更新date_to字段。

現在我明白了,他們基本上是相同的事情,與第二個選項多一點編程的開銷,還沒有檢查用戶是否有權訪問我只知道一個模塊都做:

SELECT user_id FROM User_Licenses 
WHERE user_id = 1 
AND module_id = 1 

並且日誌在邏輯上與「每日檢查」分開


我想知道的是什麼是更常用的,以及第一個SQL語句對第二個SQL語句的慢多少。

這是一個Web應用程序,用戶數量可能不會超過100,並且模塊的變化在用戶的任務應該是最小的。對模塊的訪問檢查將每天進行,用戶將被分配到多個模塊。

在此先感謝您的幫助。

回答

0

我會說出我的意見,但也有要回答更多的問題,話題首先解決。

首先,如果你使用的第一種情況下,你也說,「活動用戶」的概念對你來說並不那麼重要。在第二種情況下,你是這麼說的。換句話說,你只是在討論一種查詢,但也會有其他查詢的需求,如果他們處理「活躍用戶」,應該幫助你決定。

此外,我懷疑當你編寫代碼來比較空值時,你將不得不說「date_to爲null」而不是「date_to = nil」。數據庫通常(幾乎總是)區分NULL和空白,一種方式是通過將列與空值進行比較。

我也認爲,根據我的經驗許可,您特定的時間量,所以一個表的方法,用NULL作爲指標許可的東西,並不能吸引我。我寧願看到一個日期,然後你可以詢問當前日期是否在失效日期之後。這個問題不是一個決定性的問題,但我認爲這是合理的。

最後,表Active_User_Log聽起來可疑。你也有一個USER表嗎?我會用一個用戶表,並添加一個狀態到該表,例如USER.STATUS。你仍然必須加入許可證表格,但在我看來,表格會反映現實情況。

我的回答是?兩個查詢之間的速度差異並不明顯,只要您適當地爲基礎表建立索引。但我會投票支持兩種表格方法,並保留特定於該實體的單個表格的內容。

+0

在這兩種情況下,活躍用戶對我來說都很重要,只是在第一種情況下才會提到。 User_Log就在那裏,因爲每個用戶都有各種模塊的許可證(基於每個模塊),如果他不需要一個月,他可以「放手」並重新購買它接下來的一個月。我需要日誌來確保不共享許可證。至於這個建議,由於速度不會是一個主要因素,我認爲2表方法更好,因爲我更願意保留特定於實體的表的內容。感謝您的建議:D –