私はデータベース設計の問題を抱えています...
私のシステムには一連の「ミッション」があり、各ミッションは、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 人以上の場合は、割り当てられたチーム内にある必要があります)。
代わりにこれで行くことができます:
しかし、これは私の最も一般的なクエリを簡単にしますが、TeamOrIndividualName の多目的な性質とそれに制約を加えることができないという事実のために、少し恐ろしく感じます。
では、この場合、データを構造化する最良の方法は何でしょうか?
私が考慮していない別の可能性はありますか?