2017-07-27 51 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