我正在为一个电子邮件应用程序做一个 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 的值作为键值的候选者,那么通常会有一个生成的代理键:最常见的是一个整数值或 UUID,它在记录时决定被创建并且不依赖于记录的任何属性。您的
announcement_contacthistory
表中似乎已经有这样一个键,ID
列。如果键值被其他表中的外键值引用,这一点尤其重要,就像这里的情况一样。虽然 SQL Server 和 Azure SQL DB
ON UPDATE CASCADE
使得更改此类引用值成为可能并且从编码人员的角度来看很容易(只需更新主值,引擎将消失并修复所有引用),但这可能非常低效,导致正在进行许多相关的更改。如果announcement_contacthistory
有参考announcement_contact.id
而不是announcement_contact.email
您可以更改用户的电子邮件,而无需更新announcement_contacthistory
和其他地方的所有参考。当然,您可能希望保留电子邮件地址的历史记录,以便了解在发送消息时使用了什么,方法是仍然在消息记录中记录地址,或者在联系表中保留值的历史记录(可能使用系统版本化的时态表)。
要查找有关相关理论和实践的信息,请搜索以下术语: