0

성능 및 코딩 관점에서 두 개의 연결된 데이터베이스 레코드를 단일 행으로 저장하는 것이 더 나은지 확인하려면 (그리고 이후 특정 레코드에 대해 두 열을 모두 검색해야합니다. 값은 어느 위치 에나있을 수 있음) 또는 해당 연결에 대한 두 번째 행을 만들고 한 열만 검색하십시오.양방향 관계 저장 및 쿼리 관련 데이터베이스 성능

예로 희망 도울 것이다

UserTable 
userID INTEGER, 
firstName VARCHAR2(20), 
lastName VARCHAR2(20) 

2 행 :

1, John, Smith 
2, Terry, Jenkins 

번째 테이블 간의 관계를 저장하기

RelationshipTable 
relationshipID INTEGER, 
userID1  INTEGER, 
userID2  INTEGER 

(둘 사이의 관계를 추적하기 위해) 존과 테리 할 수있어 :

옵션 1 (1 행) : 다음

relationshipID, userID1, userID2 
1,    1,  2 

이 테리 내가의 일부가

SELECT * 
FROM RelationshipTable 
WHERE userID1 = [terrysID] OR userID2 = [terrysID] 

처럼 뭔가를해야 할 것 아니면 2 행과 삽입으로 갈 수 있음을 어떤 관계를 찾는 연관의 각 ID를 특정 열로

옵션 2 (2 행) :

relationshipID, userID1, userID2 
1,    1,  2 
2,    2,  1 

와 테리가로의 일부인 관계를 찾을 수 :

SELECT * 
FROM RelationshipTable 
WHERE userID1 = [terrysID] 

내가 더 확실하지 않다.

두 옵션 모두 첫 번째 옵션에 도움이되는 인덱스를 설정할 수 있습니다. 그러나, 결과 집합의 어떤 열이 테리가 아닌 ID인지 확인하기 위해 일부 결과를 사후 처리해야합니다. 그리고 나는 여러 장소에서 그 논리를 반복해야하기 때문에 코딩이 조금 복잡하다고 생각합니다.

한편, 두 번째 방법은 데이터 양을 효과적으로 두 배로 늘리고 더 무섭게도 실제 "비즈니스 가치"를 추가하지 않고 데이터를 복제합니다. 그 관계가 끝나면 두 레코드를 모두 삭제했는지 확인해야합니다 (또는 소프트 삭제 또는 우리가 선택했던 모든 작업).

존의 관계 또는 테리의 관계를 검색 할 수 있는지 알지 못하기 때문에 관계 생성시 ID를 특정 열에 지능적으로 삽입 할 수 없습니다.

생각하십니까? 내가 생각하지 못한 세 번째 옵션이 더 좋을 수도 있습니다. 쿼리를위한 두 개의 행을 생성하지만 실제로 데이터를 복제하지 않고 테이블에 뷰를 생성하는 것과 같은 것이 있습니까? 분명히 그것은 시스템에 추가적인 오버 헤드를 유발할 것입니다.

편집 : 비슷한 질문이지만이 질문에 대한 답변을 정확하게 찾지 못했습니다. Two way relationships in SQL queries

고마워요!

답변

1

명확성과 사용 편의성 측면에서 옵션 1을 선택했습니다.이것은 1이 2와 관련이 있고 2가 1과 관련되어 중복되는 버그를 가지고 있습니다. 그러나, 그것은 프론트 엔드까지 멈출 것입니다 (DB에서 모든 것을 할 수는 없습니다).

귀하의 후 처리가 완전히, 당신이 준 선택 단순한를 사용하지 않음으로써하지만이를 이용하여 방지 할 수 있습니다

:

SELECT relationshipId, user1Id, user2Id 
FROM RelationshipTable 
WHERE userID1 = [terrysID] 
union all 
SELECT relationshipId, user2Id, user1Id 
from RelationshipTable 
where userID2 = [terrysID] 

이 [terrysId] 항상 쌍의 첫번째 것을 의미합니다. 두 컬럼 모두에 인덱스가 있다면 매우 효율적이어야합니다.

+0

은 나에게 의미가 있습니다. 노테이션은 각 파트가 전체 RelationshipTable의 상대적으로 작은 하위 집합만을 반환하기 때문에 비효율적 일 수는 없으며 각 파트는 인덱스를 사용할 수 있기 때문에 최적화됩니다. 감사! – user3249281