如何实现删除用户?

时间:2018-05-30 19:54:27

标签: java sql database-design

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

你能帮我一个吗?

我的模型设计包括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字段。在这种情况下,当用户按下“删除帐户”按钮时,我可以清除个人信息并指定isActive = false

你对此有何想法?

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

dateStamp

我是对的吗?

1 个答案:

答案 0 :(得分:2)

一些需要考虑的方法。

  1. isActive列(或等效的isDeleted列)添加到USER表。删除用户时清除(或设置)该位。您可能还想删除其他敏感信息。这样就可以在将来重新激活已删除的用户。

  2. USER_ID中所有受影响的行中的LEASING_HISTORY字段替换为表示已删除用户的特殊保留ID(可能名称为"Deleted User")。< / p>

  3. 根据@killjoy,通过添加将USER_IDBOOK_INSTANCE_ID相关联的第三个表来规范化这两个表,并从USER_ID中删除LEASING_HISTORY列。然后,您只需从第三个表中删除受影响的行,而不会丢失图书租赁历史记录。

  4. <强>附录

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

    或许更可行的方法是:

    1. 不要将USER_ID限制为外键。这样,您可以安全地删除USER行,而无需进行任何清理。当然,您仍需要在创建每个新LEASING_HISTORY行时确保参照完整性(以编程方式)。
    2. 我更喜欢(1)因为您没有删除任何用户历史记录,只删除了敏感的用户信息。