最佳实践商店电子邮件唯一 MySQL 和验证 JS
Best practice store email unique MySQL and Validate JS
我有一个 table,其中电子邮件是唯一键,重点是...当用户在管理表单中被删除时,我进行更新,在名为“的列中插入“1”删除”,这样做我会保留该用户的数据和历史记录...但是如果我必须使用相同的电子邮件添加新用户,Bang MySQL 会抓住我
所以..我的问题是,最佳做法是?
- 当用户被删除时在 table 中删除,丢失该用户的历史记录
- 删除email列中的唯一键,只在JS中保留验证以防止重复的电子邮件
- 另一个...
感谢您的宝贵时间
您可以限制电子邮件只有在未使用虚拟列删除时才具有唯一性:
create table user (
email varchar(320),
deleted tinyint,
undeleted_email varchar(320) as (if(deleted,null,email)) unique
);
您可以反转逻辑,而不是存储可为空的删除标记,而是存储活动标记。使用检查约束(在 MySQL 8+ 中)或触发器(在不强制检查约束的较低 MySQL 版本中)将活动标记的可能值限制为一个(非 NULL
) 值(和 NULL
)。然后将唯一约束放在电子邮件地址和活动标记的组合上。这样,您可以有多行具有相同的电子邮件地址和一个 NULL
活动标记,但最多有一个具有该地址和非 NULL
活动标记。
CREATE TABLE user
(id integer,
email varchar(256),
active tinyint,
PRIMARY KEY (id),
CHECK (active = 1),
UNIQUE (email,
active));
但作为非技术方面的说明,请检查根据适用于您的数据保护法,当用户删除帐户时,您是否在法律上被允许保留该用户的历史记录。他们可能有权期望在删除帐户时删除所有内容。
而且您还可以考虑,如果用户回来,不创建新帐户,而是让他们重新激活他们的旧帐户。
我有一个 table,其中电子邮件是唯一键,重点是...当用户在管理表单中被删除时,我进行更新,在名为“的列中插入“1”删除”,这样做我会保留该用户的数据和历史记录...但是如果我必须使用相同的电子邮件添加新用户,Bang MySQL 会抓住我
所以..我的问题是,最佳做法是?
- 当用户被删除时在 table 中删除,丢失该用户的历史记录
- 删除email列中的唯一键,只在JS中保留验证以防止重复的电子邮件
- 另一个...
感谢您的宝贵时间
您可以限制电子邮件只有在未使用虚拟列删除时才具有唯一性:
create table user (
email varchar(320),
deleted tinyint,
undeleted_email varchar(320) as (if(deleted,null,email)) unique
);
您可以反转逻辑,而不是存储可为空的删除标记,而是存储活动标记。使用检查约束(在 MySQL 8+ 中)或触发器(在不强制检查约束的较低 MySQL 版本中)将活动标记的可能值限制为一个(非 NULL
) 值(和 NULL
)。然后将唯一约束放在电子邮件地址和活动标记的组合上。这样,您可以有多行具有相同的电子邮件地址和一个 NULL
活动标记,但最多有一个具有该地址和非 NULL
活动标记。
CREATE TABLE user
(id integer,
email varchar(256),
active tinyint,
PRIMARY KEY (id),
CHECK (active = 1),
UNIQUE (email,
active));
但作为非技术方面的说明,请检查根据适用于您的数据保护法,当用户删除帐户时,您是否在法律上被允许保留该用户的历史记录。他们可能有权期望在删除帐户时删除所有内容。
而且您还可以考虑,如果用户回来,不创建新帐户,而是让他们重新激活他们的旧帐户。