1

私はデータベース設計の問題を抱えています...

私のシステムには一連の「ミッション」があり、各ミッションは、1 人のハードバイトの個人または十分に油を注がれたクラック エキスパートのチームのいずれかに割り当てることができます。

システムの使い方を考えている...

  • 最も一般的なのは、システムに接続して、割り当てられているミッションを確認することです。
  • 次によくあるのは、誰かがチームまたは個人をミッションに割り当てることです。
  • そして第三に、もちろん、このコーディネーターが、誰がどこに割り当てられているかを確認したり、担当者の常套手段として、担当者をジャグリングしたりする可能性は常にあります。

私の最初の考えは、このような構造は単なるチケットになるということです:

オプション1

その場合、私の最も一般的なクエリは次のようになります。

declare @name nvarchar(1000)
set @name = ...

declare @myId int

-- find out my user id
set @myId = (select top 1 IndividualId from Individuals where Name = @name)

-- Now find all the missions where I am am member of a team that's been assigned
select a.Name
from Missions a
inner join IndividualsInTeams b on a.TeamId = b.TeamId
where a.TeamAssigned = 1 and b.IndividualId = @myId

-- And UNION that with all the missions where I have been solely assigned

union

select  Name
from Missions
where TeamAssigned = 0 and IndividualId = @myId

次のようなビュー( MissionsWithIndividuals と呼ばれる)を作成することで、これをスムーズにできると思います。

select  a.Name As 'MissionName', c.Name As 'IndividualName'
from Missions a
inner join IndividualsInTeams b on a.TeamId = b.TeamId
inner join Individuals c on b.IndividualId = c.IndividualId
where a.TeamAssigned = 1 

union

select a.Name As 'MissionName', b.Name As 'IndividualName'
from Missions a
inner join Individuals b on b.IndividualId = a.IndividualId
where TeamAssigned = 0 

そして、私の最も一般的なクエリは次のようになります。

select MissionName from MissionsWithIndividuals where IndividualName = @name

しかし、それは一種の危険な感じです。

つまり、最も一般的なクエリを処理するために、データベースに一連のフープを通過させる必要があるのではないでしょうか。最も一般的なクエリがより自然になるようにデータが構造化されていれば、もっとよいのではないでしょうか?

また、ミッションが個人とチームに割り当てられている可能性がありますが、それは実際には許可されていません (1 人以上の場合は、割り当てられたチーム内にある必要があります)。

代わりにこれで行くことができます:

オプション 2

しかし、これは私の最も一般的なクエリを簡単にしますが、TeamOrIndividualName の多目的な性質とそれに制約を加えることができないという事実のために、少し恐ろしく感じます。

では、この場合、データを構造化する最良の方法は何でしょうか?

私が考慮していない別の可能性はありますか?

4

1 に答える 1

3

Gilbert Le Blanc が提案したように、ここでの解決策は、たとえチームに 1 人しかいない場合でも、ミッションをチームにリンクすることだと思います。これにより、誰かが人物とチームをミッションに割り当てる可能性がなくなり、クエリを実行する必要がなくなりUNIONます。これただし、3 つの参加を強制します (ミッション -> チーム、チーム -> IndividualsInTeams、IndividualsInTeams -> 個人)。コストが高すぎる場合は、ライブではないデータを許容できるのであれば、データの静的ビューを毎日作成することをお勧めします。データベースのサイズによっては、ビューの生成にコストがかかる場合とそうでない場合があります。時間コストによっては、より正確なデータを得るために 1 日に 2 回更新することをお勧めします。これにより、最も重要なクエリ (ユーザー X に割り当てられているミッションは何ですか?) の時間を節約できます。

于 2013-06-24T19:25:21.077 に答える