使用相同SQL表的一对多关系

使用相同SQL表的一对多关系,sql,database-design,one-to-many,Sql,Database Design,One To Many,我正在设计我的数据库,其中一个表(任务)需要能够与自身建立一对多的关系。这是因为一个任务可以有许多具有相同数据的子任务(很像问答等) 我只是有点困惑,因为我的SQL不是很强,关于如何在同一张表上创建一对多 目前我有以下行: 任务ID(唯一标识符) aspnet_OwnerUserId(唯一标识符) 头衔(女律师(50)) 说明(nvarchar(最大值)) 开始日期(smalldatetime) DueDate(smalldatetime) 你可以用多对多的方式来做,但实际上它更像一个。虽然我不

我正在设计我的数据库,其中一个表(任务)需要能够与自身建立一对多的关系。这是因为一个任务可以有许多具有相同数据的子任务(很像问答等)

我只是有点困惑,因为我的SQL不是很强,关于如何在同一张表上创建一对多

目前我有以下行:

任务ID(唯一标识符)
aspnet_OwnerUserId(唯一标识符)
头衔(女律师(50)) 说明(nvarchar(最大值))
开始日期(smalldatetime)
DueDate(smalldatetime)


你可以用多对多的方式来做,但实际上它更像一个。虽然我不太确定你将要实现什么,但取决于你给出的表字段,我认为与表本身的一对多关系更合适

TaskId (integer *Primary Key)
Ref_Id (integer *Foreign Key references to TaskId above)
ASPNet_OwnerUserId (integer)
Title (varchar/text)
StartDate (Date/Timestamp)
DueDate (Date/Timestamp)
如果您希望子任务具有多个父任务,那么请忘记我所说的。也就是说,可以对某个问题给出一个或多个答案,但不能反过来

编辑: 我想您将拥有另一个表“aspnet_OwnerUser”,其中包含一些用户信息。如果是这种情况,请查看下面的SQL。否则,算了吧

p、 上述SQL是为PostgreSQL编写的,对于其他DBMS,请随意修改。

交叉点(连接点)表的编码与您预期的非常接近,只有两个外键指向同一个表

create table task_subtasks
 ( master_id number not null
   , sub_id number not null
   , constraint task_subtask_pk primary key (master_id, sub_id)
    , constraint task_subtask_master_fk foreign key (master_id)
         references tasks (taskid)
    , constraint task_subtask_sub_fk foreign key (sub_id)
         references tasks (taskid)
    )
/
编辑

打好之后,我想询问一下您的数据模型。我可以看到一个任务可以拥有许多子任务,但我不确定一个子任务如何属于许多主任务。你确定你真的不想要一对多的关系吗

编辑2

在我写编辑的时候,我看到你编辑了你的问题来回答这一点

create table tasks (
TaskId number not null
, aspnet_OwnerUserId number not null
, subTaskId number
, Title (nvarchar(50))
, Description (nvarchar(MAX))
, StartDate (smalldatetime)
, DueDate (smalldatetime)
, constraint task_pk primary key (taskid)
, constraint sub_task_fk foreign key (subtaskid)
    references tasks (taskid)
)
/

如果你的类比像一个问答,那么这不是一个多对多的关系,而是一对多的关系。一个问题可能有几个答案,但一个答案只属于一个问题。对此进行映射的最简单方法是:

表格-任务

TaskID uniqueidentifier NOT NULL,
ParentTaskID uniqueidentifier NULL,
(other fields)
TaskID uniqueidentifier NOT NULL,
(other fields)
TaskID uniqueidentifier NOT NULL,
SubTaskID uniqueidentifier NOT NULL
然后从
ParentTaskID
TaskID
创建自引用外键约束

假设出于某种原因,您确实需要一个M:M映射。这必须使用映射表来完成;自参考M:M与涉及两个表的M:M没有什么区别:

表格-任务

TaskID uniqueidentifier NOT NULL,
ParentTaskID uniqueidentifier NULL,
(other fields)
TaskID uniqueidentifier NOT NULL,
(other fields)
TaskID uniqueidentifier NOT NULL,
SubTaskID uniqueidentifier NOT NULL
表格-子任务

TaskID uniqueidentifier NOT NULL,
ParentTaskID uniqueidentifier NULL,
(other fields)
TaskID uniqueidentifier NOT NULL,
(other fields)
TaskID uniqueidentifier NOT NULL,
SubTaskID uniqueidentifier NOT NULL

在引用
任务(TaskID)
列的
子任务
表中的
TaskID
SubTaskID
上放置外键约束。此关系与任何其他M:M关系之间的唯一区别在于,两个外键约束都指向同一个表(在某些DBMS上,您将无法同时级联这两个表)。

是的,看起来我比第一次出现时更像一个傻瓜,一对多正是我所想的。我只是无法用大脑来翻译。更新问题。谢谢你让我的大脑回到正轨/这是多对多的正确答案。感谢shinkou,我得到了更正。@Alastair Pitts-在这个网站上,要判断给定的数据模型是真正的目标还是只是一个简化的测试用例并不总是那么容易。对于我的原始问题和更新的更正问题,这都是一个很好的答案:)