[英]Is there a way to store database modifications with a versioning feature (for eventual versions comparaison)?
我正在开发一个项目,用户可以将 Excel 文件上传到 MySQL 数据库中。 这些文件是我们数据的主要来源,因为它们直接来自与公司合作的承包商。 它们包含大量行(每个文件平均 23000)和每行 100 列!
我目前面临的问题是某人(承包商或公司)可能会更改相同的文件,并且在重新上传时,我的系统应该检测更改,更新实际数据并保存操作(事实是单元格从一个值变为另一个值 :: oldValue -> newValue),因此我们可以返回并运行版本比较(例如 3 次重新上传 === 3 个版本)。 (oldValue Version1 VS newValue Version5)
我开发了一个用于保存更改的小机制 => 我有一个表来保存导入数据(每次用户导入文件时,都会在此表中插入一个新行)和另一个用于保存实际更改的表
我保存了有一些变化的行的id,以及id和实际数据被修改的表(上传文件会导致插入多个表,所以每当发生变化时,我需要知道在哪个发生的表)。 我还保存了新值和旧值,这将帮助我恢复“档案数据”。
现在有了这个结构,我正在努力恢复一个版本或在两个版本之间运行比较,这让人觉得我想出了一个错误的方法,因为它很难完成这项工作! 我想知道之前是否有人这样做过,或者一个好的方法会是什么样子?
事情变得非常混乱的情况:
我的实际方法(php)
<?php
//Join records sets and Compare them
foreach ($firstRecord as $frecord) {
//Retrieve first record fields that have changed
$fFields = $frecord->fieldName;
//Check if the same record have changed in the second version as well
$sId = array_search($frecord->idRecord, $secondRecord);
if($sId) {
$srecord = $secondRecord[$sId];
//Retrieve straversee fields that have changed
$sFields = $srecord->fieldName;
//Compare the two records fields
foreach ($fFields as $fField) {
$sfId = array_search($fField, $sFields);
//The same field for the same record was changed in both version (perfect case)
if($sfId) {
$sField = $sFields[$sfId];
$deltaRow[$fField]["oldValue"] = $frecord->deltaValue;
$deltaRow[$fField]["newValue"] = $srecord->deltaValue;
//Delete the checked field from the second version traversee to avoid re-checking
unset($sField[$sfId]);
}
//The changed field in V1 was not found in V2 -> Lookup for a value
else {
$deltaRow[$fField]["oldValue"] = $frecord->deltaValue;
$deltaRow[$fField]["newValue"] = $this->valueLookUp();
}
}
$dataArray[] = $deltaRow;
//Delete the checked record from the second version set to avoid re-checking
unset($secondRecord[$srecord]);
}
我不知道如何处理这个问题,正如我所说,我正在研究一个值查找算法,所以当在一个版本中找不到数据时,我会尝试在这两个版本之间找到它,这样我就可以构建我的数据数组。 如果有人能提供一些提示、想法和改进,我会很高兴,这样我就可以继续前进。
谢谢!
有没有办法使用版本控制功能存储数据库修改(对于最终版本比较 [原文如此!])?
什么构成版本控制取决于数据库本身以及您如何使用它。
至于关系数据库而言(如MariaDB的),这归结为所谓的范式这是在数字。
关于数据库规范化:第五范式及以上,您可以找到以下指南:
超越第 5 范式,您将进入领域密钥范式的令人兴奋的领域,这是一种理论理想。 它对数据库设计者 os [原文如此!] 的实际用途类似于对簿记员的无穷大——即它在理论上存在,但不会在实践中使用。 即使是最苛刻的所有者也不会期望簿记员!
进入这些领域的一种策略是首先达到第 5 范式(理论上这样做,通过所有范式,并研究数据库规范化)。
此外,您可以在数据库本身之外解释版本控制,例如通过创建自己的版本控制系统。 阅读规范化可以做什么将帮助您找到更好的方法来决定如何构建和处理数据库数据以满足您的版本控制需求。
但是,正如所写的那样,这取决于您想要和需要什么。 因此,对于这样一个普遍的问题,无法给出直接的“代码”答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.