Azure-Sql-Database

在應用程序中更改使用者電子郵件的最佳做法是什麼?

  • July 16, 2019

我正在為一個電子郵件應用程序做一個 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 DBON UPDATE CASCADE使得更改此類引用值成為可能並且從編碼人員的角度來看很容易(只需更新主值,引擎將消失並修復所有引用),但這可能非常低效,導致正在進行許多相關的更改。如果announcement_contacthistory有參考announcement_contact.id而不是announcement_contact.email您可以更改使用者的電子郵件,而無需更新announcement_contacthistory和其他地方的所有參考。

當然,您可能希望保留電子郵件地址的歷史記錄,以便了解在發送消息時使用了什麼,方法是仍然在消息記錄中記錄地址,或者在聯繫表中保留值的歷史記錄(可能使用系統版本化的時態表)。

要查找有關相關理論和實踐的資訊,請搜尋以下術語:

  • 鑰匙
  • 候選鍵
  • 代理鍵
  • 首要的關鍵
  • 唯一鍵

引用自:https://dba.stackexchange.com/questions/242995