성능 및 코딩 관점에서 두 개의 연결된 데이터베이스 레코드를 단일 행으로 저장하는 것이 더 나은지 확인하려면 (그리고 이후 특정 레코드에 대해 두 열을 모두 검색해야합니다. 값은 어느 위치 에나있을 수 있음) 또는 해당 연결에 대한 두 번째 행을 만들고 한 열만 검색하십시오.양방향 관계 저장 및 쿼리 관련 데이터베이스 성능
예로 희망 도울 것이다
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
고마워요!
은 나에게 의미가 있습니다. 노테이션은 각 파트가 전체 RelationshipTable의 상대적으로 작은 하위 집합만을 반환하기 때문에 비효율적 일 수는 없으며 각 파트는 인덱스를 사용할 수 있기 때문에 최적화됩니다. 감사! – user3249281