在應用程序中更改使用者電子郵件的最佳做法是什麼?
我正在為一個電子郵件應用程序做一個 crud,我希望能夠改變“一切”。但是,現在它會根據電子郵件地址將 JSON 字元串與數據庫匹配。
問題:在這種模式下,使用者永遠不能更改他們的電子郵件。一個新的電子郵件地址 = 一個新使用者。
declare @email varchar(255), @ID int insert into announcement_jsonlog (json_string) values (@json) select @email = email from openjson(@json) WITH (email varchar(255) '$.Email') insert into announcement_contacthistory ( ID, Email, Prefix, FirstName, MiddleInitial, LastName, Suffix, Title, Company, Address1, Address2, City, State, Zip, Zip_4, Phone, Extension, Unregistered, AddDateTime, LModifiedDateTime, longkey, shortkey, History_addDateTime) select *, current_timestamp from announcement_contact where email = @email
**問題:**你將如何設計一個讓你也可以更改電子郵件地址的 CRUD?
聽起來您正在使用電子郵件地址作為密鑰,這不是一個好習慣。任何可以改變的東西都不適合成為關鍵值,包括電子郵件地址和電話號碼。這不是一個好主意的其他原因包括:
- 它可能為 NULL:也許您的目標受眾中有些人不使用電子郵件,因此沒有地址?
- 某人可能擁有多個地址/號碼
- 人們可能會共享一個地址/號碼,因此它不是唯一的
如果您沒有一個不變的、唯一的、永不為 NULL 的值作為鍵值的候選者,那麼通常會有一個生成的代理鍵:最常見的是一個整數值或 UUID,它在記錄時決定被創建並且不依賴於記錄的任何屬性。您的
announcement_contacthistory
表中似乎已經有這樣一個鍵,ID
列。如果鍵值被其他表中的外鍵值引用,這一點尤其重要,就像這裡的情況一樣。雖然 SQL Server 和 Azure SQL DB
ON UPDATE CASCADE
使得更改此類引用值成為可能並且從編碼人員的角度來看很容易(只需更新主值,引擎將消失並修復所有引用),但這可能非常低效,導致正在進行許多相關的更改。如果announcement_contacthistory
有參考announcement_contact.id
而不是announcement_contact.email
您可以更改使用者的電子郵件,而無需更新announcement_contacthistory
和其他地方的所有參考。當然,您可能希望保留電子郵件地址的歷史記錄,以便了解在發送消息時使用了什麼,方法是仍然在消息記錄中記錄地址,或者在聯繫表中保留值的歷史記錄(可能使用系統版本化的時態表)。
要查找有關相關理論和實踐的資訊,請搜尋以下術語:
- 鑰匙
- 候選鍵
- 代理鍵
- 首要的關鍵
- 唯一鍵