使用 EAV 表的“软删除”解决方案是否存在问题?

2024-01-06

我读过一些关于设置一个丑陋的一面的信息deleted_at表中的字段表示行已被删除。

Namely
http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/ http://richarddingwall.name/2009/11/20/the-trouble-with-soft-delete/

从要删除的表中获取行并将其转换到某些 EAV 表中是否存在任何潜在问题?

例如。

假设我有两张桌子deleted and deleted_row分别描述如下。

    mysql> describe deleted;
    +------------+--------------+------+-----+---------+----------------+
    | Field      | Type         | Null | Key | Default | Extra          |
    +------------+--------------+------+-----+---------+----------------+
    | id         | int(11)      | NO   | PRI | NULL    | auto_increment | 
    | tablename  | varchar(255) | YES  |     | NULL    |                | 
    | deleted_at | timestamp    | YES  |     | NULL    |                | 
    +------------+--------------+------+-----+---------+----------------+

    mysql> describe deleted_rows;
    +--------+--------------+------+-----+---------+----------------+
    | Field  | Type         | Null | Key | Default | Extra          |
    +--------+--------------+------+-----+---------+----------------+
    | id     | int(11)      | NO   | PRI | NULL    | auto_increment | 
    | entity | int(11)      | YES  | MUL | NULL    |                | 
    | name   | varchar(255) | YES  |     | NULL    |                | 
    | value  | blob         | YES  |     | NULL    |                | 
    +--------+--------------+------+-----+---------+----------------+

现在,当您想从任何表中删除一行时,您可以将其从表中删除,然后将其插入到这些表中。

    deleted
    +----+-----------+---------------------+
    | id | tablename | deleted_at          |
    +----+-----------+---------------------+
    |  1 | products  | 2011-03-23 00:00:00 | 
    +----+-----------+---------------------+

    deleted_row
    +----+--------+-------------+-------------------------------+
    | id | entity | name        | value                         |
    +----+--------+-------------+-------------------------------+
    |  1 |      1 | Title       | A Great Product               | 
    |  2 |      1 | Price       | 55.00                         | 
    |  3 |      1 | Description | You guessed it... it's great. | 
    +----+--------+-------------+-------------------------------+

我立即看到了一些事情。

  1. 您需要使用应用程序逻辑 进行数据透视(Ruby、PHP、Python、 ETC)
  2. 桌子可以变得很大 因为我正在使用blob处理 行值的未知大小

您是否发现这种类型的软删除还有其他明显的问题?


为什么不使用存档表来镜像您的表呢?

create table mytable(
   col_1 int
  ,col_2 varchar(100)
  ,col_3 date 
  ,primary key(col_1)
)

create table mytable_deleted(
   delete_id  int      not null auto_increment
  ,delete_dtm datetime not null
-- All of the original columns
  ,col_1 int
  ,col_2 varchar(100)
  ,col_3 date 
  ,index(col_1)
  ,primary key(delete_id)
)

然后只需在表上添加 on-delete-triggers 即可在删除之前将当前行插入镜像表中?这将为您提供非常简单且非常高性能的解决方案。

您实际上可以使用数据字典生成表和触发器代码。

请注意,我可能不想在存档表中的原始主键 (col_1) 上有唯一索引,因为如果您使用自然键,您实际上可能最终会随着时间的推移删除同一行两次。除非您计划在应用程序中连接存档表(用于撤消目的),否则您可以完全删除索引。另外,我添加了删除时间(deleted_dtm)和一个可用于删除已删除(呵呵)行的代理键。

您还可以考虑对deleted_dtm 上的存档表进行范围分区。这使得从表中清除数据变得非常容易。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 EAV 表的“软删除”解决方案是否存在问题? 的相关文章

  • Bigquery:如何声明数组变量并使用 select 语句设置数据?

    我试图在 BigQuery 上声明一个数组变量 但无法在变量中放入 SQL 语句 我找不到任何与此相关的主题 我想将表的所有列名放入变量中 所以我尝试了以下方法 DECLARE my array ARRAY
  • 无法通过 PyODBC 连接创建数据库

    我在用pyodbc in python 2 7 with MS SQL Server 2008R 这是我创建数据库的代码 SQL代码单独在SQL中工作正常 但在python中执行时崩溃 SQL command IF EXISTS SELEC
  • 如何解决postgresql中group by和聚合函数的问题

    我正在尝试编写一个查询来划分两个 SQL 语句 但它显示了我 ERROR column temp missed must appear in the GROUP BY clause or be used in an aggregate fu
  • PL/SQL 触发器问题

    我正在尝试编写一个触发器来填充包含员工更新工资信息的表 我现在遇到一个无法解决的问题 这是要填充的表 drop table SalUpdates cascade constraints create table SalUpdates Sal
  • PostgreSQL 对 string\varchar 的各种清理

    我必须通过以下方式清理一些 varchar 删除特殊字符 例如 来自封闭列表 我已经成功地通过大量使用replace regexp replace来做到这一点 但我正在寻找类似于SQL Server中的东西 删除以下数字但不删除相邻的数字含
  • 在 Postgres 中以周为单位分割间隔

    这是另一个关于日期的 SQL 问题 我正在使用 PHP 和 Postgres 构建一个日历应用程序 它将显示几天 几周甚至几个月的事件 每个事件都有开始日期和结束日期 按范围选择它们不是问题 然而 如果 Postgres 可以在每周的第一天
  • INET6_ATON 的替代 MySQL 代码

    将旧的 INET ATON 值转换为新的二进制 INET6 ATON 值 无需 INET6 ATON INET6 NTOA 我们在表中已有数据 字段类型为UNSIGNED INT其中保存了使用以下命令创建的 IPv4 数据INET ATON
  • 修改SQL Server中的默认值

    我正在尝试使用 SQL Server 2008 中的 SQL 语句更改列的默认值 我在很多地方找到了如何在创建表 添加列时设置默认值 但没有找到如何设置它 一旦列已经存在就修改它 这就是我可以用来在添加时设置它的内容 ALTER TABLE
  • MySQL CREATE TABLE 语句上的外键错误(错误:150)

    我觉得我已经在一对非常简单的创建表语句上尝试了一切可能的方法 类型匹配 我尝试使用 ENGINE InnoDB 等 但很困惑为什么我收到外键错误 我已经离开 SQL 一段时间了 所以这可能是一个简单的问题 mysql gt CREATE T
  • 更新表并返回旧值和新值

    我正在编写一个 VB 应用程序 用于清理 DB2 数据库中的一些数据 在一些表中我想更新整个列 例如帐号列 我正在将所有帐号更改为从 1 开始 并在列表中向下递增 我希望能够返回旧帐号和新帐号 这样我就可以生成某种可以引用的报告 这样我就不
  • 数据库函数 VS Case 语句

    昨天我们遇到了一个场景 必须获取 a 的类型db field在此基础上我们必须编写该字段的描述 喜欢 Select Case DB Type When I Then Intermediate When P Then Pending Else
  • 数据库、表和列命名约定? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每当我设计数据库时 我总是想知道是否有命名数据库中项目的最佳方法 我经常问自己以下问题 表名应该是复数吗 列名应该是单数吗 我应该为表或列添加前
  • 为列名创建动态选择获取值 - 在 SQL Server 中

    请帮助我创建一个选择 SQL 语句 其中的结果列名称是从原始表中的列值获取的 表名是Device Part 用户可以输入很多DeviceCode其中有许多动态PartTypeName PartTypeName 值为PartInfo 这可能有
  • 如果数组重叠,则折叠多行数组

    我在 PostgreSQL 9 3 中有一个表 其中包含一个列 每行包含一个数组 我正在努力寻找崩溃的方法 共享相同元素的数组行 Examples 简单重叠 给定以下两行数组 1 2 3 5 3 6 9 结果将是一行包含 5 1 2 3 6
  • 如何:SQL 还是 NOSQL?

    我还没有遇到过这个问题 但这就是我的想法 非常肤浅和简单化恕我直言 如果您有键值类型的存储 并且所有访问都是键查找 请使用 NOSQL 解决方案 如果您想要基于值 和子值 进行查找或者有一些更复杂的东西 例如联接 您会选择关系解决方案 事务
  • FIND_IN_SET 具有多个值[重复]

    这个问题在这里已经有答案了 我想从数据库字段搜索多个值 以下是我的查询 SELECT FROM tablename WHERE FIND IN SET 12 13 15 15 category id 我如何搜索它对我不起作用 FIND IN
  • 如何获取列中每个不同值的计数? [复制]

    这个问题在这里已经有答案了 我有一个名为 posts 的 SQL 表 如下所示 id category 1 3 2 1 3 4 4 2 5 1 6 1 7 2 每个类别编号对应一个类别 我将如何计算每个类别出现在帖子中的次数一条 SQL 查
  • oracle中是否有相当于concat_ws的东西?

    我有大量的列试图聚合在一起 其中大多数都有 NULL 值 我想分隔确实以 出现的值但我在oracle中找不到有效的方法来做到这一点 CONCAT WS 正是我所需要的 因为它不会在 NULL 值之间添加分隔符 但 Oracle 不支持这一点
  • 单个 sql 查询可以处理 sql server 中的 null 或值日期范围

    使用 SQL Server 2008 我有一个存储过程 其中开始日期和结束日期作为日期范围的输入参数 寻找一个singlesql 查询 其中在 where 子句中有一个开始日期和结束日期 可以处理日期均为空或都有值的两种情况 我不想使用 I
  • Spring Boot如何加入自定义查询

    我需要创建一个端点 该端点按州返回人口普查数据以及城市列表 我目前使用两个端点来获取此数据 目前回应 自定义查询一 censusByState id 1 code 11 name Rond nia statePopulation 18152

随机推荐

  • 带有节点的分类视图

    使用 Drupal 6 我尝试创建一个包含如下视图的页面 分类术语 1 包含该术语的节点的标题和描述 包含该术语的节点的标题和描述 分类学术语 2 包含该术语的节点的标题和描述 包含该术语的节点的标题和描述 分类学术语 3 包含该术语的节点
  • 弱阻力和强阻力有什么区别

    我读过一些关于强抗碰撞性和弱抗碰撞性的文章 但我无法理解其中的区别 我唯一能理解的是 具有弱抗碰撞性的哈希函数发生碰撞的概率较低 而具有强抗碰撞性的哈希函数发生碰撞的概率较高 我无法理解什么是真实的东西 这些参数的意义是什么 谁可以帮我这个
  • 按组选择事件首次发生之前的行

    我有一系列的观察结果 描述了是否以及何时在特定区域发现动物 下面的示例表标识了何时看到某种动物 status 1 或不 status 0 白天 id date status 1 1 2014 06 20 1 2 1 2014 06 21 1
  • CMake路径错误

    我正在尝试为 kinect 演示构建 Visual Studio 项目 rgbddemo http nicolas burrus name index php Research KinectRgbDemoV5 根据页面上的说明 我需要设置
  • 如何获得向量中函数的多个输出?

    假设我有一个函数 其输出是两个实数 a 和 b a b function c 我想获得向量 v 中的所有输出 v function c 没有执行我想要的操作 v 只是 a 当然这里我可以做v a b 但所讨论的函数是 N 维数组的 ind2
  • Ionic 1 推送通知

    有人有 ionic 1 推送通知的经验吗 他们建议的云解决方案有其他替代方案吗 有人可以展示实施示例吗 请记住 我对 ionic 完全陌生 我用这个插件https github com phonegap phonegap plugin pu
  • 如何在 asp.net mvc 3 项目中路由 .aspx 页面?

    我在以下路径中有一个 aspx 页面 Areas Management Views Ticket Report aspx 我想将其路由到浏览器中的以下路径 http localhost Reports Tickets 我怎样才能做到这一点
  • MVC 3 模型验证问题 - 疏忽或有意为之

    我遇到了一个场景 我需要知道当前正在验证哪个属性在一个习惯中ValidationAttribute 我认为这在 MVC 3 中会很容易 因为ValidationContext正在被传递到IsValid http msdn microsoft
  • 时间间隔不均匀的组的滚动总和

    这是我的调整之前发布的问题 https stackoverflow com questions 41693081 r calculate number of distinct categories in the specified time
  • 分析 GIL

    有没有办法分析 Python 进程对 GIL 的使用情况 基本上 我想知道GIL 持有时间的百分比是多少 该进程是单线程的 我的动机是我用 Cython 编写了一些代码 它使用nogil 理想情况下 我想在多线程进程中运行它 但为了知道这是
  • Python 数学模块

    每当我尝试使用 Python 的指数和对数模块的任何内置函数时 都会收到如下错误 NameError name sqrt is not defined 我尝试过使用math sqrt 4 sqrt 4 and sqrt 4 0 但它们都不起
  • opencv各列之和

    在 Matlab 中 如果 A 是矩阵 则 sum A 将 A 的列视为向量 返回每列和的行向量 总和 图像 用OpenCV怎么能做到呢 Using cvReduce对我有用 例如 如果您需要将矩阵的按列总和存储为行矩阵 您可以这样做 Cv
  • 带有阅读更多内容的网页视图

    Is it possible to specify the number of lines displayed by a web view and to disable its scrolling and to have a read mo
  • Laravel - DecryptException:“MAC 无效”

    在 Laravel 中进行注册时 我使用密码加密算法而不是 Laravel 中内置的 bcrypt 函数 因为要获取密码并在忘记密码时将其发送到邮件 但解密它显示错误 例如 DecryptException The MAC is inval
  • 如果 postgres 有依赖对象,如何删除用户

    数据库 idd 所有者是角色idd owner 数据库有 2 个数据模式 public and firma1 用户可能对此数据库和对象拥有直接或间接分配的权限 用户不是任何对象的所有者 它只授予了权利 如何删除这样的用户 I tried r
  • 如何在 Firebase 中执行以下查询? (多个where条件)[重复]

    这个问题在这里已经有答案了 考虑以下 firebase 结构 users 00 03 aa dc 1c 2b firstName Ofek groupName thailand lastName Ron registration type
  • numpy数组除以向量列

    我有一个 3x3 numpy 数组 我想用 3x1 向量划分该数组的每一列 我知道如何将每一行除以向量的元素 但无法找到划分每一列的解决方案 您可以转置数组以在每一列上进行划分 arr 3x3 T arr 3x1 T
  • WebGL 从浮点渲染目标读取像素

    有一些混乱e g https www khronos org webgl public mailing list archives 1210 msg00090 html就支持水平而言渲染WebGL 中的浮点纹理 OES texture fl
  • 在 Angular 4 的服务中使用 Router

    我已经使用 Angular 2 4 大约一年了 我不断地回到这个困境 将 Router 注入到服务中是否可以被视为一种不好的做法 这是更多的建筑问题 我相信这个问题没有确切的答案 但我想听听你的意见 这里有两个例子 考虑下一个代码 想象一下
  • 使用 EAV 表的“软删除”解决方案是否存在问题?

    我读过一些关于设置一个丑陋的一面的信息deleted at表中的字段表示行已被删除 Namely http richarddingwall name 2009 11 20 the trouble with soft delete http