WHERE를 사용할 수 있는데 왜 외부 키를 사용해야 합니까?
MySQL의 외래 키에 대한 초보자 질문입니다.
w3 학교에서는 다음과 같이 말합니다.
한 테이블의 외부 키는 다른 테이블의 기본 키를 가리킵니다.
그리고 WHERE도 있고,
WHERE id = page_id
그렇다면 테이블을 연결하는 데 WHERE를 사용할 수 있다면 외부 키를 갖는 주된 목적은 무엇입니까?
이것은 질문에 꼭 필요한 것은 아닙니다. 사실입니다.다음과 같은 몇 가지 이유로 인해 존재합니다.
- 아무 것도 가리키지 않는 것을 삽입하는 것을 막기 위한 테이블의 제약으로서;
- 옵티마이저를 위한 단서로서; 그리고.
- 역사적인 이유로 어디에 있는지가 더 필요했습니다.
아마 세 가지 중 중요한 것일 겁니다이를 참조 무결성이라고 합니다.즉, 외부 키에 값이 있으면 해당 값을 기본 키로 하는 레코드가 상위 테이블에 있습니다.
즉, 모든 데이터베이스가 참조 무결성(예: MySQL/MyISAM 테이블)을 지원하는 것은 아니며 반드시 참조 무결성을 강제하지는 않는 데이터베이스(성능상의 이유)도 지원합니다.
외래어는 참조 무결성에 사용됩니다.
자세한 내용은 MySQL의 외부 키 및 참조 무결성 소개를 참조하십시오.
그렇다면 테이블을 연결하는 데 WHERE를 사용할 수 있다면 외부 키를 갖는 주된 목적은 무엇입니까?
ㅠㅠWHERE
절은 외부 키의 equijoin에만 국한되지 않습니다.
예를 들어, 가격 범위와 할인을 설명하는 표가 있는 경우 다음과 같은 복잡한 조건을 사용하여 표를 결합합니다.
SELECT *
FROM Goods
JOIN PriceRange
ON PriceRange.Price =
(
SELECT MAX(Price)
FROM PriceRange
WHERE PriceRange.Price <= Goods.Price
)
이러한 테이블을 외부 키 관계와 연결할 수는 없지만 쉽게 가입할 수 있습니다.
자세한 내용은 블로그의 다음 항목을 참조하십시오.
그러나 pk-to-pk 바인딩은 여전히 중요합니다.FOREIGN KEY
연결 중인 엔터티가 관계형 모델에 의해 설명되도록 할 수 있습니다.
과 함께FOREIGN KEY
-백업 설계, 당신은 다음의 엔티티와 관계를 선언할 수 없습니다.PRIMARY KEY
해당 엔티티를 설명하는 표에 없습니다.
SQL Server
에서는 이러한 사실을 고려하여 특정 유형의 쿼리를 최적화할 수도 있습니다.
예: 이 쿼리:
SELECT f.*
FROM t_foreign f
WHERE f.pid IN
(
SELECT id
FROM t_primary p
)
조차 하지 않을 것입니다.t_primary
FOREIGN KEY
는 사에관계정다니됩의가이 사이에서 됩니다.t_foreign
그리고.t_primary
.
자세한 내용은 이 문서를 참조하십시오.
참조 무결성 및 인덱싱 유지
외부 키 제약 조건은 테이블 간의 링크를 삭제하는 작업을 방지하는 데 사용됩니다.
또한 외래 키 제약 조건은 잘못된 데이터가 가리키는 테이블에 포함된 값 중 하나여야 하므로 외래 키 열에 삽입되는 것을 방지합니다.
WHERE 절의 주요 목적은 쿼리에 의해 반환되는 행을 제한하는 것입니다.SELECT 구문을 참조하십시오.
기본 키/외부 키 관계는 참조 무결성을 유지하고 적절한 인덱싱을 통해 쿼리의 성능을 향상시킵니다.(위의 Pete Ohanlon 설명 및 JOIN 유형 참조)
RESTRICT 연산자(WHERE)는 참조 제약 조건과 아무런 관련이 없습니다!
C.J. 다테의 관계형 데이터베이스 사전에서 인용한 것
외부 키 R1과 R2가 반드시 구별되는 것은 아닌 relvars이고 K가 R1의 키라고 합니다.K를 K'(예: K')로 매핑하는 속성 이름 변경의 빈 시퀀스가 존재하도록 FK를 R2 머리글의 하위 집합으로 지정합니다. 여기서 K'와 FK는 정확히 동일한 속성을 포함합니다.그렇다면 FK는 외부 키입니다.
참조 무결성 느슨하게는 해당 참조 튜플이 존재하지 않는 경우 참조 튜플이 존재하지 않도록 허용하는 규칙입니다.보다 정확하게, FK가 일부 참조 relvar R2에서 어떤 외래 키라고 가정하고, K가 해당 참조 relvar R1에서 해당 키라고 가정하고, K'가 외래 키 아래에 설명된 대로 K에서 파생되도록 합니다.그러면 참조 무결성 규칙은 문제의 시점에 R1의 일부(필수적으로 고유한) 튜플에 대한 K' 값이 아닌 FK 값이 R2에 존재하는 시간이 절대 없어야 한다고 요구합니다.여기서 R1과 R2는 각각 참조된 relvar와 참조된 relvar이며, 이들 사이의 제약은 참조 제약입니다.
예:relvar SP에서,{S#}
그리고.{P#}
는 키 키에해는외키입니다부하당▁keys▁keys에 키입니다.{S#}
그리고.{P#}
각각 S와 P와 관련이 있습니다.참조된 relvar에서 지정된 외부 키에 해당하는 키는 특별히 기본 키일 필요는 없습니다.
제가 당신의 데이터베이스에 주요 관계를 추가해야 하는 또 다른 좋은 이유가 있습니다.이 정보를 사용하여 데이터베이스에서 개체 모델을 생성하는 다양한 코드 생성기가 있습니다.일반적으로 사용되는 주목할 만한 패턴 중 하나는 ActiveRecord 패턴입니다.키 관계가 없으면 ActiveRecord 패턴은 데이터베이스 엔티티가 어떻게 관련되어 있는지 알 수 없으므로 훨씬 덜 유용한 개체 모델을 생성합니다.
코드 생성이 모든 소프트웨어 프로젝트에 적합한 것은 아닙니다.하지만 많은 프로젝트에 도움이 됩니다.만약 당신이 코드 생성을 사용하지 않는다면, 당신은 적어도 그것을 조사할 의무가 있습니다.
외부 키는 참조 무결성을 유지하는 데 사용되는 반면 WHERE 절은 선택과 같은 SQL 작업에서 테이블을 함께 조인하는 데 사용됩니다.where 절은 여러 테이블에 걸쳐 작동할 수 있지만 필터로만 존재합니다.
엄밀히 말하면, 당신은 참조 무결성 없이 벗어날 수 있지만, 그것은 좋은 생각이 아닙니다.참조 무결성이 없으면 관계 체인의 한쪽 끝에 있는 데이터에 영향을 미치는 무언가를 잘못 삭제하거나 업데이트하지 않는 클라이언트 애플리케이션에 의존하게 됩니다. 예를 들어 키 값을 변경하여 키 값이 존재하지 않는 것을 가리킵니다.
참조 무결성은 관련 데이터가 일관된 방식으로 유지되도록 보장하는 좋은 방법입니다.
일단은.좋은 질문!!
MySql은 RDBMS - Relational DBMS이므로 모든 엔티티(테이블)는 열로 연결됩니다.
직원 - EMPID EMPNAME DEPTID
부서 - DEPTID DEPTNAME
DEPTID는 EMPRYENT 테이블에서 Foreign 키이고 DEPARTY 테이블에서 Primary 키입니다.
이 관계는 미래에 검색하기 쉬운 방식으로 데이터를 구조화하기 위한 고려 사항 또는 일종의 설계일 뿐인 객체의 가상 관계입니다.물리적 관계가 아님(프로그래밍 언어이기 때문에)
해당 데이터를 검색하려면 SQL 작성자가 설명한 구문이 거의 필요하지 않습니다.
직원에서 *를 선택
부서에서 * 선택
직원 중에서 선택 *(DEPTID = 5)
여기서 우리는 우리의 설득력을 위해 두 개의 테이블을 가상으로 구현했지만, 필요한 결과를 위해 이 구문을 사용했습니다. DEPTID = 5.
언급URL : https://stackoverflow.com/questions/1907325/why-do-i-need-to-use-foreign-key-if-i-can-use-where
'programing' 카테고리의 다른 글
Brew Services: 구성을 편집할 위치? (0) | 2023.07.23 |
---|---|
스프링 부트 2.5.0 및 잘못된 정의예외: Java 8 날짜/시간 유형 'java.time.Instant'는 기본적으로 지원되지 않습니다. (0) | 2023.07.23 |
파이썬에서 다른 클래스 내에서 클래스를 정의하면 이점이 있습니까? (0) | 2023.07.23 |
Spark Dataframe은 중복된 이름을 가진 열을 구분합니다. (0) | 2023.07.23 |
데이터 프레임의 여러 데이터 그룹을 하나의 그림으로 표시하는 방법 (0) | 2023.07.23 |