27

기본 키가 user_id 인 테이블 1과 user_id이 외래 키인 테이블 2가 있습니다.MySQL - 기본 키로 외래 키 사용

표 2에는 user_id 당 1 개의 레코드 만 존재할 수 있으며 레코드 없이는 레코드가 존재할 수 없습니다.

질문 : 표 2의 user_id은 동시에 외국 및 기본 키일 수 있으며, 그렇다면 찬성/반대가 무엇입니까?

+0

비슷한 질문 (중복되지 않음) : [MySQL에서 기본 키인 외래 키를 작성하는 방법] (http://stackoverflow.com/questions/5575051/how-to-create-foreign-key) -that-is-a-primary-key-in-mysql) – naXa

답변

32

예,이 작업을 수행 할 수 있으며 데이터베이스 디자인 관점에서 수행해야합니다.

그러나 user_id이 테이블 2의 기본 키인 경우 의미를 고려하십시오. 실제로 테이블 2의 각 행은 사용자에 해당하지만 각 행이 사용자에 해당하는 테이블을 가지고 있다고 말합니다. "왜 테이블 2의 모든 데이터를 테이블 1의 널 (NULL) 입력 가능 컬럼에 넣지 않는가?"라는 질문이 제기됩니다. 결국 두 테이블을 사용한다는 것은이 데이터를 얻기 위해 두 개의 쿼리를 만들어야한다는 것을 의미합니다.

이제 이러한 관행은 좋은 생각이 될 수있는 몇 가지 시나리오가 있습니다 : 당신이 많은 사용자 만 표 2에서 몇 행이있을 경우

  • 는, 표 2에 아마 쿼리는 거의 수행되지 않습니다 ; 동시에 테이블 1의 저장 공간 및 수정 속도를 얻습니다.
  • 외래 키가 남아있는 동안 앞으로 테이블 2의 기본 키가 변경 될 수 있습니다. 테이블 1에 모든 데이터를 입력하면이 수정으로 인해 데이터베이스 모델이 손상 될 가능성이 높습니다.

이것은 좋은 생각 일 수 있지만 응용 프로그램의 세부 사항에 달려 있습니다.

+2

고마워요. 필자가 언급 한 첫 번째 시나리오는 테이블 2에 많은 열이 있고 테이블 3, 4 등이 테이블 1과 비슷한 관계에 있으므로 모든 열을 너무 많이 넣을 수 있습니다. – CodeVirtuoso

+5

이것이 의미있는 한 가지 상황은 [클래스 테이블 상속] (http://stackoverflow.com/a/3579462/1709587)을 사용하고 있고 표 2가 표 1의 하위 클래스를 나타내는 경우입니다. 첫 번째 탄환의 경우입니다. –

+0

또 다른 이유는 테이블 C의 열을 공유하는 두 개의 다른 테이블 인 테이블 A와 테이블 B가있는 경우입니다. 예를 들어 Contacts라는 테이블과 Employees 테이블, People이라고하는 테이블이 있습니다. 사람들은 성, 성 등을 가지며 연락처와 직원은 모두 사람을 대표합니다. –