次の表を想像してください。
Person
- id
- name
Place
- id
- name
Coverage
- id
- from_person_id
- to_person_id
- new
- old
- start_date
- end_date
- closed
CoveragePlaces
- id
- coverage_id
- place_id
アプリケーションの規則では、別の「人物」の「カバーしている人物」は、カバレッジ テーブルに 1 つのレコードを持つと規定されています。カバレッジ テーブルには、"カバーしている" 人物への参照である "from_person_id" が含まれています。「取材を受けている」別の「人」を表す「to_person_id」。「人」は、「開始日」から「終了日」まで、「古い」または「新しい」または「すべての」ジョブの特定の「場所」で別の人をカバーできます。1 人の「人」が同一の場所、日付、および仕事の状態 (新旧のすべて) をカバーすることはできません。
現在、私たちのデータは上記と非常によく似た形で保存されています。現在別の人に補償を提供している人を見つけるために選択する場合。私たちはこのようなことをします。
SELECT
coverage.to_user_id AS user_id
FROM
coverage
INNER JOIN
coverage_places
ON ( coverage.id = coverage_places.coverage_id AND coverage_places.place_id = 10 )
WHERE
coverage.from_user_id = 150 AND
coverage.new = 1
アプリケーションの規則では、同一のカバレッジの 2 つのレコードを持つことはできません。アプリケーションの現在の状態では、レコードを挿入できますが、出力されると既存のレコードが上書きされます。
この機能を変更し、どのカバレッジが既存のカバレッジに置き換えられるかをユーザーに表示します。新しいカバレッジは複数の行を上書きする可能性があるためです。
たとえば、place1、place2、および place3 で、今月全体の新しいジョブのPerson A
カバレッジを提供している場合です。Person B
Person A
またPerson C
、place1 と place2 のすべての (新しい/古い) ジョブを 1 か月間カバーしています。
次に、place1 では 1 か月間、place2 では高齢患者のみをカバーPerson C
することを決定します。Person D
Person A
ここで、アプリケーションは を検出する必要がありますが、場所と場所 2 の年配の患者のみを対象としていますPerson A
。Person C
上記で説明したカバレッジのレコード (persond のレコードを入力する前) は次のとおりです。
coverage_places
coverage_id place_id
1 1
1 2
1 3
2 1
2 2
coverage
id from_user_id to_user_id
1 1 2
2 1 3
places
id name
1 place1
2 place2
3 place3
person
id name
1 persona
2 personb
3 personc
4 persond
ここで、アプリケーションは、置き換えるレコードを表示する必要があります。ユーザーがこのカバレッジをオーバーライドすることを確認した場合、アプリケーションは古いカバレッジを変更または削除して、新しいカバレッジを挿入する必要があります。
また、来週の以前の仕事のためにプレース 1 でカバーしPerson A
たいと決めているかどうかも検討してください。Person E
現在、上記の作業と非常によく似たモデルがあり、プログラミング側で多くのロジックが実行され、重複するカバレッジを見つけ、重複するレコードだけでなく、重複するレコードの一部を表示します。コードは非常に複雑になりました。私は一歩下がって物事を見て、よりシンプルで効率的なアプローチがあるかどうかを確認することにしました.
また、将来的には、アプリケーションがカバレッジのために動的フィールドをサポートすることを望んでいることにも注意してください。だから私は新しいフィールド「仕事の給料」を作成し、別の人に特定の給料をカバーさせることができます。
アイデアや提案は大歓迎です。