Ste*_*ins 2 sql t-sql database-design
如果愿意,请考虑以下表格:
假期模型http://imagetiger.org/images/vacatilrl.png
这可能看起来像一个奇怪的结构,但请允许我解释.这个结构的目标是创建一个列出所有人的报告,不包括度假的人(为简单起见,我们假设假期记录只有在一个人休假时才会存在.)
我有Vacation表的原因是因为Event表是"无意义"事件的更通用的表,而Vacation表包含更多细节,例如位置和日期.
我似乎无法弄清楚的是如何设计一个包含Person.personId和Vacation.location的查询,但只包含Person_Vacation中存在的那些personId.或者反之,只有Person_Vacation中不存在的personIds.
此外,这似乎是设计方面实施此解决方案的最佳方式吗?关于我可能做错了什么或建议改进的任何想法?
编辑: 也许我只是不太擅长沟通我的意图:结果只让度假的人很容易,但我想执行相反的,基本上所有人不休假.
设计方面我不明白你为什么需要Person_Vacation.如果我理解你的设计正确,每个假期都是一个事件(即"继承"),所以可以通过Vacation和之间的联系.那么查询将是:PersonPerson_Event
度假的人:
SELECT P.PersonID, V.locaton
FROM Person P, Vacation V, Person_Event PE
WHERE P.personid = PE.personID AND PE.eventid = V.eventid
Run Code Online (Sandbox Code Playgroud)
非假期活动的人:
SELECT P.PersonID, E.title
FROM Person P, Person_Event PE, Event E
WHERE P.personid = PE.personID AND PE.eventid = E.eventid
AND E.eventID NOT IN (SELECT eventid FROM Vacation)
Run Code Online (Sandbox Code Playgroud)
任何人不得在任何假期:
SELECT P.PersonID, E.title
FROM Person P, Person_Event PE, Event E
WHERE P.personid = PE.personID AND PE.eventid = E.eventid
AND P.personID NOT IN
(SELECT personid FROM Person_Event PE, Vacation V WHERE PE.eventid = V.eventid)
Run Code Online (Sandbox Code Playgroud)
如果你想要去与自己的设计,那么你必须决定是否将只插入一个人的假期Person_Vacation或Person_Vacation和Person_Event.如果你做前者,那么上面的查询会变得有点简单.
但是我仍然会投票给我的设计,因为你实际上在做的是过早地分割数据只是为了获得一点性能/简单性.从长远来看,这可能无法获得回报.