2017-07-27 53 views
0

跟踪数据库的变化必须成为很多人的一个大问题,但似乎这些大公司都有软件。跟踪数据库更改或使用时间戳区分记录?

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

教师联系信息的典型行将有fName,lName,schoolName,[address & phone info];为曲目或试听信息:年,乐器,作品,作曲家,出版商/版本。

其他人提出关于跟踪数据库的变化,但只有一个最近的,而不是用了很多票/详细信息: How to track data changes in a database table Keeping history of data revisions - best practice? How to track data changes in a database table

这个轻量级的解决方案似乎是有前途的,但我不知道是否它没有得到票,因为它没有帮助,或者因为人们不感兴趣。 How to keep track of changes to data in a table?

更多的背景如果需要的话: 我是一个音乐老师(即业余程序员)保持一个Joomla网站,我们的组织。我使用名为Sourcerer的Joomla插件来创建动态内容(Joomla数据库中的PHP/SQL),以便更易于沟通变化(日期,人员,规则,剧目等)。多年来,这是通过静态页面完成的(和纸手册)需要几天更新。

然而,我也希望能够回头看看特定时间的数据库状态:谁在什么地方教过什么样的试音片等等,就像纸质版本一样。注意:我没有跟踪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); 

回答

0

回答您的问题依次是:

有没有缺点?

当然,它和性能有关。如果你每年增加一百万条记录,这将伤害表演;并占用磁盘空间。

哪里的链接问题的建议不好还是不流行?

的问题和答案都不错;但正确的答案取决于您的具体用例:您是否出于法律原因进行此操作,您希望能够访问数据的速度有多快,您拥有多少数据和更新,您希望您的历史记录功能能够在没有变化的情况下持续多久......只有当它符合你的用例时,你才会投票。

作为一个经验法则,历史应该去一个不同的表,这将提供几个优点:

  • 当前的表不发生变化,所以你的代码需要除了存储当前的版本没有变化也在历史上;
  • 你的应用程序不会放慢速度;
  • 如果你的历史表增长,你可以轻松地将它们移动到不同的服务器;

为了选择是否有一个历史表或多个(每个备份表)取决于你打算如何检索数据,你想用它做什么:

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

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

请记住,如果无法正确检索数据,则数据无用。


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

,应寻求基于该数据的其他用途的最佳解决方案:为它是有用的人,你必须执行一个系统来检索历史数据。如果phpmyadmin足够了,那么再看一下。


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

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

+0

感谢彻底的回答@Riccardo Zorn:尤其是平衡性能和设置工作的清晰度。每年<200条记录,我的想法是将时间戳/记录ID添加到我的馈线表(人员,角色,学校等)进行跟踪,并将交汇表作为信息输出。我可以添加WHERE = <日期查询(如果需要,在phpMA中)来检索历史数据。在这里存储标记(好建议)实际上并不容易,因为数据在多个页面上传播 - 我正在编码的一个原因! – jchleb