2

私はSQLServerCompactを使用しており、MVCアプリを構築しています。

データを取得すると、多くのテーブルに多くのリンクが作成されます。これは、データを取得してデータが読み込まれるたびにリンクを作成するため、最終的には複雑なループと長い読み込み時間に発展する可能性があります。

したがって、最適化は良い考えであり、そのための1つの方法は、データをロードする前にデータが変更されているかどうかを確認することであると考えました。それがtrueの場合は、合計読み込みを実行します。そうでない場合は、代わりに実際に存在するデータ構造を参照します。

データベースのテーブルでデータが変更されたかどうかを確認する方法はありますか?方法、おそらく?

ありがとうございました!

4

2 に答える 2

2

Spyro がここの回答で述べているように:

簡単な方法は、トリガーを使用して、タイプ TIMESTAMP の null 許容列を追加することです。

更新中 CURRENT_TIMESTAMP。

したがって、列は null を受け入れるため、挿入は変更されません。次のように言って、新しい列と変更された列のみを選択できます。

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);
于 2013-03-04T19:23:47.910 に答える
0

私がオフライン ソリューションを構築していたとき、人々がオフラインでデータを変更し、夜間にそれを同期することができたときに、構成データについてその決定を行うための最良の方法を見つけました (を扱う) はtimestamp、すべての行に a を保持することでした。これが非常にうまく機能した理由は、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
于 2013-03-04T19:27:55.557 に答える