用于高度规范化数据库中选择表数据的通用版本控制策略

2023-12-13

很抱歉标题冗长,但要求/问题相当具体。

参考下面的示例(但非常简化)结构(伪 SQL 中),我希望能更好地解释它。

TABLE StructureName {
  Id GUID PK,
  Name varchar(50) NOT NULL
}

TABLE Structure {
  Id GUID PK,
  ParentId GUID,                 -- FK to Structure
  NameId GUID NOT NULL           -- FK to StructureName
}

TABLE Something {
  Id GUID PK,
  RootStructureId GUID NOT NULL  -- FK to Structure
}

正如我们所看到的,Structure 是一种简单的树结构(不担心孩子的排序问题)。 StructureName 是翻译系统的简化。最后,“Something”只是引用树的根结构的东西。

这只是需要进行版本控制的众多表之一,但这一个对于大多数情况来说都是一个很好的例子。

需要对结构表的名称和/或树“布局”的任何更改进行版本控制。以前的版本应该始终可用。

似乎有一些可能性可以解决这个问题,例如复制整个结构,但大多数方法都会导致“失去”引用完整性。例如,如果遵循这种方法,则必须复制“Something”记录,因为根结构将是一条新记录,并且具有新的 ID。

其他可能的解决方案途径是研究 Wiki 如何处理这个问题,或者更进一步研究正确的版本控制系统如何工作。

目前,我觉得有点不知道如何以通用的方式进行此操作。

任何想法将不胜感激。

Thanks

leppie


一些快速的想法:

完整副本:创建结构的副本,但为每个表添加一个version_idPK 和所有 FK 列;因此,您可以创建具有完整引用完整性的生命数据副本。

  • pro:方便查询历史记录
  • 缺点:大量(复制的冗余数据)

更改副本:只复制实际更改的内容以及valid_from / valid_to data.

  • 优点:复制的数据量低
  • 缺点:很难查询,因为必须按时间间隔加入

变化:这适用于两种方案。您可以将当前记录保留在与旧版本相同的表中,但将其标记为当前记录,而不是创建结构的副本。

  • 优点:表格数量较少,历史信息和当前信息更容易混合
  • 缺点:正常操作在更大的表上运行,这会导致性能影响

审核日志:根据您的实际要求,只需创建如下审计跟踪就足够了:

id,  timestamp,  changed_table,  changed_column,  old_value,  new_value,  changed_by

您可以将其扩展到完整的表结构:

transaction,  table_change,  changed_column
  • pro:通用,因此易于针对大量表实现
  • 缺点:如果需要重建给定时间一组记录的状态,查询将成为一场噩梦

I wrote 关于各种版本控制方法的博客,但请注意:它是德语的。

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

用于高度规范化数据库中选择表数据的通用版本控制策略 的相关文章

  • Laravel 使用数据库自​​动完成文本字段

    我正在尝试制作如下所示的自动完成表单 但该表单没有显示建议 因为我的数据库查询没问题 形成科尔 控制器方法代码 Routes 当我搜索链接时 我得到如下查询结果 显示结果 id 1 value 苏拉夫霍森 id 2 value 苏拉夫霍森
  • 用于桌面数据库应用程序的 Python 框架

    是否有一个框架可以为Python开发桌面数据库应用程序 一些带有CRUD屏幕的屏幕 我正在寻找类似于 Windows 窗体的东西 能够将 TextField Combos 和其他 UI 隐喻与datasets连接到关系数据库例如 MySQL
  • MySQL 行级锁

    我不确定行级锁是如何工作的 但这是我的问题 我有一个表 T id int balance int engine InnoDB 我想锁定 ID 1 的行 所以我开始一个像这样的事务 start transaction select from
  • 用户离开时如何正确插入时间( user_left 和 user_joined 具有相同的值)

    在这段代码中 我想获取用户加入和离开的时间并将其存储到数据库中 如果我在 连接 表和 左 表中获得相同的值 会发生什么情况 如何修复它以便它存储不同的值 Schema create user info function Blueprint
  • 如何在运行“更新”之前查看存储库中的文件

    I run hg pull这向我的存储库添加了新的更改 在使用新更改更新我的工作目录之前 我想查看这些新文件 更改 我相信我使用的 SVNsvn st u但在 Mercurial 中是如何完成的呢 在拉动之前 您可以使用 hg incomi
  • Cassandra 与 ZooKeeper 的事务 - 这有效吗?

    我正在尝试在 ZooKeeper 的帮助下为 Cassandra 实现一个事务系统 由于我认为我在数据库实现方面没有足够的经验 所以我想知道我的想法原则上是否可行 或者是否有任何重大缺陷 以下是步骤的高级描述 识别所有要编辑的行 键 和列
  • 将“选票”存储在数据库中

    我正在编写一个 Intranet 应用程序 其功能之一大致类似于内容投票 与 SO Amazon 和许多其他网站的做法不同 假设每个可投票的内容都有一个唯一的 ID 并且每个用户 他们经过身份验证 都有一个唯一的 ID 最简单的方法似乎是有
  • 本地 SQLite 与远程 MongoDB

    我正在设计一个新的 Web 项目 在研究了一些旨在可扩展性的选项后 我提出了两个数据库解决方案 为可扩展方式精心设计的本地 SQLite 文件 每个 X 用户一个新的数据库文件 因为写入将取决于用户内容 不存在跨用户数据依赖性 远程 Mon
  • 淹没在空无的海洋中

    我继承的一个应用程序跟踪对材料样品执行的实验室测试结果 数据存储在单个表 tblSampleData 中 其主键为 SampleID 并有 235 列代表潜在的测试结果 问题是每个样本仅执行少量测试 因此每行包含超过 200 个空值 实际上
  • 将文件提交到不同的分支而不进行签出

    是否可以在 git 分支中提交文件而不检出该分支 如果是这样怎么办 本质上 我希望能够将文件保存在我的 github Pages 分支中 而无需一直切换分支 有什么想法吗 我需要以原子方式完成此操作 而不更改当前目录 因此多个命令将无法工作
  • Firebase 查询 - 查找包含字符串的子项

    我在使用 Firebase 查询时遇到了一些问题 我想查询对象 其中对象子值包含特定字符串 到目前为止 我有一些看起来像这样的东西 Firebase ref Firebase alloc initWithUrl https dinosaur
  • 如何修复损坏的本地 Subversion 工作副本?

    我通常使用 git 对 Subversion 的基础知识知之甚少 所以请保持温柔 我在 Windows 7 上使用 TortoiseSVN SVN 客户端最近宣布需要升级 所以我就这么做了 所有文件都丢失了源代码管理图标 并且资源管理器中出
  • MySQL Workbench:如何将 mysql 数据库导出到 .sql 文件?

    我需要将 mysql 工作台中的数据库导出到文件 sql 该怎么办 在 MySql Workbench 版本 8 0 中 您只需按照以下步骤操作即可 Go to Server tab Go to 数据库导出 这会打开类似这样的东西 在中选择
  • Redis 是否使用用户名进行身份验证?

    我已经在我的环境中设置了Redis 并且只看到了通过密码授权的部分 有没有办法也设置用户名 还是只能通过密码验证 Redis 6 上有 ACL 这些都有一个用户名 查看https redis io topics acl https redi
  • 如何使用 php 命令使注册表单高度安全?

    我想让代码对用户来说真正安全 下面的代码显示了 php 代码 我已将其用于我的网站 现在我已经使用了一些验证 例如密码和重复密码必须匹配 并且用户必须输入所有字段 为了使其更安全 我想插入安全命令 例如 PDO mysqli crypto
  • 在插入 SQLite 之前检查表 B 中的日期是否在表 A 中的日期之间

    我有一个名为 项目 的表 其中包含开始日期和结束日期 我还有一个名为 Plan 的表 它有自己的开始日期和结束日期列 但我通过某种方式验证计划开始 结束日期是否在匹配的项目开始 结束日期之间 我不知道在创建表或向计划表中插入行时添加检查是否
  • 如何从 Emacs 中检出 Perforce 下的文件?

    我在工作中使用 Perforce 进行源代码控制 并且希望从 Emacs 中 打开以进行编辑 源代码控制下的文件 那怎么办呢 我需要在 Emacs 中设置什么 有插件吗 我还想执行其他 p4 操作 例如提交我的更改等 Perforce Em
  • GoLang - 坚持使用 ISO-8859-1 字符集

    我正在开发一个项目 我们需要将信息保存在具有 ISO 8859 1 表的旧数据库中 因此 在向数据库写入内容之前 我需要将其从 UTF 8 转换为 ISO 8859 1 每次从数据库检索它时 我都需要将其转换回 UTF 8 我试图使用图书馆
  • 检索使用 Uniqueidentifier 插入的最后一行,它不是 IDENTITY

    我对一个查询感到困惑 我需要找出表中添加的最后一行 其中有一列数据类型为 Uniqueidentifier 列是 aspnet Applications ApplicationId 注意 该列是Uniqueidentifier 它不是IDE
  • 常用姓名别名/昵称数据库

    我参与了一个 SQL NET 项目 该项目将搜索名称列表 我正在寻找一种方法来返回类似名字的人的一些结果 如果搜索 Tom 结果将包括 Thom Thomas 等 这是文件还是 Web 服务并不重要 设计示例 Table Names has

随机推荐