복붙노트

[SQL] 자연 프로덕션 환경에 유해한 것으로 간주 (JOIN)인가?

SQL

자연 프로덕션 환경에 유해한 것으로 간주 (JOIN)인가?

내가 SQL에 대한 자연 속기 형태에 대한 책을 읽은하고 조인과 좀 트랩을 참조하십시오

해결법

  1. ==============================

    1.자연 구문 안티 패턴 가입 :

    자연 구문 안티 패턴 가입 :

    이 때문에, 나는 어떤 환경에서 구문을 사용하지 않는 것이 좋습니다. (: 모두 자연을 이용하여 가입 및 명시 적 INNER / OUTER JOIN 구문을 IE가) - 일관성있는 코드베이스 형식을 유지 나는 또한 혼합 구문을 사용하지 않는 것이 좋습니다.

  2. ==============================

    2.자연 조인에 대해 주장하는 것이 "트랩", 두 가지를 잘라. 당신은 모든이의 조인 것을 알고 B는 자연이 다음 작업을 완료, 가입의 경우 완전히이 테이블 B.와 결합에 사용되는 기대, 테이블 A에 새 열을 추가하자. 모든 명시 적으로 사용 용도에 가입하는 경우, 당신은 그들에게 모든 아래로 추적을 변경해야합니다. 미스 하나와 버그가 있습니다.

    자연 조인에 대해 주장하는 것이 "트랩", 두 가지를 잘라. 당신은 모든이의 조인 것을 알고 B는 자연이 다음 작업을 완료, 가입의 경우 완전히이 테이블 B.와 결합에 사용되는 기대, 테이블 A에 새 열을 추가하자. 모든 명시 적으로 사용 용도에 가입하는 경우, 당신은 그들에게 모든 아래로 추적을 변경해야합니다. 미스 하나와 버그가 있습니다.

    테이블의 의미는이 옳은 일이라고 제안 할 때 사용 NATURAL 조인. 당신은 확인이 특정 방식으로 이루어집니다 조인 확인하고자 할 때 사용 명시 관계없이 테이블 정의가 진화하는 방법의 기준을 가입 할 수 있습니다.

  3. ==============================

    3.완전히 나를 위해 자연을 파괴한다는 것은 내 테이블의 대부분이 의미 분명히 모든 다른 ID 항목을 가지고있다. 당신은 USER_ID를 갖는 ID보다 더 많은 의미가 있음을 주장 할 수 있지만, 당신은 user.user_id, DRY 위반 같은 것을 쓰고 끝. 또한, 같은 논리에 의해, 당신은 또한 (이 예를 들어, session_age, 다를 것 또한 종류의 차종의 관점에서 감지) 공포를 USER_FIRST_NAME, user_last_name, user_age 같은 열을 ... 것이다.

    완전히 나를 위해 자연을 파괴한다는 것은 내 테이블의 대부분이 의미 분명히 모든 다른 ID 항목을 가지고있다. 당신은 USER_ID를 갖는 ID보다 더 많은 의미가 있음을 주장 할 수 있지만, 당신은 user.user_id, DRY 위반 같은 것을 쓰고 끝. 또한, 같은 논리에 의해, 당신은 또한 (이 예를 들어, session_age, 다를 것 또한 종류의 차종의 관점에서 감지) 공포를 USER_FIRST_NAME, user_last_name, user_age 같은 열을 ... 것이다.

    내 가입 ... ON을 ... thankyouverymuch에 충실하겠습니다. :)

  4. ==============================

    4.나는 명시 적 명확성의 이유로 사용하고 쉽게에 "OUTER"로 전환이 요구 사항 변화해야 참가를 허가해야 조인하는 다른 포스터에 동의합니다.

    나는 명시 적 명확성의 이유로 사용하고 쉽게에 "OUTER"로 전환이 요구 사항 변화해야 참가를 허가해야 조인하는 다른 포스터에 동의합니다.

    그러나 대부분의 당신의 "함정"의와는 아무 상관 조인이 아니라 사용의 악은 "SELECT *"대신 명시 적으로 "SELECT a.col1, a.col2, b.col1, b.col2"필요로하는 열을 명명. 와일드 카드 열 목록이 사용될 때마다이 트랩이 발생합니다.

  5. ==============================

    5.하지 위의 답변 중 하나에 나와있는 여분의 이유를 추가. (하지 않도록이 다른 데이터베이스의 경우 경우)에는 열 이름이 자연을 사용하여 두 테이블간에 공통으로 발견되지 않으면 포스트 그레스에서 크로스가 수행 가입 후 가입. 그런 다음 기존 쿼리를했고 경우 이후에 테이블의 열 이름 중 하나를 변경할 수 있다고이 수단은 여전히 ​​쿼리보다는 오류를 반환 된 행 세트를 얻을 것입니다. 당신이 사용 ... 가입 사용 대신하는 경우 조인 C 럼이 더 이상 없었다 경우 (...) 구문 오류를 얻을 것입니다.

    하지 위의 답변 중 하나에 나와있는 여분의 이유를 추가. (하지 않도록이 다른 데이터베이스의 경우 경우)에는 열 이름이 자연을 사용하여 두 테이블간에 공통으로 발견되지 않으면 포스트 그레스에서 크로스가 수행 가입 후 가입. 그런 다음 기존 쿼리를했고 경우 이후에 테이블의 열 이름 중 하나를 변경할 수 있다고이 수단은 여전히 ​​쿼리보다는 오류를 반환 된 행 세트를 얻을 것입니다. 당신이 사용 ... 가입 사용 대신하는 경우 조인 C 럼이 더 이상 없었다 경우 (...) 구문 오류를 얻을 것입니다.

    포스트그레스 문서는이 효과에 메모를 가지고 :

  6. ==============================

    6.이 같은 구문을 의미합니까 :

    이 같은 구문을 의미합니까 :

    SELECT * 
      FROM t1, t2, t3 ON t1.id = t2.id 
                     AND t2.id = t3.id
    

    이 대 :

             SELECT *  
               FROM t1 
    LEFT OUTER JOIN t2 ON t1.id = t2.id 
                      AND t2.id = t3.id
    

    나는 2 구문을 선호하고 또한 다른 포맷 :

             SELECT *
               FROM T1
    LEFT OUTER JOIN T2 ON T2.id = T1.id
    LEFT OUTER JOIN T3 ON T3.id = T2.id
    

    이 경우, 내가 그들과 합류하기 위해 사용하고 절 ON 무엇을 테이블 내가 가입하고 무엇을 매우 분명하다. 첫 번째 구문을 사용하여 너무 쉽게 적절한에 넣지 조인과 거대한 결과 집합을 얻을. 내가 오타 경향이기 때문에 나는 이렇게,이은에 대한 내 보험입니다. 게다가, 그것은 디버깅 시각적으로 용이하다.

  7. from https://stackoverflow.com/questions/6039719/is-natural-join-considered-harmful-in-production-environment by cc-by-sa and MIT license