2010-02-01 74 views
2

我正在設計我的數據庫和其中一個表(任務),需要能夠與它自己建立一對多關係。這是因爲一個任務可以有許多具有相同數據的子任務(就像SO上的問題和答案一樣)。使用相同SQL表的一對多關係

由於我的SQL不是很強大,所以我只是有點困惑,不知道如何在同一個表上創建一對多的SQL。

目前,我有這些行:

任務id(唯一標識符)
aspnet_OwnerUserId(唯一標識符)
標題(爲nvarchar(50)) 說明(爲nvarchar(MAX))
起始日期(SMALLDATETIME)
DueDate(smalldatetime)

回答

4

雖然我不是很確定你要實現什麼,但根據你給出的表字段,我認爲與表本身的一對多關係更合適。

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,如果是這樣的話。否則,忘記它。 ;)

CREATE TABLE `aspnet_OwnerUser` 
(
    `id` SERIAL PRIMARY KEY 
    , `name` VARCHAR(128) 
    -- further detail follows 
); 

CREATE TABLE `task` 
(
    `id` SERIAL PRIMARY KEY 
    , `ref_id` INTEGER 
     CONSTRAINT REFERENCES `task`(`id`) 
    , `aspnet_OwnerUserId` INTEGER 
     CONSTRAINT REFERENCES `aspnet_OwnerUser`(`id`) 
    , `title` VARCHAR(128) NOT NULL 
    , `startdate` TIMESTAMP 
    , `duedate` TIMESTAMP 
); 

p.s.上面的SQL是爲PostgreSQL編寫的,對於其他DBMS,請隨時修改它。

+0

是的,看起來我更像是一個白癡,它首先出現,一對多正是我的想法。我似乎無法通過大腦翻譯。更新問題。 – 2010-02-01 05:31:33

+0

感謝您將我的大腦放回直線和狹窄。 /弓 – 2010-02-01 05:41:12

3

交點(交匯點)表的編碼與您所期望的幾乎相同,只有兩個外鍵指向同一個表。

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) 
) 
/
+0

這是多對多的正確答案。感謝shinkou,我被糾正了。 – 2010-02-01 05:38:23

+0

@Alastair Pitts - 在這個網站上,並不總是很容易判斷給定的數據模型是真正的目標還是僅僅是一個簡化的測試用例。 – APC 2010-02-01 05:45:58

1

如果你的比喻就像是關於SO的問題和答案,那麼這不是多對多的關係,它是一對多的關係。一個問題可能有幾個答案,但答案只屬於一個問題。繪製簡單的方法是:

表 - 任務

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

然後創建一個自引用的外鍵約束從ParentTaskIDTaskID

假設出於某種原因,您確實需要M:M映射。這必須使用映射表完成;自refeferencing L:M是不是真的從A M任何不同:M涉及到兩個表:

表 - 任務

TaskID uniqueidentifier NOT NULL, 
(other fields) 

表 - 子任務

TaskID uniqueidentifier NOT NULL, 
SubTaskID uniqueidentifier NOT NULL 

在引用Tasks (TaskID)列的SubTasks表中的TaskIDSubTaskID上放置外鍵約束。這個和任何其他M:M關係的唯一區別是兩個外鍵約束都指向同一個表(並且在某些DBMS上,您將無法級聯這兩個表)。

+0

爲我的原始問題和更新後的更正問題的好答案:) – 2010-02-01 05:40:39