2014-10-15 7 views
0

처음에는 SQL을 알고 있지만 프로가 아니란 것을 알고 있습니다.동일한 테이블에서 여러 개의 외래 키를 가질 수 있습니까?

기본 조건이 (예를 들어) 한 사람에게는 하나의 일정 만 있고 한 일정에는 한 사람 만있을 수있는 상황이 있습니다. 그래서 schedule tableperson_idFK으로 생성하면됩니다. (1-1 관계)

그러나, 지금 일정이 한 사람 이상이있을 수 있으며 한 사람 (많은 관계 많은 ) 많은 일정을 가질 수 있습니다. 이것을 할 수 있습니까? 내 데이터베이스를 재 설계하는 방법?

+0

당신의 스키마와 당신이 지금까지 노력이를 붙여주세요. – SMA

답변

1

두 테이블 사이에 많은 수의 참조가있는 것은 결코 좋은 생각입니다. 관계 사이에 별도의 테이블을 두는 것이 가장 좋습니다. enter image description here

샘플 쿼리는 다음의 라인을 따라 다음과 같습니다

select * from Person 
join PersonSchedule on PersonSchedule.PersonId= Person.Id 
join Schedules on Schedules.Id = PersonSchedule.ScheduleId 
+0

당신의 도움에 감사드립니다. 오, 아니, 현재 데이터베이스의 많은 부분을 변경해야합니다. 나는 당신의 대답을 수락하기 전에 다른 대답을 기다릴 것입니다. 너무 나쁜 나는 한 번만 upvote 수 있습니다 –

+0

만약 당신이 직접 많은 관계 (나쁜 생각) 많은 직접 만들 수 말해 줄 수있는 감사하겠습니다. 문제는 내가 데이터베이스를 바꿀 시간이 없다는 것입니다. –

+0

대다수가 나쁘다. 나는 그것이 작동하도록하는 어떤 방법을 추천하지 않을 것이다. 그러나 '매우'붙어있는 경우에만 각 일정마다 새로운 사람을 입력해야합니다. 분명히 사용자를 복제하면 독창성을 잃어 버리며 불행의 세계가됩니다. 그래서 나는 그것을하는 것이 좋습니다! – Gibson

2

소리가 잘못 들렸습니다. 일반적으로 하위 테이블에는 상위에 대한 참조가 있습니다. 이렇게하면 많은 어린이들이 같은 부모를 공유 할 수 있습니다. 많은에 많은

Parent(id, name) 
Child(id, parent_id, name) 

Parent(1, 'parent') 
    - Child(1, 1 'child 1') 
    - Child(2, 1 'child 2') 
    - Child(3, 1 'child 3') 

은 중간에 합류 테이블로 수행됩니다

Person(id, name) 

PersonSchedule(person_id, schedule_id) 

Schedule(id, name) 

-- you can now specify connections between any schedule and and person 
Person(1, 'p1'), Person(2, 'p1') 
Schedule(1, 's1'), Schedule(2, 's1') 

PersonSchedule(1, 1) 
PersonSchedule(1, 2) 
PersonSchedule(2, 1) 

은 또한 당신은 가입 테이블에 관계 관련 데이터를 넣어 것입니다. 예를 들어 한 사람이 자신의 일정 중 일부에 대해 통지 할 수 있습니다 말 :

PersonSchedule(person_id, schedule_id, should_notify) 

그럼 당신은 자유롭게 통지를하는 사람들이 말할 수있는 스케줄 (또는 일정이 필요로하는 사람들에게이 다른 방법을 다시 생각에 대해 통지 받는다).

+0

죄송합니다. 잘못된 예를 선택합니다. 나는 당신의 답을 이해할 수 있지만, 나는 N 대 N 관계가 필요하다. 더 좋은 예는 사람이 여러 일정을 가질 수 있으며 일정이 여러 사람을 가질 수 있다는 것입니다. 최대한 빨리 내 질문을 업데이트 할 것입니다 –

+0

고마워요. 죄송합니다. 나는 단지 1 개의 대답을 받아 들일 수 있습니다, some1이 당신의 친절을 위해 upvote를 바란다. –

2

설명하는 것은 일대일 관계입니다.

일반적으로 1 명의 부모는 N 명의 자식을 가질 수 있습니다. 그러나 각 어린이에게는 부모가 한 명만있을 수 있습니다 (실제 생활에서는 그렇지 않습니다. 그러나 그것이 당신이 당신의 예에서 의미하는 바 였다고 생각합니다). 그들은 방법이 모델

은 다음과 같습니다

parent(ID, name) 
child(ID, name, parent_ID) 

child.ID는 PK가

parent.ID는 PK입니다 (이 유일하게 아이를 식별)입니다

child.parent_ID은 (는 유일하게 부모를 식별) parent.ID을 가리키는 FK입니다. FK는 항상 PK를 가리 킵니다.

편집 : 당신에서 당신이 N-에-M 관계를 원하는 것 같다, 주석 처리합니다. 부모님과 자녀를 다시 사용하되 실생활과 같이 : 아이들은 부모가 1 명 이상입니다. N 대 M 관계는 두 테이블을 연결하는 중간에 하나의 테이블을 사용하여 모델링됩니다.

예 :

parent(ID, name) -- ID is PK 
parent(1, 'parent1') 
parent(2, 'parent2') 
parent(3, 'parent3') 

child(ID, name) -- ID is PK 
child(10, 'child1') 
child(11, 'child2') 
child(12, 'child3') 

-- who is parent of whom? 

parent_child(parentID, childID) -- both parentID and childID are FKs 
parent_child(1, 10) -- parent1 is parent of child1 
parent_child(2, 10) -- parent2 is parent of child1 
parent_child(2, 11) -- parent2 is parent of child2 

FK: parent_child.parentID -> parent.ID 
FK: parent_child.childID -> child.ID 

하나 더 참고. 당신이 다음으로부터 깨닫는 지 여부는 확실하지 않습니다.

이 관계에 대해 PK 및 FK 제약 조건을 설정하는 것은 매우 좋은 생각이지만, 필수 사항은 아니며 문제 모델링에도 영향을 미치지 않습니다.

위에서 설명한 것처럼 3 개의 테이블을 사용하여 다 대다 시나리오를 모델링하는 것이 한 가지입니다. 이것은 완벽하게 작동합니다.

또 다른 한 가지는 PK 및 FK 제약 조건을 적용하는 것입니다. 이렇게하면 우연히 일치하지 않는 데이터를 삽입 할 수 없으며 (예 : 같은 사람이 두 번 또는 존재하지 않는 부모와 자녀 - 부모 관계) 쿼리 엔진이 더 나은 효율성을 제공하는 데 도움이됩니다.

+0

죄송합니다, 잘못된 예를 선택합니다. 나는 당신의 답을 이해할 수 있지만, 나는 N 대 N 관계가 필요하다. 더 좋은 예는 사람이 여러 일정을 가질 수 있으며 일정이 여러 사람을 가질 수 있다는 것입니다. 최대한 빨리 내 질문을 업데이트하겠습니다 –

+0

고마워요. 죄송합니다. 나는 단지 1 개의 대답을 받아 들일 수 있습니다, some1 희망은 당신의 친절을 위해 upvote 것입니다 –

관련 문제