2010-02-01 2 views
2

데이터베이스를 디자인하는 중이고 테이블 (작업) 중 하나가 자체와 일대 다 관계를 유지할 수 있어야합니다. 이는 작업에 동일한 데이터 (많은 질문과 답변과 비슷 함)가있는 여러 하위 작업이있을 수 있기 때문입니다.동일한 SQL 테이블을 사용하는 일대 다 관계

나는 아주 강한 SQL로 인해 같은 테이블에서 일대 다 방식을 만드는 방법에 대해 조금 혼란스러워합니다.

현재 나는이 행이 :

TASKID (고유 식별자)
aspnet_OwnerUserId (고유 식별자)
제목 (NVARCHAR (50)) 설명 (NVARCHAR (MAX))
STARTDATE (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

그래, 내가 처음에 나타난 바보 같아요. 일대 다 (one-to-many)가 정확히 제가 생각한 것입니다. 나는 뇌가 그것을 번역하지 못하는 것 같습니다. 질문 업데이트 중입니다. –

+0

내 머리를 곧고 좁은 곳에 다시 붙여 주셔서 감사합니다./활 –

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

편집 나는 당신의 데이터 모델을 심문하고 싶은, 그런를 입력 가졌어요. 나는 하나의 작업이 많은 하위 작업을 소유 할 수 있음을 볼 수 있지만 하위 작업이 어떻게 많은 마스터 작업에 속할 수 있는지 잘 모르겠습니다. 정말로 일대 다의 관계를 원하지 않습니까?

편집이

나는 당신이 그 시점에 대답 질문을 편집 참조하는 편집을 작성하는 동안. 당신의 비유는 질문처럼 그리고 다음이 다 대다 관계없는에 대답하면

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

이것은 many-to-many에 대한 정답이다. shinkou 덕분에, 나는 시정되었다. –

+0

@Alastair Pitts -이 사이트에서는 주어진 데이터 모델이 실제 대상인지 단순화 된 테스트 사례인지를 쉽게 알 수있는 것은 아닙니다. – APC

1

, 그것은 일대 다 관계입니다. 하나의 질문에는 몇 가지 대답이있을 수 있지만 답변은 하나의 질문에만 속합니다.

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

그런 다음 ParentTaskID에서 TaskID에 자체 참조 외래 키 제약 조건을 만드는 작업 -

테이블 :이지도하는 가장 간단한 방법입니다.

어떤 이유로 M : M 매핑이 실제로 필요하다고 가정 해 보겠습니다. 이는 매핑 테이블을 사용하여 수행해야합니다. 자기 refeferencing 남 : M은 M에서 정말 어떤 다른되지 않습니다 : M은 두 개의 테이블과 관련된 :

표 - 작업

TaskID uniqueidentifier NOT NULL, 
(other fields) 

표 - 하위

TaskID uniqueidentifier NOT NULL, 
SubTaskID uniqueidentifier NOT NULL 

을 및 SubTaskID 외래 키 제약 조건을 Tasks (TaskID) 열을 참조하는 SubTasks 테이블에 배치합니다. 이것과 다른 M : M 관계의 유일한 차이점은 두 개의 외래 키 제약 조건이 동일한 테이블을 가리킨다는 것입니다 (일부 DBMS에서는 둘 다 캐스케이드 할 수 없습니다).

+0

원본 문제와 업데이트 된 문제 모두에 대한 답변입니다. :) –