我正在使用 Sql Server Compact 并正在构建一个 MVC 应用程序。
在获取我的数据时,许多表都建立了许多链接,最终会演变成复杂的循环和较长的加载时间,因为每次加载数据时都要获取数据并建立链接。
所以我认为优化是一个好主意,一种方法是在加载任何数据之前检查数据是否发生了变化。如果为真,则进行总加载,否则参考实际存在的数据结构。
有没有办法检查我的数据库表中的数据是否发生了变化?一个方法,也许?
谢谢!
我正在使用 Sql Server Compact 并正在构建一个 MVC 应用程序。
在获取我的数据时,许多表都建立了许多链接,最终会演变成复杂的循环和较长的加载时间,因为每次加载数据时都要获取数据并建立链接。
所以我认为优化是一个好主意,一种方法是在加载任何数据之前检查数据是否发生了变化。如果为真,则进行总加载,否则参考实际存在的数据结构。
有没有办法检查我的数据库表中的数据是否发生了变化?一个方法,也许?
谢谢!
正如斯派罗在他们的回答中所说:
简单的方法是使用触发器添加一个 TIMESTAMP 类型的可为空列:
ON UPDATE CURRENT_TIMESTAMP。
因此,插入不会更改,因为该列接受空值,您可以通过以下方式仅选择新的和更改的列:
SELECT * FROM `table` WHERE `mdate` > '2011-12-21 12:31:22'
每次更新一行时,此列都会自动更改。
以下是更多信息: http ://dev.mysql.com/doc/refman/5.0/en/timestamp.html
要查看已删除的行,只需创建一个触发器,它将每次删除记录到另一个表:
DELIMITER $$ CREATE TRIGGER MyTable_Trigger AFTER DELETE ON MyTable FOR EACH ROW BEGIN INSERT INTO MyTable_Deleted VALUES(OLD.id, NOW()); END$$
或者,您可以对所有表结果执行哈希函数(MD5,SHA1)并将其保存,就像表MD5(table);
的值已MD5(table);
更改一样!
// Serialize the table
DataContractSerializer serializer = new DataContractSerializer(typeof(DataTable));
MemoryStream memoryStream = new MemoryStream();
XmlWriter writer = XmlDictionaryWriter.CreateBinaryWriter(memoryStream);
serializer.WriteObject(memoryStream, table);
byte[] serializedData = memoryStream.ToArray();
// Calculte the serialized data's hash value
SHA1CryptoServiceProvider SHA = new SHA1CryptoServiceProvider();
byte[] hash = SHA.ComputeHash(serializedData);
// Convert the hash to a base 64 string
string hashAsText = Convert.ToBase64String(hash);
你知道,当我构建一个离线解决方案时,人们可以离线更改数据,然后在晚上同步备份,我找到了确定我们的配置数据的最佳方法(很像你处理)是timestamp
在每一行举行。之所以如此有效,是因为我可以构建一个表,该表timestamp
基于对每个表的简单 MAX 查询来索引这些值。所以该表可能如下所示:
CREATE TABLE TimestampIndex (
TableName SYSNAME PRIMARY KEY,
LastChange TIMESTAMP
)
然后我可以运行基本查询并在它们离线时填充该表:
IF EXISTS (SELECT TableName FROM TimestampIndex WHERE TableName = 'Table1')
UPDATE TimestampIndex SET LastChange = (SELECT MAX(ts) FROM Table1)
ELSE
INSERT INTO TimestampIndex (TableName, LastChange) SELECT 'Table1', MAX(ts) FROM Table1
然后当他们重新上线时,我可以简单地执行以下操作:
IF NOT EXISTS (SELECT TableName FROM TimestampIndex WHERE TableName = 'Table1' AND LastChange = (SELECT MAX(ts) FROM RemoteDb.dbo.Table1))
BEGIN
-- there must be changes to make then
END