2009-05-18 35 views
3

我想知道用戶註冊的最佳做法。我傾向於在單獨的註冊表中存儲站點註冊,然後一旦通過電子郵件將註冊數據傳輸到用戶表中,就可以確認註冊。網站註冊應該存儲在活動用戶的單獨表格中嗎?

這樣做的好處是,從用戶表中讀取不會混亂從未激活的註冊。另一個好處是電子郵件(用戶名)字段在用戶表中可以保持唯一,但如果您嘗試使用您不屬於的電子郵件地址進行註冊,則該電子郵件地址的所有者仍然可以註冊爲電子郵件字段在註冊表中不是唯一的。

我想知道這是否是一種常見做法,或者如果有任何理由,這不是一個好主意?

回答

1

激活或未經

有沒有真正的需要,用戶存儲在不同的表。只需將所有用戶存儲在一張表中,並用一個布爾標誌來指示它們是否被激活。每隔一段時間都會運行一個cron作業來檢查並查看是否有x天的帳戶,並且未激活並刪除它們。

電子郵件

那麼想必你是從激活電子郵件權限的用戶?你還想設置它,這樣如果其他用戶輸入了別人的電子郵件,其他人仍然可以正確註冊?這實際上很簡單。在錯誤地發送給他們的那封電子郵件中,只需鏈接即可從數據庫中刪除該電子郵件,因爲顯然這不是它們,他們也不會激活該帳戶。

但是如果其他人只是刪除它呢?

然後,當他們註冊告訴他們你已經有他們的電子郵件,並提供再次發送激活,這個電子郵件也可以選擇從數據庫中刪除它。

只需從數據庫中刪除舊帳戶。如果該人試圖激活一個新帳戶並且存在一個從未激活的舊帳戶,則可以將其刪除。

1

我認爲這將超過工程。

將它們全部存儲在一張表中,並安排SQL查詢(每天)刪除30天以前未激活的帳戶。

+0

它甚至不必每天都在。你可以一個月左右做一次。除非您非常受歡迎或者永遠不清除,否則您不會看到積聚的未激活帳戶會減慢您的處理速度。每月做一次,或每年一次。 – Malfist 2009-05-18 16:16:24

-1

我同意這種做法的分離的擔憂理由:「註冊過程」和「用戶帳戶」是兩個單獨的概念。

註冊表將用於堅持「註冊過程」的狀態。 一旦該過程完成(一旦電子郵件被驗證),該過程的「輸出」將是一個新的「用戶帳戶」。如果進程失敗(例如,在用戶未能確認他的電子郵件1個月後它「超時」),則對「用戶帳戶」概念沒有影響。

正如在另一個答案中所說的,在某些情況下,這可能超過工程設計,但它也可以是一個有用的方法來詮釋這兩個單獨概念的複雜性。它也可以被看作是矛盾的規範化原則,但是我相信你必須根據你的上下文選擇封裝和規範化之間的權衡。

+0

如果我的用戶使用綠色汽車而不是紅色汽車,該怎麼辦?我需要創建一個單獨的表格來保持不同顏色汽車的兩個概念分開嗎?因爲紅色汽車與綠色汽車完全不同。 – Malfist 2009-05-18 15:14:30

+0

@Malfist:兩輛只有不同顏色的汽車仍然具有相同的數據和行爲,因此不需要將它們分開(這會導致複製粘貼程序)。但就汽車而言,我可以有不同的概念:汽車本身,購買合同,汽車註冊,保險合同,維修。當我使用汽車時,修理過程無關緊要,只有修理的最終結果(汽車正常工作)。 此外,它可能是有意義的(在某些系統中)爲Bus,SUV提供單獨的概念,這可能會將繼承用於常見行爲。 – ckarras 2009-05-18 15:39:17

1

幫你一個忙,把它放在一張桌子上。你只是不會有足夠的性能問題註冊中止註冊(尤其是如果你在3周後擦除它們)。

您對電子郵件地址的理由很愚蠢。沒有人可能會通過虛假註冊來阻止他們的電子郵件。

1

可能會出現以下情況:您在邏輯上將兩個表格分開:如果註冊過程僅在確認電子郵件地址後纔會詢問大量強制用戶信息。例如,如果您的待定註冊表只包含幾列(如電子郵件和激活密鑰),而您的用戶表有許多其他列(如用戶名,名字,姓氏,郵政地址等)

在這種情況下,拆分可能是有意義的,因爲您可以聲明這些列NOT NULL。然而,除此之外,我必須同意大多數其他答案;但是,我不得不同意其他答案。這聽起來像是對我來說過早的優化。多個相同結構的表格是一個強烈的警告標誌,你做錯了。不確定,但強烈的警告。

相關問題