我正在开发提供库的测试项目。就我的发展而言,我不断遇到问题。
你能帮我一个吗?
我的模型设计包括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
我是对的吗?
答案 0 :(得分:2)
一些需要考虑的方法。
将isActive
列(或等效的isDeleted
列)添加到USER
表。删除用户时清除(或设置)该位。您可能还想删除其他敏感信息。这样就可以在将来重新激活已删除的用户。
将USER_ID
中所有受影响的行中的LEASING_HISTORY
字段替换为表示已删除用户的特殊保留ID(可能名称为"Deleted User"
)。< / p>
根据@killjoy,通过添加将USER_ID
与BOOK_INSTANCE_ID
相关联的第三个表来规范化这两个表,并从USER_ID
中删除LEASING_HISTORY
列。然后,您只需从第三个表中删除受影响的行,而不会丢失图书租赁历史记录。
<强>附录强>
第二个想法,(3)可能不是一个好方法。我的想法是将USER_ID
外键分离到一个单独的表中,但这并不能解决悬空删除的外键问题。
或许更可行的方法是:
USER_ID
限制为外键。这样,您可以安全地删除USER
行,而无需进行任何清理。当然,您仍需要在创建每个新LEASING_HISTORY
行时确保参照完整性(以编程方式)。我更喜欢(1)因为您没有删除任何用户历史记录,只删除了敏感的用户信息。