- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在开发内容管理系统时,我遇到了一些困难。回到我的数据模型,我注意到一些问题可能会随着时间的推移变得更加普遍。
即,我想维护用户记录修改的审计跟踪(更改日志)(甚至会记录用户记录修改)。由于包含任意数量的模块,我无法为我的主键使用按表自动递增字段,因为在尝试将它们的键维护在单个表中时,这将不可避免地导致冲突。
审计追踪将记录user_id
、record_id
、timestamp
、action
(INSERT/UPDATE/DELETE)和archive
(旧记录的序列化副本)
我已经考虑了一些可能的解决方案,例如在应用程序逻辑中生成一个 UUID
主键(以确保跨数据库平台兼容性)。
我考虑过的另一种选择(我确信即使考虑这种方法,共识也会是负面的)是创建一个 RecordKey
表,以维护一个全局自动递增的 key 。不过,我确信有更好的方法可以实现这一点。
最终,我很想知道在尝试实现它时我应该考虑哪些选项。例如,我打算允许(至少开始)MySQL 和 SQLite3 存储选项,但我担心每个数据库将如何处理 UUID
。
编辑以使我的问题不那么模糊:Would using global IDs be a recommended solution for my problem?如果是这样,使用 128 位 UUID(应用程序或数据库生成的)我可以在我的表设计中做些什么来帮助最大限度地提高查询效率?
最佳答案
好的,您碰壁了。而且您意识到实际上数据库设计存在问题。以后你会多次撞到同一堵砖墙。你的 future 看起来并不光明。你想改变它。好。
但是您还没有做的是,找出造成这种情况的真正原因。除非你这样做,否则你无法逃避可预测的 future 。如果你这样做得当,就不会有砖墙,至少不会有这堵特殊的砖墙。
首先,您在所有表上设置了Id
iot 列以强制实现唯一性,而没有真正理解自然用于查找数据的标识符 和键。这就是砌墙的砖 block 。这是对需要考虑的问题的未考虑的下意识 react 。这就是您必须重新访问的内容。
不要再犯同样的错误。重击 GUID 或 UUID,或 32 字节Id
iot 列来修复你的NUMERIC(10,0) Id
iot 列不会做任何事情,除了使数据库更胖,和所有 访问,尤其是连接,速度要慢得多。这堵墙将由混凝土砌 block 砌成,每小时都会撞到你。
回头看看表格,并设计它们以成为数据库中的表格。这意味着您的起点是No Surrrogate Keys,没有Id
iot 列。完成后,您将只有很少的Id
列。不是零,不是所有表,但很少。因此,墙上的砖 block 很少。我最近发布了一组详细的所需步骤,因此请引用:
拥有一个包含所有表的审计“记录”的审计表的理由是什么?您喜欢遇到砖墙吗?您是否希望 db 的并发性和速度在 Insert hot-spot in one file 上成为瓶颈?
审计要求已经在 dbs 中实现了 40 多年,因此您的用户有一些其他要求不会改变的可能性不是很高。不妨适本地做。审计表的唯一正确方法(对于 Rdb)是每个可审计的真实表有一个审计表。 PK 将是原始表 PK 加上 DateTime(复合键在现代数据库中很常见)。其他列将是 UserId 和 Action。该行本身将是之前的图像(新图像是主表中的单个当前行)。使用完全相同的列名。不要把它打包成一根巨大的绳子。
如果您不需要数据(图像之前),则停止记录。无缘无故地录制所有音量是非常愚蠢的。可以从备份中获得恢复。
是的,单个 RecordKey
表是一个怪物。还有另一种有保证的单线程数据库方法。
不要对我的帖子使用react,我已经从你的评论中看出你有所有“正确”的理由做错事,并保持你的砖墙完好无损。我正在努力帮助你摧毁它们。仔细考虑几天再回复。
关于database - 主键、UUID、RecordKey 表,天哪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4282519/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!