私はまもなく、(仕様から)StackOverflowを少し思い出させるプロジェクトの作業を開始します。基本的に、ユーザーが制御するコンテンツを持つWebアプリです。
私が頭の中で輪になって回っている機能の1つは、バージョン管理です。ここStackOverflowでは、各質問と回答に複数のリビジョンを含めることができます。これは、オブジェクトのタイプ(この場合はそのテキスト)が1つしかない場合に実装するのは非常に簡単です。
だから、私の単純なページについては、私は設定されています。
問題は、バージョン管理下にある必要のあるいくつかのオブジェクトに関係があると考えるときに発生します。具体的な例を示すために、ランダムな類似ドメインを選択します。
本/著者情報を追跡するためにWikiのようなサイトを実装していたとしましょう。このサイトの主な焦点は、「作成者」ページを作成および更新することです。これは、テキストとしては非常に単純です(上記のとおり)。ただし、著者と本の間に1対多の関連付けを追加しましょう(つまり、人が多くの本を作成できることは明らかであるため、本は別個のオブジェクトになります)。各本には、著者ページからその本に関する情報ページへのリンクがあります。
ユーザーにとって、著者を説明するテキストベースの「要約」と、その著者と彼らの作品との間のリンクとの間にほとんど違いはありません。したがって、著者ページ、書籍ページ、および著者と書籍の関連付けに「改訂」/編集機能を実装する必要があります。つまり、ユーザーは、著者ページ、書籍ページ、および2つの間の関連付けを編集、履歴の表示、およびロールバックできる必要があります。
その関係が多対多になると、これはさらに複雑になり、複数の著者が本に寄稿したとリストされる可能性があります。
私はいくつかの解決策を考えていますが、どれも私が望むほどきれいではありません(そして少なくともいくつかの繰り返しのコード/冗長データストレージを含みます)、そして私はここの至る所で共通点を見ますが、私は感じます特にデータベースレベルでは、実際にそれを最適に抽出することはできませんでした。与えられた答えにバイアスをかけたくないので、すぐに答えるつもりはありません。
では、このシステムをデータベースレベルでどのように設計しますか?ここでテーブルの仕様を探しています。すぐにわからない場合は、テーブルの仕様とその使用方法の説明を探しています。関連する可能性のある回答については、ASP.NETと、Linq-to-SQL(LTSの多対多に慣れている)またはEntityFrameworkのいずれかを使用します。
編集:明確にするために、私は基本的なDB設計、正規化、多対多のマッピングテーブルなどを理解しています。私はこの特定の状況に対するクリーンなソリューションを探しています。
編集2:システムには単なる本よりもはるかに多くのサブオブジェクトがある可能性があるため、一般化可能なソリューションを探しています。作者は他の作者、雑誌、イベントなどと関係があるかもしれません。一人一人に歴史を実装していくと、たくさんの仕事を繰り返しているような気がします。