首页 > 解决方案 > 如何实现删除用户?

问题描述

我正在开发提供库的测试项目。就我的发展而言,我不断地遇到问题。

你能帮我做一个吗?

我的模型设计包括 User 和 LeasingHistory 实体,所以当用户借书时,LeasingHistory 表会填充相应的记录。

create table USER
(
 ID BIGINT not null serial primary key,
 ADDRESS VARCHAR(255) not null,
 DOCUMENT_ID VARCHAR(255) not null,
 FIRST_NAME VARCHAR(255) not null,
 SUR_NAME VARCHAR(255) not null
);

create table LEASING_HISTORY
(
 ID BIGINT not null serial primary key,
 BOOK_INSTANCE_ID BIGINT not null,
 USER_ID BIGINT not null,
 START_DATE DATE(10),
 ARRANGED_END_DATE DATE(10),
 ACTUAL_END_DATE DATE(10),
 foreign key (BOOK_INSTANCE_ID) references BOOK_INSTANCE,
 foreign key (USER_ID) references USER
);

现在我必须实现用户删除。我该怎么做?它是如何在 Google、Facebook 或 StackOverFlow 中实现的?

在这种情况下,我不认为删除孤儿是合适的策略,因为不应该清理历史。

我想我可以将 isActive 字段添加到 User 表中。在这种情况下,我可以清除个人信息并isActive = false在用户按下“删除帐户”按钮时进行分配。

你对此有何看法?

更新:我认为用户应该有可能恢复他的帐户,因此在这种情况下@killjoy 选项更好。你能检查我,我理解正确吗?我引入了附加表UserInternalData,如果删除用户,我将清除实体中的所有数据(除了id),并在“UserInternalData”中设置为 true 和当前日期UserisDeleteddateStamp

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@NoArgsConstructor
@AllArgsConstructor
@Getter
@EqualsAndHashCode
@ToString
class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstName;

    private String surName;

    @JsonFormat(pattern="yyyy-MM-dd")
    private LocalDate dateOfBirth;

}

@Entity
@NoArgsConstructor
@Getter
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public final class User extends Person {

    @Builder
    public User(Long id, String firstName, String surName, LocalDate dateOfBirth, String documentId, String address) {
        super(id, firstName, surName, dateOfBirth);
        this.documentId = documentId;
        this.address = address;
    }

    private String documentId;

    private String address;

}

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@EqualsAndHashCode
@ToString
public final class UserInternalData {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne
    private User user;

    boolean isDeleted;

    @JsonFormat(pattern="yyyy-MM-dd")
    private LocalDate dateStamp;

}

我对吗?

标签: javasqldatabase-design

解决方案


几种方法需要考虑。

  1. 向表中添加一isActive列(或等效的一isDeleted列)USER。删除用户时清除(或设置)该位。您可能还想清除其他敏感信息。这为将来重新激活已删除用户留下了可能性。

  2. USER_ID将所有受影响行中的字段替换为LEASING_HISTORY代表已删除用户的特殊保留 ID(可能名称类似于"Deleted User")。

  3. 根据@killjoy,通过添加与 相关的第三个表来规范化这两个表USER_IDBOOK_INSTANCE_ID并从 中删除该USER_IDLEASING_HISTORY。然后,您可以简单地从第三个表中删除受影响的行,而不会丢失图书租赁历史记录。

附录

再想一想,(3)可能不是一个好方法。这个想法是将USER_ID外键分离到一个单独的表中,但这并不能解决悬空删除外键问题。

也许更可行的方法是:

  1. 不要限制USER_ID为外键。这样,您就可以安全地删除USER行,而无需进行任何清理。当然,您仍然需要在创建每个新LEASING_HISTORY行时(以编程方式)确保引用完整性。

我更喜欢(1),因为您没有删除任何用户历史记录,而只是删除了敏感的用户信息。


推荐阅读