2010-08-08 2 views
7

작은 응용 프로그램을 만들고 테이블 간의 외래 키 관계를 설정하고 있습니다. 그러나 나는 정말로 이것을 왜 필요로하는지 혼란 스럽다. 이점은 무엇입니까 - 조인을 수행 할 필요가없는 쿼리를 작성할 때 도움이됩니까?외래 키 - 그들이 나를 위해 무엇을합니까?

+-------------------+ 
| USERS    | 
+-------------------+ 
| user_id   | 
| username   | 
| create_date  | 
+-------------------+ 

+-------------------+ 
| PROJECTS   | 
+-------------------+ 
| project_id  | 
| creator   | 
| name    | 
| description  | 
+-------------------+ 

users 사이의 키 관계가있다 : 여기 내 데이터베이스의 예 조각입니다. user_idprojectscreator

이렇게 쿼리를 수행 할 수 있습니까? MySQL의 이후

SELECT * FROM PROJECTS WHERE USERS.username = "a real user";

는 테이블 사이의 관계를 알아야합니까? 그렇지 않다면 데이터베이스 설계에서 외래 키의 실제 기능은 무엇입니까?

+0

http://dba.stackexchange.com/으로 마이그레이션해야합니까? – simgineer

+0

아니요, 아마도 그렇지 않습니다. 해당 사이트가 존재하기 전에 질문을 받고 답변되었습니다. 마이그레이션에는 실질적인 이점이 없습니다. –

답변

16

외부 키는 참조 무결성을 제공합니다. 외래 키 열의 데이터는 유효합니다.이 값은 외래 키에 정의 된 테이블 & 열에 이미 존재하는 값일 수 있습니다. "나쁜 데이터"를 멈추는 데는 매우 효과적입니다. 숫자, ASCII 텍스트 등 사용자가 원하는대로 입력 할 수 없습니다. 즉, 데이터가 정규화되었음을 의미합니다. 반복되는 값이 식별되어 자체 테이블에 격리되어 있으므로 더 이상 걱정할 필요가 없습니다. 텍스트에서 대소 문자를 구분하는 것에 대해 ... 그리고 그 값은 일관성이 있습니다. 이것은 다음 부분으로 이어집니다 - 외래 키는 테이블을 함께 결합하는 데 사용됩니다.

사용자가 수행 한 프로젝트에 대한 사용자 쿼리가 작동하지 않습니다. 쿼리에 테이블에 대한 참조가 없을 때 USERS 테이블의 열을 참조하고 있고, 연결하기 전에 해당 정보를 얻는 데 사용되는 하위 쿼리가 없습니다. 테이블에 PROJECTS. 실제로 사용하는 것은 다음과 같습니다.

SELECT p.* 
    FROM PROJECTS p 
    JOIN USERS u ON u.user_id = p.creator 
WHERE u.username = 'John Smith' 
+0

고마워요 - 이걸로 조인스의 방법을 얻을 수있을 것 같았습니다. –

0

각 사용자가 정확히 하나의 프로젝트에 속해 있고 각 프로젝트가 한 명의 사용자 만 exatctly에 속해 있다면 테이블이 일대일 관계를 갖고 사용자 간의 주요 관계가 있다고합니다 .user.id와 projects.project_id는 괜찮습니다. 아마 표준이 아니다).

그러나 사용자가 많은 프로젝트에 속할 수 있거나 프로젝트에 많은 사용자가있을 수있는 경우 일대 다 관계가 있으며 외래 키가 필요합니다.

프로젝트가 많은 사용자를 가질 수 있고 사용자가 많은 프로젝트에 속할 수있는 경우에는 다 대다 관계를 가지며 더 정교한 모델이 필요합니다.

+0

외래 키를 만들지 않고 데이터베이스 디자인을 많이 설정했으며 일대 다 관계를 사용했습니다. 나는 외계 키가 나를 위해 무엇을하는지 알고 싶다. 나는 그들 없이는 할 수 없다. –

+0

위의 테이블 레이아웃을 감안할 때 project_id = 1의 일부인 모든 사용자를 얻으려면 SQL 문은 무엇이 될까요? – EddieC

+1

@Marco Ceppi : 외래 키를 사용하지 않고 관계를 모델링했지만 사용자가 관계를 나타내는 열과 관련이없는 데이터를 입력하는 것을 막을 수있는 방법은 없습니다. –

4

기본적으로 더 이상 기능을 제공하지 않습니다. 데이터 모델의 참조 무결성을 손상시키는 삽입 또는 업데이트를 중지합니다.

제 생각에 또 다른 중요한 측면은 데이터 모델을 사용하는 다른 개발자와 데이터 모델을 통신한다는 것입니다. 필자는 종종 테이블이 데이터 모델이 어떻게 한 눈에 어울리는지 알 수있는 외래 키를 살펴 보았습니다.

+2

데이터 유효성 검사가 기능이라고 말하고 싶습니다. 외래 키 제약은 steriod에 대한 CHECK 제약과 같습니다. CHECK 제약 조건은 데이터의 유효성 만 검사합니다. 외래 키는 데이터 유효성 검사 외에 관련 관계에 관련 정보를 추가 할 수 있음을 의미합니다. –

3

조인을하지 않으면 외래 키가 필요하지 않습니다.

생각 해보니 조인을하지 않으면 관계형 데이터베이스가 필요하지 않습니다! (작은 농담) 진지하게, 하나 이상의 테이블을 가지고 있다면, 조인을 사용하는 방법과 스키마에 외래 키를 디자인하는 방법을 배우는 것이 좋습니다.

이전 대응자가 말한 것처럼 외부 키는 참조 무결성을 강화합니다. 참조 무결성이 없으면 조인은 신비한 결과를 낳습니다.


이전의 질문에 대한 답은 그 질문의 진정한 질문에 유의하지 않았습니다. 내가 대답 한 질문은 "SQL 스키마에 외래 키가있는 이유"이며 "조인을 수행하기 위해"라는 대답입니다. 하지만이 질문을 다시 읽으면 "SQL이 연결을 알면 SQL이 왜 나를 위해 조인을 할 수 없느냐"는 훨씬 더 미묘한 질문을 이해할 수 있습니다. 이것은 정말로 좋은 질문입니다. 위의 것보다 더 좋은 대답을 할 자격이 있습니다.

엔진이 조인 조건을 제공하는 언어가 가능합니다. Microsoft Access의 그래픽 쿼리 디자인 도구 만 살펴 봐야합니다. 모든 intertable 관계를 Access에 선언하면, 다시 결합 조건을 지정하지 않고 여러 테이블에서 데이터를 가져올 수 있습니다. 액세스하면 자동으로 수치가 표시됩니다.

Access에서 두 테이블 쿼리를 작성한 다음 SQL 뷰로 전환하면 Access에서 실제로 조인 조건으로 조인을 만들었습니다. 이러한 기능은 문자 기반 언어에서도 가능하지만 SQL은 그러한 언어가 아닙니다.

많은 프로젝트가 한 명의 사용자에게 속할 수 있다는 점에 유의하십시오. 따라서 Users는 Project가 아닌 위 스키마의 "참조 테이블"입니다. 더 쉬운 자동 탐색 방향은 다른 방법이 아닌 참조 테이블에서 자동으로 검색 될 것이라고 기대합니다. 다음 제공 할 수있는 외래 키 제약 조건을 사용하여

+0

몇 년 후, 많은 사람들이 선언 된 외래 키 제약 조건이있는 열만을 참조하기 위해 "외래 키"라는 용어를 사용하는 것으로 나타났습니다. 나는 OP가 그런 의미인지 확신 할 수 없다. 몇 년 전에이 사실을 알았을 때 외래 키는 그것이 선언되었는지 아닌지에 관계없이 외래 키였습니다. 선언되지 않은 외래 키는 참조 무결성을 깨뜨린 것입니다. 이것은 성능상의 차이점을 가려냅니다. –

2

:

  • 방지 일치하지 않는 키
  • 방지 자동 (CASCADE 삭제 ON으로) 고아 행을 삭제하여 일치하지 않는 데이터를 포함하는 데이터베이스를 방지하여 일치하지 않는 데이터를 포함하는 데이터베이스
  • 는 엄마 아니에요 물론 어떤

에 외래 키 인 열 미래의 개발자들에게 문서로 봉사 이러한 일을하는 데 도움이되지만 시간이 지남에 따라 코드 품질을 향상시킬 가능성이 있습니다. 일에 엄격한 것은 일반적으로 좋습니다 - 테스트에서 더 많은 오류가 발생합니다 (따라서 생산량이 적음)