跟踪数据库的更改肯定是很多人关心的一个大问题,但似乎大牌厂商都有这方面的软件。
我的问题是对于一个有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);
按顺序回答您的问题:
有缺点吗?
当然,这与性能有关。如果每年添加一百万条记录,就会损害性能;并占用磁盘空间。
链接问题中的建议哪里不好或不受欢迎?
问题和答案都很好;但正确的答案取决于您的具体用例:您这样做是否出于法律原因、您希望能够以多快的速度访问数据、您拥有多少数据和更新、您希望历史记录功能在不发生更改的情况下持续多久...只有当它满足您的用例时您才会投票。
根据经验,历史记录应该转到不同的表,这将提供几个优点:
选择是使用单个历史表还是多个历史表(每个备份表一个)取决于您计划如何检索数据以及您想用它做什么:
如果您镜像每个表并添加时间戳和用户 ID,您的代码将需要很少的修改;但最终会得到两倍数量的表,并且任何结构更改都需要在历史表上复制;
如果您构建一个包含时间戳、用户 ID、表名称和记录的 json 表示形式的历史表,那么构建它会更容易,而要检索它,您应该使用每个对象访问数据row 即使用 Joomla 的 dbo getObjectList(),那么对象将与您存储在历史表中的格式相同,并且其中的更改将相当容易。但是跨特定表/字段查询更改会困难得多。
请记住,如果无法正确检索数据,那么拥有数据也是没有用的。
既然你提到每年推送几次网站,查询的开销应该不是问题(如果你每月更新,等待5分钟可能不是问题)。
您应该根据此数据的其他用途寻求最佳解决方案:为了使其对任何人都有用,您必须实现一个系统来检索历史数据。如果 phpmyadmin 就足够了,那就别再犹豫了。
我希望这吓到你了。无论哪种方式,这都是很多艰苦的工作。
如果您只是希望能够查找旧数据,您可以存储不时生成的标记/输出的副本,并将其保存到网络服务器上的不同文件夹中。这将需要几分钟的时间来设置,并且非常可靠。
当然,编写代码更有趣。但你真的确定你需要它吗?您可以保留数据库转储,以防有一天您改变主意。