Database 数据库-软删除或分离日志表

Database 数据库-软删除或分离日志表,database,rest,api,database-design,architecture,Database,Rest,Api,Database Design,Architecture,我正在构建一个REST API,它具有以下端点: GET /api/v1/categories - Get all categories DELETE /api/v1/categories/$id - Delete a specific category 当客户端请求所有类别时,服务器必须返回上次修改HTTP头的所有类别 一旦a类别被删除,并且客户端请求所有类别(如果在删除时间之前进行了修改),则服务器应返回所有类别(没有删除的类别),但HTTP标头显示上次修改的时间,即使该时间是删除的时间

我正在构建一个REST API,它具有以下端点:

GET /api/v1/categories - Get all categories
DELETE /api/v1/categories/$id - Delete a specific category
当客户端请求所有类别时,服务器必须返回上次修改HTTP头的所有类别

一旦a类别被删除,并且客户端请求所有类别(如果在删除时间之前进行了修改),则服务器应返回所有类别(没有删除的类别),但HTTP标头显示上次修改的时间,即使该时间是删除的时间

我考虑采用两种方法来实现这一点:

  • 添加一列,该列带有指示是否已删除的标志(软删除)
  • 创建一个表以记录表的修改
  • 在第一种方法中,我将在category表中添加一列,指示记录是否已被删除。通过这种方式,使用此列和存储上次修改时间戳的列,我可以检查在给定时间戳之后是否发生了任何修改

    在第二种方法中,我将添加一个记录任何表中最后一次修改的表。此表的每一行都是在系统的任何其他表中发生的最后一次修改。这样,当类别被删除时,日志表中保存有关于类别表的信息的记录被更新,表明最后一次操作是带有操作时间戳的删除。这样,当我必须检查在特定时间戳之后category表中是否发生了任何更改时,首先检查日志表并决定是否查询category表

    即使我已经使用了这个类别作为例子,这个问题也会发生在我的API的其他资源上,解决方案也会以同样的方式用于它们


    你们对目前提出的解决这个问题的方法有什么看法?

    第一种方法有几个不便之处

    • 您将存储不再访问的数据 最近发生了修改
    • 如果你有一些限制(例如:。 唯一)在您的表上,您将无法创建 在“柔和”删除的对象上发生碰撞

    在更一般的情况下,“软”删除很少是一个好主意,通常可以使用来自领域驱动设计的方法来解决,这取决于修改的频率和时间。您可以使用第一种方法,将删除的类别保留在表中,比方说保留一周,然后添加一个后台作业来删除大约1.5周前删除的类别。

    我也考虑过这一点,但后台作业只能在类别集合中有修改时删除删除的类别(已删除类别的用户所有者的名称)在删除时间之后。但我不确定这是否是一个好的解决方案,因为我总是看到人们说要避免软删除…我同意软删除不是一个好方法,因为它会在表中保留垃圾。这同样取决于您的业务需要。您可以从类别中删除条目,然后使用backgr将其添加/插入到另一个表中你是对的。你对这个问题有什么建议?除了我列出的方法之外,我找不到其他方法……好吧,第二种方法似乎适合你的需要:)你知道实施第二种方法的最佳方法是什么吗?是否使用数据库触发器在每次类别更改时自动更新日志表?好的,“最佳方法”取决于您的需求、体系结构以及可能的技术堆栈。触发器方法很简单,简单性对于可维护性和可扩展性来说是非常重要的。如果使用事件驱动模型,则可以将事件侦听器从持久性(触发器)移动到数据访问层或业务层,也可以在数据访问层上使用装饰器模式或使用AOP(或node.js中的“中间件”)。。。这个列表并不是详尽无遗的:)我想说,这取决于您:)总是会对性能产生影响:)额外访问数据库会带来成本,在这里可能可以忽略不计。是否同步处理事件可能会影响用户体验。。。。别为那件事操心太多。如果您使用hibernate,您可以使用实体侦听器,它似乎适合您的情况