java - 如何实现删除用户?
问题描述
我正在开发提供库的测试项目。就我的发展而言,我不断地遇到问题。
你能帮我做一个吗?
我的模型设计包括 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 和当前日期User
isDeleted
dateStamp
@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;
}
我对吗?
解决方案
几种方法需要考虑。
向表中添加一
isActive
列(或等效的一isDeleted
列)USER
。删除用户时清除(或设置)该位。您可能还想清除其他敏感信息。这为将来重新激活已删除用户留下了可能性。USER_ID
将所有受影响行中的字段替换为LEASING_HISTORY
代表已删除用户的特殊保留 ID(可能名称类似于"Deleted User"
)。根据@killjoy,通过添加与 相关的第三个表来规范化这两个表
USER_ID
,BOOK_INSTANCE_ID
并从 中删除该USER_ID
列LEASING_HISTORY
。然后,您可以简单地从第三个表中删除受影响的行,而不会丢失图书租赁历史记录。
附录
再想一想,(3)可能不是一个好方法。这个想法是将USER_ID
外键分离到一个单独的表中,但这并不能解决悬空删除外键问题。
也许更可行的方法是:
- 不要限制
USER_ID
为外键。这样,您就可以安全地删除USER
行,而无需进行任何清理。当然,您仍然需要在创建每个新LEASING_HISTORY
行时(以编程方式)确保引用完整性。
我更喜欢(1),因为您没有删除任何用户历史记录,而只是删除了敏感的用户信息。
推荐阅读
- python - 从一列中获取值并从中创建新列
- mongodb - mongoalchemy.(flask)中字段更改时如何更新数据库?
- javascript - 内容脚本。为什么这段代码在 Chrome 中有效而在 Firefox 中无效?
- node.js - Nginx 反向代理映射不重定向
- c# - 如何将服务器数据时间转换为客户端日期时间?C#.NET
- android - 如何在另一个片段中显示时间选择器片段
- python - python中两个字符串的笛卡尔积
- python - 系列除以标量结果为 NaN/0
- angular - 带有全选复选框的 ag-grid 隐藏行仅适用于过滤后的项目
- light-4j - 是否有任何真正的轻量级 4j 示例用于将 json 请求映射到 Java POJO 对象?