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

问题描述 投票:0回答:1

跟踪数据库的更改肯定是很多人关心的一个大问题,但似乎大牌厂商都有这方面的软件。

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

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

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

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

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

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

我现在用来生成“主连接表”的代码。我会将其修改为“INSERT into”以获取新行,并通过 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);
sql joomla change-tracking
1个回答
1
投票

按顺序回答您的问题:

有缺点吗?

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

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

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

根据经验,历史记录应该转到不同的表,这将提供几个优点:

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

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

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

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

请记住,如果无法正确检索数据,那么拥有数据也是没有用的。


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

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


我希望这吓到你了。无论哪种方式,这都是很多艰苦的工作。

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

© www.soinside.com 2019 - 2024. All rights reserved.