应该使用 id 或时间戳来确定数据库表中行的创建顺序吗? (考虑到系统时钟设置不正确的可能性)

2024-03-26

数据库表用于存储对文本文档的编辑更改。

数据库表有四列:{id, timestamp, user_id, text}

每次用户编辑文档时,都会向表中添加一个新行。新行具有自动递增的 id 和与数据保存时间匹配的时间戳。

要确定用户在特定编辑期间进行了哪些编辑更改,text为响应他或她的编辑而插入的行与text在先前插入的行中。

要确定哪一行是先前插入的行,可以使用id列或timestamp可以使用柱。据我所知,每种方法都有优点和缺点。

使用确定创建顺序id

  • 优点:避免因系统时钟设置不正确而导致的问题。

  • 缺点:似乎是滥用id列,因为它规定了除身份之外的含义id柱子。管理员可能出于任何原因(例如在数据迁移期间)更改一组 id 的值,因为只要值是唯一的,值是什么并不重要。那么行的创建顺序就无法再确定。

使用确定创建顺序timestamp

  • 优点:id列仅用于标识,并且timestamp正如它应该的那样,用于时间。
  • 缺点:只有当每次向表中插入行时都知道系统时钟已正确设置时,此方法才可靠。如何才能确信每个插入的系统时钟都已正确设置?如果发现系统时钟在过去某个不精确已知的时间段内被错误地设置,那么如何修复表的状态呢?

我寻求一个强有力的论据来选择一种方法而不是另一种方法,或者描述另一种比我正在考虑的两种方法更好的方法。


使用顺序id会更简单,因为它可能(?)主键,因此有索引并且访问速度更快。鉴于你有user_id,您可以快速确认最近和之前的编辑。

使用timestamp也适用,但它可能是一个较长的条目,而且我们根本不知道它是否已建立索引,加上潜在的冲突。您正确地指出系统时钟可以改变......而顺序时钟id的不能。

鉴于您的更新:

由于很难了解您的具体要求,因此我将其作为特定项目对 200K+ 复杂文档和数百万次修订所需内容的证据。

根据我自己的经验(为 60 多名全职研究人员组成的内部团队构建完全可审核的文档/分析系统)。我们最终使用了id以及许多其他领域(包括timestamp)提供审计跟踪和完整版本控制。

我们构建的系统每个配置文件都有 200 多个字段,因此对文档进行版本控制远比仅仅为每个配置文件存储一组已更改的文本/内容复杂得多;然而,每个配置文件都可以被编辑、批准、拒绝、回滚、发布,甚至可以作为一个文档导出为 PDF 或其他格式。

我们最终所做的(经过大量策略/计划之后)是存储配置文件的连续版本,但它们是keyed 主要是 on an id field.

时间戳

时间戳也被捕获作为辅助检查,我们通过使用定期检查时间对齐并在必要时纠正它们的 cron 脚本来确保保持系统时钟准确(在服务器集群中)。我们还用过Ntpd http://en.wikipedia.org/wiki/Ntpd以防止时钟漂移。

其他捕获的数据

每次编辑捕获的其他数据还包括(但不限于):

User_id
User_group
Action
Approval_id

还有其他满足内部要求的表格(包括自动生成文档的注释)——因为一些配置文件编辑是使用来自机器人的数据(使用 NER/机器学习/AI 构建)完成的,但需要得到其中之一的批准团队在编辑/更新可以发布之前。

还保留了所有用户操作的操作日志,以便在审核时可以查看单个用户的操作 - 即使他们没有执行此类操作的权限,该操作仍然会被记录。

关于迁移,我不认为这是一个大问题,因为您可以在移动/转储/传输数据时轻松保留 id 序列。也许唯一的问题是您是否需要合并数据集。在这种情况下,您总是可以编写迁移脚本 - 因此从个人角度来看,我认为这种缺点有所减少。

可能值得查看数据浏览器的 Stack Overflow 表结构(相当复杂)。您可以在此处查看表结构:https://data.stackexchange.com/stackoverflow/query/new https://data.stackexchange.com/stackoverflow/query/new,来自元上的一个问题:SO 如何存储修订版本? https://meta.stackexchange.com/questions/87224/how-does-so-store-revisions

作为一个修订系统,SO 运行良好,并且降价/修订功能可能是一个很好的例子。

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

应该使用 id 或时间戳来确定数据库表中行的创建顺序吗? (考虑到系统时钟设置不正确的可能性) 的相关文章

  • html iframe 中的字符错误

    对不起我的英语我说西班牙语 我正在尝试显示多个php and mysql将在 iframe 内显示的注册 问题是 iframe 向我显示特殊字符的错误 例如 重音符号 感叹号等 D ndecuestamenosyseconsumem s 这
  • FIND_IN_SET 具有多个值[重复]

    这个问题在这里已经有答案了 我想从数据库字段搜索多个值 以下是我的查询 SELECT FROM tablename WHERE FIND IN SET 12 13 15 15 category id 我如何搜索它对我不起作用 FIND IN
  • 在不使用 PHP 的情况下将 MYSQL 中的表字段更新为其值加上常量

    我想表演一个UPDATE in MYSQL其中我获取一个字段值 添加一个常量并将新值保存在同一字段中 假设我们有一个名为OldValue在一个名为aTable 伪代码可能是 UPDATE aTable SET OldValue OldVal
  • MySQL 和 PHP:多关键字搜索

    我有一个包含逗号分隔关键字的字符串 例如 keywords keyword1 keyword2 keyword3 我的表架构 名为tbl address是这样的 简化的 id INT 11 PRIMARY KEY AUTO INCREMEN
  • Sqlite 删除速度极其慢 - 如何加快速度?

    我读到删除操作很慢 我想知道如何改进此检查 我有一个每天填充 10 15k 行的表 每次启动时我都需要清理所有超过 6 个月的记录 但是当数据库增长时 我开始遇到速度问题 当我运行此命令时 有接近 100 万条记录 即使我没有任何内容要删除
  • 如何更改Mysql的连接排序规则

    如何更改 mysql 数据库的连接排序规则 我在 ubuntu 14 中使用 Mysql workbench 5 5 和 mysql 5 5 当我执行存储过程时 出现错误 错误代码 1267 操作 的排序规则 utf8 general ci
  • 在 EXISTS 查询中使用 LIMIT 有什么意义吗?

    添加一个是否有任何性能优势LIMIT to an EXISTS查询 或者 MySQL 会自行应用限制吗 Example IF EXISTS SELECT 1 FROM my table LIMIT 1 can this improve pe
  • MYSQL数据库删除行后需要进行后期优化

    我有一个当前为 10GB 的日志表 它有很多过去两年的数据 我真的觉得目前我不需要那么多 我是否错误地认为在表中保存多年的数据不好 表越小越好 我的桌子都有 MYISAM 引擎 我想删除 2014 年和 2015 年的所有数据 很快我就会删
  • Mysql:my.cnf中的修改不生效

    我已经更新了my cnf我的数据库文件包含以下行 max connections 200 之后我停止并启动 mysql 服务以使更改生效 但由于某种原因 此更改不会影响数据库 因为如果我运行 mysql gt select max conn
  • Rails 中的多列主键

    我正在尝试将桌面应用程序迁移到rails 还处理相当老式的现有数据库 问题是我在一列中没有唯一的 ID 但表的三列保证了记录的唯一性 鉴于我有三个表 authors author name author letter author nr1
  • 如何让 mysql 输出 DateTime 到儒略日数?

    基本上我正在使用用于 Ruby 的 MySQL gem http www tmtm org en mysql ruby 并且我对日期比较没有合理的支持 这Mysql Time类只为我提供了访问器方法 如年 月 秒等 如果我可以将其转换为 R
  • WPF 应用程序的最佳本地数据库解决方案是什么?

    目前适用于 WPF 应用程序的最佳解决方案是什么一台电脑 where 各种用户登录它们并使用它们在本地获取 保存信息 以下是我看到选项的方式 MDF似乎是最好的选择 因为我假设您可以很好地锁定它 这样即使用户可以访问 mdf 文件 他们仍然
  • 创建用于存储高尔夫球成绩的可扩展数据库架构

    我正在尝试设计一个数据库来存储我所有的朋友和我的高尔夫球成绩 您可能知道 高尔夫得分由 18 洞的个人得分组成 我可以想到两种设计模式的方法 创建一个表 每个洞有一列 例如 h1 到 h18 该表具有引用其他表的 FK player id
  • 如何在 mysql 中两次连接同一个表?

    我有2张桌子 其中一个 域 具有域 ID 和域名 dom id dom url 另一列包含实际数据 其中 2 列需要 TO 和 FROM 域名 所以我有 2 列 rev dom from 和 rev dom for 它们都存储域表中的域名
  • 我想使用 Sequelize 将 MySQL 中的对象数组存储在单个列中

    之前我正在寻找如何使用 Sequelize 在 MySQL 中插入对象数组 然后我找到了一种直接插入数组的解决方案 例如 1 2 在单列中 insert into TABLE NAME id marks VALUES 21 1 2 但我正在
  • 如何在具有动态列的表中插入值 Jdbc/Mysql

    我想在具有动态列的表中添加值 我设法创建一个包含动态列的表 但我不知道如何插入数据 Create Table sql CREATE TABLE MyDB myTable level INTEGER 255 int columnNumber
  • 获取MySql中重复行的列表

    我有一张这样的桌子 ID nachname vorname 1 john doe 2 john doe 3 jim doe 4 Michael Knight 我需要一个查询 该查询将从具有相同 nachname 和 vorname 的记录
  • 选择不带 FROM 但有多于一行的选择

    如何在不从现有表中进行选择的情况下生成 2 行 2 列的表 我正在寻找的是一个返回的选择语句 e g id value 1 103 2 556 Use UNION http dev mysql com doc refman 5 0 en u
  • 如何跟踪数据库连接泄漏

    我们有一个应用程序似乎存在连接泄漏 SQL Server 表示已达到最大池大小 我独自一人在我的开发机器上 显然 只需导航应用程序 我就会触发此错误 SQL Server 活动监视器显示大量正在使用我的数据库的进程 我想查找哪些文件打开连接
  • MySQL REPLACE 在自动递增行中

    假设我有一个 MySQL 表 其中包含三列 id a and b和名为id is an AUTO INCREMENT场地 如果我将如下查询传递给 MySQL 它将正常工作 REPLACE INTO table id a b VALUES 1

随机推荐