1

誰かが何かのテンプレートを投稿できるデータベーススキーマを設計するためのベストプラクティスを探しています (たとえば、特定の「スケジュール」がどのように見えるか)。その後、ユーザーはそのテンプレートに「参加」できますが、当然のことながら、それから何かを変更できます。元のテンプレートを変更します。

テキスト形式で何かを説明するのが得意ではないので、例を追加します。(そして英語は私の母国語ではありません)

4 つのテーブルがあるとします。

  • スケジュール
  • 仕事
  • タスクルール

スケジュールは N 日、1 日は N 個のタスク、そして最終的にタスクは N 個の taskRules を持つことができます。ユーザーは、結合テーブル (ユーザー ID と schedule_id を持つ user_schedule) を介してこのスケジュールに「参加」します。

ここでの問題は、ユーザーがテンプレートから何かを変更すると (たとえば、いくつかのタスク ルールを追加したり、タスクを削除したりすると)、それに接続されているすべての人のスケジュールが変更されることです。

私の質問は、これを処理するためのベストプラクティスは何ですか? 行の複製以外にこれを行う方法が本当にわかりません。これは私の好きなことではありません。

編集: このスキーマは、彼がテンプレート スケジュールに参加し、2 つのうちの 1 つを選択することを意味します (つまり、変更するか変更しないか、変更しない場合、複製は明らかに冗長です)。

4

2 に答える 2

1

さまざまなオプションがあります。

  1. すべてのデータをコピーします。これは簡単に実行できますが、大量のデータが複製され、特に変更が例外である場合に問題になる可能性があります。

  2. バリエーションは、通常、実際に変更が加えられたときに、テンプレートにリンクしてコピーするだけです。これにより、コードが複雑になりますが、大量のデータを節約できます。また、これは各テーブルに個別に適用される場合があります。

  3. データ + 変更をリンクする: 質問で提案されているスケジュールへの参照のみがあり、特定のユーザーによって行われたすべての変更を追跡します。基本的にSparkが説明するとおりです。ただし、削除や変更も処理する必要があるかもしれないというわけではありません。これは処理がより複雑ですが、「結合」が発生した後のスケジュールへの変更を処理することさえあります。

于 2012-08-22T13:08:08.443 に答える
1

私の提案は:

  • タスクの名前を task_template に変更します。
  • template_id、user_id、および task_template の他のすべてのフィールドを含む task という名前のテーブルを作成します。
  • データを追加するときは、新しいテーブルに違いを挿入するだけです。
  • データをロードするときは、template_id を読み取り、行の空でないものでオーバーライドします。

ここでの主な問題は、SQL データベースで継承/拡張/プロトタイピングを達成しようとしているということです...

于 2012-08-22T12:39:43.670 に答える