最近、私はMySQLデータベースに履歴データを保存するベストプラクティスについて考えています。現時点では、各バージョン対応テーブルには、valid_from
とvalid_to
の2つのカラムがあり、いずれもDATETIME
タイプです。現在のデータを含むレコードの作成日はvalid_from
です。この行を更新すると、valid_to
に更新日が入力され、valid_from
という新しいレコードが前の行のvalid_to
と同じものになります。しかし、テーブルが非常に速くてデータを取得するのが非常に遅くなることがわかっています。
履歴データを保存する習慣があるかどうかを知りたいですか?MySQLデータベースの履歴データのベストプラクティス
答えて
"大きな"テーブルとパフォーマンスについて心配するのはよくある間違いです。インデックスを使用してデータにアクセスすることができれば、1000000レコードのうち1000レコードがあるかどうかは重要ではありません。少なくとも、測定できるようにはなりません。あなたが言及しているデザインは一般に使用されています。時間がビジネスロジックの重要な部分であるのは素晴らしいデザインです。
たとえば、顧客が注文した時点での商品の価格を知りたい場合、valid_from < order_dateとvalid_untilがnullまたはorder_dateのいずれかである商品レコードを検索することができる最も簡単なソリューションです。
これは必ずしもそうではありません。アーカイブの目的のためだけにデータを保持する場合は、アーカイブテーブルを作成する方が理にかなっています。しかし、が実際にというビジネスロジックの一部ではないことを確認する必要があります。そうでなければ、複数のテーブルを検索することの苦労が大きくなります。製品テーブルまたはproduct_archiveテーブルを検索する度に注文が発注された時点での製品の価格について。
これは完全な答えではなく、ほんの少しの提案です。
is_valid
のようなインデックス付きブール型フィールドを追加できます。これにより、過去のレコードと現在のレコードを含む大きなテーブルのパフォーマンスが向上します。
一般的には、履歴データをseprateテーブルに格納するとアプリケーションが複雑になることがあります(現在の履歴レコードと履歴レコードが混在したデータを取得すると思われる複雑なクエリを想像してください)。
今日のコンピュータは本当に高速です。私はあなたが単一のテーブルと過去のレコードのための別のテーブルとのパフォーマンスを比較/テストする必要があると思います。
さらに、データベースを設計する方法を決定するために、大きなテーブルを持つMySQLがどれだけ高速であるかを確認するためにハードウェアをテストしてみてください。 MySQLの設定を調整することができます(キャッシュ/ RAMの増加から始まります)。
私はまさにこれを行うアプリケーションの完了に近づいています。私のインデックスのほとんどは、キーフィールドで最初にインデックスを作成し、現在のレコードに対してNULL
に設定されているvalid_to
フィールドを使用することで、現在のレコードを簡単かつ即座に見つけることができます。私のアプリケーションのほとんどはリアルタイム操作を扱うので、インデックスは高速なパフォーマンスを提供します。一度は誰かが履歴レコードを見る必要があり、その場合はパフォーマンスヒットがありますが、テストではそれほど悪くはありません。なぜなら、ほとんどのレコードは生涯にわたって多くの変更がないからです。
現在のレコードよりも多くの有効期限が切れているレコードがある場合は、より前のインデックスに支払うことがあります。キーフィールドの前に。
- 1. データ履歴のトラッキングのベストプラクティス
- 2. MongoDB履歴データストレージ - ベストプラクティス?
- 3. データベースの履歴
- 4. (履歴)ASP.NET MVCの国際化のベストプラクティス
- 5. 「オブジェクト履歴」のPython継承のベストプラクティス
- 6. リポジトリ間の履歴履歴
- 7. MySQLデータベースの変更履歴(作成方法)
- 8. Mysqlの更新/挿入:履歴データのコピー
- 9. アンドロイドのクロムの履歴履歴
- 10. 店舗データベースの履歴データを維持する
- 11. GWT履歴:履歴トークン
- 12. データベース内の履歴を維持する
- 13. エンティティフレームワークを使用したデータベースの履歴
- 14. Rails 3ユーザーの活動履歴データ
- 15. 弾性検索履歴データの処理
- 16. Backbone.jsウェブアプリケーションの状態、履歴、データ管理
- 17. デッドロックの履歴
- 18. IEの履歴
- 19. トリガーベースの履歴
- 20. DBにユーザの履歴を格納するベストプラクティス
- 21. ユーザーアクション履歴のベストプラクティスとは何ですか?
- 22. PHP MySQLログイン履歴を保存する
- 23. 共有設定とクリア履歴/データ
- 24. スカッシュgitの履歴
- 25. javascriptのブラウザ履歴
- 26. リモート履歴のログ
- 27. Android SMSの履歴
- 28. Androidのダウンロード履歴
- 29. クリップボード履歴のEclipse
- 30. jqueryの履歴プラグイン
アーカイブを実行します。つまり、履歴データを別のテーブルに移動し、現在のテーブルを最新の状態に保ちます。 –
@PradeepPatiこれは、履歴データと現在のデータの両方を選択できるクエリが必要な場合、アプリケーションを非常に複雑にします。しかし、彼は履歴テーブルと現在のテーブルを「マージ」するためにいくつかのビューを作成することができます。 – Kamil
@カミルそれは本当に何かを複雑にしないで、むしろアプリを正常に保つ。あなたは履歴が必要です、あなたは履歴テーブルに行きます、現在のデータが必要です、現在のテーブルに移動します。 –