在SQL DB中调度App的表结构

The*_*aut 5 sql database-design calendar relational-database database-schema

我正在使用数据库来保存通话时间表的信息。目前,我有一个看起来像这样的结构:

Table - Person: (key)ID, LName, FName, Phone, Email
Table - PersonTeam: (from Person)ID, (from Team)ID
Table - Team: (key)ID, TeamName
Table - Calendar: (key dateTime)dt, year, month, day, etc...
Table - Schedule: (from Calendar)dt, (id of Person)OnCall_NY, (id of Person)OnCall_MA, (id of Person)OnCall_CA
Run Code Online (Sandbox Code Playgroud)

我的问题是:对于Schedule表,我应该保持结构原样,dt是唯一键,还是应该重新排列它,使dt不唯一并且该表如下所示:

Table - Schedule: (from Calendar)dt, (from Team)ID, (from Person)ID
Run Code Online (Sandbox Code Playgroud)

并每天有多个条目,或者仅使用以下命令是否有意义:

Table - Schedule: (from Calendar)dt, (from PersonTeam)KeyID - [make a key ID on each of the person/team pairings]
Run Code Online (Sandbox Code Playgroud)

一个团队将始终有一个待命人员,但是一个人一次可以召集多个团队(如果他们属于多个团队)。

如果完全不同的设置会更好,请告诉我!

谢谢你的帮助!如果我的问题不清楚,我深表歉意。我的学习速度很快,但是对于每天使用SQL还是很陌生,所以我想确保在学习时正在使用最佳实践,这样我就不会养成不良习惯。

And*_*y M 1

在我看来,答案可能取决于团队的数量是否固定相当小。当然,团队的名称是否固定也可能很重要,但这可能与列命名有更多关系。

更具体地说,我的观点是这样的:

如果业务要求总是有少量且固定数量的人员(比如三个)待命,那么在 中分配三列可能会更方便,Schedule每个团队一列保存指定人员的 ID,即就像您当前的结构:

dt   OnCall_NY  OnCall_MA  OnCall_CA
---  ---------  ---------  ---------
Run Code Online (Sandbox Code Playgroud)

dt作为主键。

如果团队数量(表中Team)也是固定的,您可以像现在一样在列名称中包含团队名称/指示符,但如果团队数量超过三个,并且只是表中的团队数量Schedule限制为三个,那么您可以只使用诸如OnCallID1, OnCallID2,之类的名称OnCallID3

但即使这个要求是固定的,也可能只是今天才固定下来,明天你的老板就会说,“我们不再与固定数量的团队合作(待命)”,或者“我们需要扩大支持的团队数量”到四个,将来我们可能需要进一步扩展”。因此,您在问题中考虑切换到一种更通用的方法,即

dt   Team  Person
---  ----  ------
Run Code Online (Sandbox Code Playgroud)

主键现在在哪里dt, Team

这样您就可以轻松地扩展/减少数据库级别的待命人数,而无需更改架构中的任何内容。


更新

我忘记在我原来的答案中解决你的第三个选项(抱歉)。开始。

您的第一个选项(目前实际实施的选项)似乎意味着每个团队只能由(不超过)一个人代表。如果您将代理 ID 分配给人员/团队对,并在和中使用这些键Schedule而不是单独的 ID ,您可能无法强制执行提到的“时间表中每个团队一个人”的要求(或者,至少,这可能证明有点麻烦)在数据库级别,而使用单独的键,将其设置为复合键的一部分就足够了,然后您就完成了,现在每天不超过一个团队。PersonTeamTeam(dt, Team)

此外,如果一个人在团队中的存在以这种方式固定(即参考“个人/团队”对) ,您可能会很难让一个人随着时间的推移改变团队。Schedule您可能必须更改表中的团队引用PersonTeam,这会导致历史信息的误传:在查看某一天回电的人员时,显示的人员的团队将是他们现在所属的团队,而不是他们现在所属的团队他们当时就这么做了。

Schedule另一方面,在 中为人员和团队使用单独的 ID ,可以让您自由地更改团队,当然,前提是您引用。(Schedule.Team, Schedule.Person)(PersonTeam.Team, PersonTeam.Person)