2010-08-03 314 views
2

我希望我的用戶在能夠登錄之前激活他們的帳戶。它們含激活鏈接,像這樣的事情在註冊後收到一封電子郵件:檢查用戶是否激活了他/她的帳戶的最有效方法?

http://www.blabla.com/[email protected]&token=Aisd23uNMAu53932asdDasd82AS

當然,每當有人登錄時,我不得不請檢查是否或不是用戶已經激活了他/她的賬戶。我能想到的2種方式來解決這個問題,無論是在我的「用戶」表,其設置爲空擁有一個額外的列,每當用戶啓動像這樣:

----------------------------------------------- 
| id | username | password | activation_token | 
----------------------------------------------- 
| 1 | user1 | blabla |     | 
----------------------------------------------- 
| 2 | user1 | blabla | asd232DA34qADJs2 | 
----------------------------------------------- 

然後我提取activation_token與沿用戶信息只要在用戶登錄或我可以只包含激活令牌一個單獨的表,然後在「用戶」表中加入每次用戶登錄:

-------------------------------------- 
| id | account_id | activation_token | 
-------------------------------------- 
| 1 | 37   | dsad2428491dka98 | 
-------------------------------------- 
| 2 | 2   | asd232DA34qADJs2 | 
-------------------------------------- 

那麼,哪一個會最高效?謝謝你的時間。

編輯:感謝所有偉大的響應

+1

我會說,只要選擇一個就可以了。規範化的版本會更容易實現。 – strager 2010-08-03 15:22:29

+2

規範化的表格將節省數據庫中的一些空間,但成本是更復雜的SQL查詢。兩種解決方案都可以工作,所以只需選擇一個。 – 2010-08-03 15:24:58

+1

正如其他人所說,因爲這種激活只會發生在大多數情況下,任何帳戶一次速度是微不足道的。 – Chris 2010-08-03 15:27:13

回答

4

就個人而言,我會做兩者的結合...

------------------------------------- 
| id | username | password | status | 
------------------------------------- 
| 1 | user1 | blabla | 1  | 
------------------------------------- 
| 2 | user1 | blabla | 0  | 
------------------------------------- 

如果狀態是TINYINT(1)場是0爲停用的用戶,以及1激活用戶。這樣,你可以很快地告訴用戶的「狀態」...

然後,將令牌存儲在另一個表中(就像你已經有的那樣)......這樣,你不需要加入,或在未激活帳戶時檢查字符串列...

1

使用第一個選項 - 添加isactivated列到USERS表。

不需要單獨的表格 - 這是一對一的關係。

1

在Users表中存儲令牌而不是單獨的表將意味着您不必在每次查詢期間加入它們,這會稍微快一些。

此外,您不存儲userIds併爲該令牌表創建新的Id,這將保存在數據存儲上。

1

我會有一個整數字段,激活,默認爲0.當有人嘗試驗證時,您只會查找激活的帳戶。我將驗證令牌存儲在您所描述的單獨的表格中。

1

如果關係是1-1(例如,激活表每個帳戶id將有1行),那麼執行完全標準化的2表方法是矯枉過正。

這兩種方法都不存在重大問題,但是1表格更容易。

如果你使用2表方法,你應該在用戶表中存儲「已激活」的yes/no標誌,所以你不需要加入到第二個表用戶登錄的目的。

0

我不認爲有必要將激活令牌存儲在數據庫中。就像md5('users @ email'。'secret')將會工作得很好。至於用戶狀態,我同意他人,在用戶表中使用單獨的專用「狀態」列。另一個優點是,這一列可以存儲其他人(例如「禁止」)

1

如果激活令牌僅用於驗證'點擊此處激活您的帳戶'鏈接並且不再使用,那麼在您的用戶表中浪費存儲char(32)(或其他任何東西)字段的空間並沒有意義。將激活令牌放置在您的帳戶激活腳本可在用戶點擊激活時引用的單獨表格中。激活完成後,您可以從該單獨的表中刪除該令牌的記錄。

在用戶表中放置一個'is_activated'布爾/位字段,您的登錄腳本可以在登錄過程中檢查(並輸出「嘿,您還沒有激活」錯誤,如果字段的空/錯誤)。

當然,現在磁盤空間很便宜。即使每百萬用戶擁有一個32位激活令牌,也只會浪費32美元的空間。一個TB的驅動器價格低於100美元,這是磁盤的0.00305%,並且本質上是0.00美元的成本(0.305美分)。

+0

但是然後我可能以及將激活令牌存儲在用戶表中?如果我已經計劃存儲'is_activated'布爾/位字段,那麼我已經在使用額外的列「已保存」 – 2010-08-03 18:32:34

+0

表中的列數通常不是問題。這是列的空間量。 MySQL中的單個位字段佔用至少1個字節的空間(1-7位字段= 1字節,8-15位字段= 2個字節,e tc ...),而固定字符(32)則爲32字節。因此,爲代碼創建一個單獨的表可以節省每條記錄31個字節,並且只在激活過程處於活動狀態時佔用空間。 – 2010-08-03 19:14:11

+0

我明白了,謝謝! – 2010-08-03 19:45:15

0

在我看來,不是將激活碼存儲在用戶表中,而是保留一個標誌,默認情況下將其設置爲關閉。當用戶點擊任何激活鏈接時,更新表格並設置標誌。

登錄前檢查該標誌是否打開。 如果標誌關閉,則用戶沒有點擊激活鏈接。那麼你可以給用戶一個錯誤信息。

如果標誌處於打開狀態,則用戶可以成功登錄。

相關問題