2013-02-14 2 views
2

나는 RDBMS에서 다음과 같은 재귀 관계를 표현하기 위해 노력하고있어 :재귀 엔티티 w/아웃 부모/자식 관계

enter image description here

기본적인 예를 들어를, 우리는 다음과 같은 필드가 있습니다

1 - computer science 
2 - computer engineering 
3 - electrical engineering 
4 - mathematics 

그리고 비슷한 분야를 서로 연관시키고 싶습니다. 두 번째 테이블을 사용하여 필드를 서로 연관시킬 수 있습니다.

+----------+----------+ 
| field1 | field2 | 
+----------+----------+ 
| 4  | 1  | (math -> comp sci) 
| 4  | 2  | (math -> comp eng) 
| 4  | 3  | (math -> elect eng) 
| 2  | 1  | (comp eng -> comp sci) 
| 2  | 3  | (comp eng -> elect eng) 
+----------+----------+ 

그러나, 키 (필드 1, FIELD2), 나는 두 가지 잠재적 인 문제를 볼 수 있다면 : 최적, 나는이처럼 보이는 상상할 수

  1. 튜플
  2. 정렬되지 않은이기는하지만, 복제 할 수 더 중요도가없는 경우
  3. 이 불필요하게 복잡 쿼리 수있는 필드에있는 열의
,369 ( 포인트 아웃 sgeddes, 중복 두 열 질의 및 필터링 등) 예를 들어 1,363,210

:

+----------+----------+ 
| field1 | field2 | 
+----------+----------+ 
| 1  | 4  | (comp sci -> math) 
| 4  | 3  | (math -> elect eng) 
| 4  | 2  | (math -> comp eng) 
| 3  | 4  | (elect eng -> math) 
| 2  | 1  | (comp eng -> comp sci) 
| 3  | 2  | (elect eng -> comp eng) 
| 1  | 2  | (comp sci -> comp eng) 
+----------+----------+ 

가 어떻게 비 계층 적 재귀 관계를 접근해야합니까?

두 번째 테이블과 마찬가지로 각 튜플을 의도적으로 복제해야합니까? 아니면 제가 너무 많이보고있는 다른 방법이 있습니까?

답변

1

나는이 접근법을 여러 번 본 적이있다. 일치를 위해 두 필드를 모두 쿼리하고 중복 결과를 필터링해야했기 때문에 솔직히 거대한 팬이 아니 었습니다. 유사한 2 개 이상의 필드는 어떻게됩니까? 오히려 지저분해질 수 있습니다.

위 예제를 사용하면 다른 방법으로 SimilarField 테이블을 도입 할 수 있습니다. SimilarId와 FieldId를 저장합니다 (일부 사용자는 SimilarFieldId라는 세 번째 ID 필드를 주장합니다). 영어와 문학 비슷한 분야 인 경우에, 당신은 할 수 있도록 :

SimilarId FieldId 
1   1   (English) 
1   2   (Literature) 

이 방법은 당신이 당신의 필드와 그와 유사한 필드 사이에 1-N 관계를 가질 수 있습니다. 귀하의 코멘트에 대한 응답으로

--EDIT-- , 귀하의 예제가 작동하지 않는 방법을 잘 :

SimilarId FieldId 
1   1   (English) 
1   2   (Literature) 
1   3   (Reading) 
2   2   (Literature) 
2   4   (History) 
3   4   (History) 
3   5   (Art History) 

필요한만큼 그룹화 유사한 필드를 가질 수 있습니다.

SELECT DISTINCT F.FieldId, F.FieldName 
FROM Field F JOIN 
     SimilarField S ON F.FieldId = S.FieldId 
WHERE S.SimilarId IN (
     SELECT SimilarId 
     FROM SimilarField 
     WHERE FieldId = 2 
    ) 

을 그리고 여기 샘플 SQL Fiddle입니다 :

예를 들어 문학과 관련된 모든 필드를 얻으려면 쿼리는 다음과 같이 할 수있다.

+0

혼란 스럽지만 (아직도) 혼란 스럽긴하지만 다 대다가 필요하다고 생각합니다. 예를 들어 문학에 한 가지 유사한 필드 만 허용 할 수 있습니다. * (내 질문에 예제를 업데이트했습니다) * –

+0

@DavidKaczynski -이 접근 방식을 사용하면 N-N 관계를 사용할 수 있지만 비슷한 그룹에서는 1-N 관계를 사용할 수 있습니다. 위의 수정 사항을 참조하십시오. – sgeddes

+0

설명해 주셔서 감사합니다. 이 질문을 할 수있게 해주십시오. 모든 필드를 읽기와 비슷하게하려면 해당 쿼리가 어떻게 보이겠습니까? 예를 들어'SimilarId, SimilarId, FieldId from SimilarField where SimilarId = 3 or FieldId = 3'을 선택합니다. 그런 다음 결과로 나온'(SimilarId, FieldId)'튜플을 개별 Id 세트로 변환하여 원래의 Field 테이블을 쿼리하려면 어떻게해야합니까? ? –

1

중복 문제에 대한 일반적인 접근 방법 중 하나는 튜플에 항상 가장 낮은 ID가 포함되어 있고 두 열 모두에 UNIQUE 키가 결합되어 있는지 확인하는 것입니다. 그러면 SELECT에 대한 조건은 WHERE field1 = @id OR field2 = @id 일 수 있습니다.