【问题标题】:Track database changes or differentiate records with timestamp?跟踪数据库更改或使用时间戳区分记录?
【发布时间】:2017-07-29 05:02:23
【问题描述】:

跟踪数据库的更改对于很多人来说一定是一个大问题,但似乎大牌有软件可以做到这一点。

我的问题是对于一个小型 SQL 数据库,它有 10 个表,每个 更新几次有缺点吗每年通过添加行(包含大量重复信息)然后使用 MAX id (PK) 以表格形式生成并在网站上发布最新数据(摘自“主”)?这相对于更新记录,我会在特定时刻丢失有关值的信息。

教师联系信息的典型行包括 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 插件来创建动态内容(PHP/SQL 到 Joomla 数据库),以便更轻松地传达更改(日期、人员、规则、曲目等)。多年来,这是通过静态页面完成的(和纸质手册)需要数天时间才能更新。

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

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

我现在用来生成“主联结表”的代码。对于我的新行,我会将其修改为“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】:

    按顺序回答您的问题:

    有缺点吗?

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

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

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

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

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

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

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

    • 1234563每行使用一个对象,即使用 Joomla 的 dbo getObjectList(),那么对象将与您存储在历史表中的格式相同,并且那里的更改将相当容易。但是查询跨特定表/字段的更改会更加困难。

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


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

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


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

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

    【讨论】:

    • 感谢@Riccardo Zorn 的彻底回答:尤其是平衡性能和设置工作的明确性。每年
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2019-06-05
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多