1

次の表を想像してください。

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 DPerson A

ここで、アプリケーションは を検出する必要がありますが、場所と場所 2 の年配の患者のみを対象としていますPerson APerson 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

現在、上記の作業と非常によく似たモデルがあり、プログラミング側で多くのロジックが実行され、重複するカバレッジを見つけ、重複するレコードだけでなく、重複するレコードの一部を表示します。コードは非常に複雑になりました。私は一歩下がって物事を見て、よりシンプルで効率的なアプローチがあるかどうかを確認することにしました.

また、将来的には、アプリケーションがカバレッジのために動的フィールドをサポートすることを望んでいることにも注意してください。だから私は新しいフィールド「仕事の給料」を作成し、別の人に特定の給料をカバーさせることができます。

アイデアや提案は大歓迎です。

4

1 に答える 1

1

提供された実際のカバーは、場所と職種の組み合わせ用であるように思われるため、それを反映するようにモデルを再設計することを検討します. 私はこのようなものを提案します

Person
  - id
  - name

Place
  - id
  - name

Coverage
  - id
  - from_person_id
  - to_person_id
  - coverage_type
  - place_id
  - start_date
  - end_date
  - closed

そうすれば、タイプ/場所の組み合わせごとに一意のレコードが作成され、カバーの一部を別のカバーに置き換えるのがはるかに簡単になります.

これは、アプリが表示目的でこれらをグループ化する作業を行う必要があることを意味します (つまり、ある人がすべての場所のすべての仕事を別の人にカバーしています)。少しカバーを代用します。

于 2012-04-08T09:45:26.170 に答える