跟踪数据库更改或使用时间戳区分记录?

杰赫莱布

跟踪数据库的变化对很多人来说肯定是一个大问题,但似乎大牌有软件。

我的问题是对于一个有 10 个表,每个 <10 列的小型 SQL 数据库,使用连接创建一个“主”连接表:通过添加行(有很多重复信息)每年更新几次是否有缺点然后使用 MAX id (PK) 以表格形式(摘自“master”)生成并在网站上发布最新数据?与更新记录相比,我将在特定时刻丢失有关值的信息。

教师联系信息的典型行有 fName、lName、schoolName、[地址和电话信息];曲目或试听信息:年份、乐器、作品、作曲家、出版商/版本。

其他人询问了跟踪数据库更改,但最近只有一个,并且没有很多投票/详细信息:如何跟踪数据库表中的数据更改 保留数据修订的历史记录 - 最佳实践? 如何跟踪数据库表中的数据更改

这个轻量级的解决方案看起来很有希望,但我不知道它没有得到投票是因为它没有帮助,还是因为人们不感兴趣。如何跟踪表中数据的更改?

如果需要更多背景知识:我是一名音乐老师(即业余程序员),为我们的组织维护一个 Joomla 网站。我正在使用一个名为 Sourcerer 的 Joomla 插件来创建动态内容(PHP/SQL 到 Joomla 数据库),以便更轻松地传达更改(日期、人员、规则、曲目等)。多年来,这是通过静态页面完成的(和纸质手册)需要几天时间才能更新。

但是,我也希望能够回顾并查看特定时间的数据库状态:谁教在哪里,列出了哪些试听作品等,就像我们可以使用纸质版本一样。注意:我不跟踪 HTML 更改,只跟踪从数据库提供的信息。

谢谢你的帮助!(我已经关注 SO 多年,但这是我的第一个问题。)

我现在用来生成“主连接表”的代码。对于我的新行,我会将其修改为“插入”,并通过 Sourcerer 从中查询以在线发布信息。

CREATE TABLE 011people_to_schools_junction 
AS (
   SELECT * 
   FROM (
       SELECT a.peopleID, a.districtID, a.firstName, a.lastName, a.statusID, c.schoolName 
       FROM 01People a 
       INNER JOIN ( 
           SELECT districtID, MAX(peopleID) peopleID 
           FROM 01People 
           GROUP BY districtID 
            ) b 
       ON a.districtID = b.districtID 
       AND a.peopleID = b.peopleID 

       INNER JOIN (
           SELECT schoolID, MAX(peopleID) peopleID
           FROM 01people_to_schools_junction ab
           GROUP BY schoolID
           ) z
        ON z.peopleID = a.peopleID 

        LEFT JOIN 01Schools c 
        ON c.schoolID = z.schoolID 
        WHERE z.schoolID IS NOT NULL
        OR z.peopleID IS NOT NULL
        ORDER BY c.schoolName
    ) t1 
);

#Add a primary key as the first column
ALTER TABLE 011people_to_schools_junction
ADD COLUMN 011people_to_schoolsID INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (011people_to_schoolsID);
里卡多·佐恩

要按顺序回答您的问题:

有什么缺点吗?

当然,这与性能有关。如果每年增加一百万条记录,会影响性能;并占用磁盘空间。

链接问题中的建议在哪里不好或不受欢迎?

问题和答案都很好;但正确的答案取决于您的具体用例:您是否出于法律原因这样做,您希望能够以多快的速度访问数据,您拥有多少数据和更新,您希望历史功能在没有更改的情况下持续多少...只有当它满足您的用例时,您才会投票。

根据经验,历史记录应该放在不同的表中,这将提供以下几个优点:

  • 您当前的表不会更改,因此您的代码无需更改,除了将当前版本也存储在历史记录中;
  • 您的应用程序不会变慢;
  • 如果您的历史表增长,您可以轻松地将它们移动到不同的服务器;

为了选择是有一个历史表还是多个(每个备份表一个)取决于您计划如何检索数据以及您想用它做什么:

  • 如果您镜像每个表并添加时间戳和用户 ID,则您的代码几乎不需要修改;但是你最终会得到两倍的表,并且任何结构更改都需要在历史表上复制;

  • 如果您构建一个带有时间戳、用户 ID、表名和记录的 json 表示的单个历史表,您将更轻松地构建它,而为了检索它,您应该使用每行一个对象访问数据,即使用 Joomla 的 dbo getObjectList(),那么对象将与您存储在历史表中的格式相同,并且那里的更改将相当容易。但是跨特定表/字段查询更改会困难得多。

请记住,如果您无法正确检索数据,那么拥有数据将毫无用处。


既然你提到每年推送几次网站,查询的开销应该不是问题(如果你每月更新,等待 5 分钟可能不是问题)。

您应该根据这些数据的其他用途寻求最佳解决方案:为了对任何人有用,您必须实施一个系统来检索历史数据。如果 phpmyadmin 就足够了,那就不用再看了。


我希望这吓到你了。无论哪种方式,这都是一项艰巨的工作。

如果您只是希望能够查找旧数据,则可以改为存储不时生成的标记/输出的副本,并将其保存到网络服务器上的不同文件夹中。这将需要几分钟的时间来设置,并且非常可靠。
当然,编写代码更有趣。但你真的确定你需要它吗?您可以保留数据库转储,以防有一天您改变主意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用时间戳计算用户的数据库行数-最佳方法?

来自分类Dev

使用时间戳功能将特定日期和时间保存到 Firestore 数据库 - Swift 4

来自分类Dev

在保存之前或保存到数据库时使用时间戳是否有意义

来自分类Dev

如何使用时间戳从mysql中选择数据

来自分类Dev

GQL查询(python)使用时间戳检索数据

来自分类Dev

如何使用时间戳类型数据制作程序

来自分类Dev

使用时间戳过滤Gmail

来自分类Dev

在Excel中使用时间戳

来自分类Dev

在PHP中使用时间戳

来自分类Dev

数据库Hsqldb无法区分日期和时间戳

来自分类Dev

sql-使用时间戳计数每星期的记录

来自分类Dev

使用时间戳列表记录和重放输入

来自分类Dev

使用时间戳和日期时间的TSQL排名

来自分类Dev

使用时间戳计算员工的工作时间

来自分类Dev

在MySQL中使用时间戳存储大量数据的最佳方法

来自分类Dev

如何使用时间戳列获取过去X天的数据?

来自分类Dev

在MySQL中使用时间戳存储大量数据的最佳方法

来自分类Dev

使用时间戳进行范围查询的 Cassandra 数据建模

来自分类Dev

如何在 Python 中使用时间戳索引插入数据?

来自分类Dev

如何在android中跟踪应用使用时间?

来自分类Dev

如何使用时间戳构造函数

来自分类Dev

如何在Ping中使用时间戳选项

来自分类Dev

PostGIS使用时间戳检测交叉

来自分类Dev

MYSQL查询使用时间戳调用最新值

来自分类Dev

在CQL中使用时间戳作为列名

来自分类Dev

如何在规格rpm中使用时间戳?

来自分类Dev

如何在Ping中使用时间戳选项

来自分类Dev

Python(if,elif,else)使用时间戳

来自分类Dev

Django使用时间戳增量查询对象

Related 相关文章

热门标签

归档