最佳实践商店电子邮件唯一 MySQL 和验证 JS

Best practice store email unique MySQL and Validate JS

我有一个 table,其中电子邮件是唯一键,重点是...当用户在管理表单中被删除时,我进行更新,在名为“的列中插入“1”删除”,这样做我会保留该用户的数据和历史记录...但是如果我必须使用相同的电子邮件添加新用户,Bang MySQL 会抓住我

所以..我的问题是,最佳做法是?

  1. 当用户被删除时在 table 中删除,丢失该用户的历史记录
  2. 删除email列中的唯一键,只在JS中保留验证以防止重复的电子邮件
  3. 另一个...

感谢您的宝贵时间

您可以限制电子邮件只有在未使用虚拟列删除时才具有唯一性:

create table user (
    email varchar(320),
    deleted tinyint,
    undeleted_email varchar(320) as (if(deleted,null,email)) unique
);

fiddle

您可以反转逻辑,而不是存储可为空的删除标记,而是存储活动标记。使用检查约束(在 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));

db<>fiddle

但作为非技术方面的说明,请检查根据适用于您的数据保护法,当用户删除帐户时,您是否在法律上被允许保留该用户的历史记录。他们可能有权期望在删除帐户时删除所有内容。

而且您还可以考虑,如果用户回来,不创建新帐户,而是让他们重新激活他们的旧帐户。