私は人々が記事を作成/編集できる基本的なCRUDウェブアプリを持っています。私は今、すべての編集の改訂履歴を保持する機能を追加したいと考えています。私は改訂履歴のサポートを追加するために私の現在のスキーマを変更するための2つのオプションを検討しているRDBMSにリビジョン履歴を格納するための正規化または非正規化?
Article(id, title, content, author_id, category_id, format)
:現在、私はこのようになります記事のテーブルを持っています。基本的なアイデアは、ある記事のすべての単一編集が、リビジョンテーブルのレコードとして保存されることです。したがって、記事とリビジョンは一対一の関係です。
第1オプション(正規化): アーティクルメタデータの1つのテーブル、リビジョンの1つのテーブル。重複データは保存されません。
Article(id, title, category_id)
Revision(id, content, author_id, format)
第二オプション(デ正規化):オプション1のようないくつかの重複した列を持つ 2つのテーブル。
Article(id, title, content, author_id, category_id, format)
Revision(id, article_id, content, author_id, format)
2番目のオプションを使用すると、コーディングが非常に簡単になります(複雑さが少なく、コード行も少なくなります)。私はそれが "学問的"ではなく、 "純粋な"ものではないことを知っていますが、私の個人的な気持ちは、余分な結合をしなければならないということです。また、多くのジョインを実行する必要がないため、パフォーマンスが向上するはずです。
これは、このタスクを実行する健全な方法ですか?私が見落としている可能性のある予期しないまたは長期の結果
JNKが正しいです(ただし、SQLは結合用に最適化されていませんが、RDBMSは詳細です)。請求書発行アプリケーションでも同様の問題がありますが、「履歴」テーブルには、いくつかの追加フィールド(履歴PK、タイムスタンプなど)を含む請求書テーブルの正確なコピーがあります。 'INSERT INTO INISTORY SELECT NULL、NOW()、...、i。*インボイスからのメッセージ 'へ簡単に – Konerak