2012-04-04 8 views
0

データベースから多数のオブジェクトをロードしているとします。これらは通常の、普通のPHPオブジェクトであり、想像以上のものからの継承はありません。これらのオブジェクトのいくつかを変更し、それらをデータベースに書き戻したいと思うが、UPDATE ... SET ...クエリで実際に異なるフィールドのみを使用するとします。また、どのオブジェクトが変更されるのか事前にわからないとします。オブジェクトのキャッシュ - クローンオブジェクトやシリアル化されたデータを格納する方が効率的ですか?

私は、すべてのオブジェクトのコピーを作成し、オブジェクトをデータベースに書き戻す必要がある場合は参照と比較のために保管しておく必要があると考えています。

  • は、私はどちらかが別のリスト内のすべてのロードされたオブジェクトや店舗のクローンを作成することができます

    は、私は2つの可能なアプローチを参照してください。保存するときは、インデックスを使用してリスト内のオブジェクトをルックアップし、値を比較します。
  • または、文字列にロードされたすべてをシリアライズして、そのまま使用することができます。保存するときに、文字列内のシリアル化されたオブジェクトを見つけて(何らかの形で)、シリアル化して値を比較してください。

効率性(主にメモリですが、速度も考慮されます)はどれが好ましいでしょうか?

+0

オブジェクトのフィールド数はわかりませんが、1または2だけが変更されているかどうかにかかわらず、オブジェクトのすべてのフィールドを更新するには何も問題ありません。この方法で元のコピーを保持する必要はありません。もちろん、テーブルが巨大で、インデックスやその他の参照テーブルを持っていない限り、20フィールドの更新は2フィールドの更新よりもはるかに遅くはありません。 –

+0

@AleksG:20フィールド、50 000オブジェクト(推測される多数)=更新するフィールドは1 000 000です。 – hakre

+0

@hakreの数の更新では、OPは更新が行われる前にすべてのインデックスを無効にする方が良いでしょう。 –

答えて

0

実際には、オブジェクトの状態が変更されているかどうかを比較するには、何かが必要です。どのオブジェクトが変更されたのかだけでなく、どのメンバーも追跡する必要がある場合でも、メンバーごとに状態を持つ必要があります。

元のオブジェクトを拡張したくない場合(変更されたときに無効にするフラグなど)、外部から状態を追跡する必要があります。私はおそらくシリアル化は、おそらく最高の選択肢だと思います。クローニングにはより多くのメモリが必要です。

+0

トラッキングの状態は意味があります。私はおそらく、各フィールドのcrc-32を単純に計算して格納するオブジェクトに、ある種の「合理的に隠されたフィールド」を注入することができます... crc-32が十分に安全かどうかはわかりません。 – mgefvert

+0

ハッシュは安全ではありません。特にCRC-32は安全ではありません。オブジェクトを変更することを検討した場合、各セッターは、オブジェクトが変更(変更)された場合に状態を設定することができます。それは簡単です。 – hakre

関連する問題