Oce*_*t20 5 sql database database-design data-structures
我一直在做相当多的搜索,但还没有找到关于这个主题的很多资源.我的目标是存储您在甘特图中找到的调度数据.因此,存储数据的一个示例可能是:
Task Id | Name | Duration
1 Task A 1
2 Task B 3
3 Task C 2
Task Id | Predecessors
1 Null
2 Null
3 1
3 2
Run Code Online (Sandbox Code Playgroud)
哪个任务C等待任务A和任务B完成.
所以我的问题是:存储此类数据并有效查询的最佳方法是什么?对于这种事情有什么好的资源吗?有大量关于树结构的信息,但是一旦你添加了多个父母,就很难找到信息.顺便说一句,我正在使用SQL Server和.NET来完成这项任务.
您的问题与关系基数的概念有关。所有关系都有一定的基数,它表示关系每一方作为其成员或可以参与关系的单个实例的潜在实例数。举个例子,对于人来说(我猜,对于大多数生物来说,除了极少数例外),父子关系的基数为2 to zero or many,这意味着父方需要两个父项,并且可以有零个或多个子项(也许应该是2 to 1 or many)
在数据库设计中,通常,一侧具有 1(一)(或零或一)的任何内容都可以轻松地用两个表来表示,每个实体一个表(有时只需要一个表,请参阅注释* *) 和表中代表“多”侧的外键列,该外键列指向保存“一”侧实体的另一个表。
就你而言,你们有一段many to many关系。(一个任务可以有多个前导任务,每个前导任务当然可以是多个任务的前导任务)在这种情况下,需要第三个表,其中每一行实际上代表 2 个任务之间的关联,表示其中一个任务是该任务的前导任务其他。通常,该表被设计为仅包含两个父表主键的所有列,并且它自己的主键是两个父主键中所有列的组合。在您的情况下,它只有两列:taskId 和 PredecessorTaskId,并且这对 Id 在表中应该是唯一的,因此它们一起形成复合 PK。
查询时,为了避免在存在多个连接时重复计算父表中的数据列,只需基于父表进行查询...例如,要查找最长父表的持续时间,假设您的关联表名为 TaskPredecessor
Select TaskId, Max(P.Duration)
From Task T Join Task P
On P.TaskId In (Select PredecessorId
From TaskPredecessor
Where TaskId = T.TaskId)
Run Code Online (Sandbox Code Playgroud)
** 笔记。如果关系中的两个实体具有相同的实体类型,则它们可以位于同一个表中。规范的(luv 这个词)示例是一个雇员表,其中具有工人与主管的多对一关系...由于主管也是雇员,因此工人和主管可以位于同一个 [Employee] 表中,并且关系可以使用外键(称为 SupervisorId)进行建模,该外键指向同一表中的另一行并包含该员工主管的员工记录的 Id。
| 归档时间: |
|
| 查看次数: |
2347 次 |
| 最近记录: |