현재 데이터베이스 디자인에서는 여러 열 기본 키를 사용하여 각 항목에 임의의 키를 할당하는 추가 열을 만드는 대신 기존 데이터 (어쨌든 고유 한)를 사용합니다. 나는 이것이 허용된다는 것을 알고 있지만 이것이 조심스럽게 사용하고 피할 수있는 연습인지 궁금해하고 있었다 (C의 goto와 매우 비슷 함).
그렇다면이 접근법에서 볼 수있는 단점 중 하나 또는 단일 열 키를 원할 수있는 이유는 무엇입니까?
현재 데이터베이스 디자인에서는 여러 열 기본 키를 사용하여 각 항목에 임의의 키를 할당하는 추가 열을 만드는 대신 기존 데이터 (어쨌든 고유 한)를 사용합니다. 나는 이것이 허용된다는 것을 알고 있지만 이것이 조심스럽게 사용하고 피할 수있는 연습인지 궁금해하고 있었다 (C의 goto와 매우 비슷 함).
그렇다면이 접근법에서 볼 수있는 단점 중 하나 또는 단일 열 키를 원할 수있는 이유는 무엇입니까?
답변:
일반적으로 다중 열 기본 키가있는 테이블이있는 경우 자체 테이블로 승격 된 조인 테이블 (다 대다)의 결과이므로 고유 한 기본 키가 필요합니다. 모든 조인 테이블이 기본적으로 엔터티가되어야한다고 주장하는 많은 사람들이 있지만, 그것은 다른 날에 대한 토론입니다.
가상의 다 대 다 관계를 살펴 보자.
학생 * --- * 수업
(학생은 여러 수업에 참여할 수 있으며, 수업에는 여러 학생이있을 수 있습니다).
이 두 테이블 사이에는 StudentClass (또는 작성 방법에 따라 ClassStudent)라는 접합 테이블이 있습니다. 때때로, 당신은 학생이 수업에있을 때와 같은 것을 추적하고 싶어합니다. 따라서 StudentClass 테이블에 추가합니다. 이 시점에서 StudentClass는 고유 한 엔티티가되었으며 등록과 같이 인식 할 수있는 이름을 부여해야합니다.
학생 1 --- * 등록 * --- 1 수업
(학생은 많은 등록을 가질 수 있으며, 각 등록은 한 수업에 대한 것입니다 (또는 반이 많은 등록을 가질 수있는 반대 방향으로 가고, 각 등록은 한 학생에 대한 것입니다).
이제 지난해 화학 101 수업에 몇 명의 학생이 등록 했습니까? 아니면 Acme University에 다니면서 John Doe 학생은 어떤 수업에 등록 했습니까? 별도의 기본 키 없이도 가능했지만 등록을위한 기본 키가 있으면 이러한 등록에 대해 더 쉬운 쿼리를 얻을 수 있습니다 (ID 별).
엔터티가 PK를받을 자격이 있는지 여부를 결정하면 해당 엔터티에 대해 얼마나 많은 쿼리 (또는 조작)를 수행 할 것인지가 결정됩니다. 예를 들어, 수업 시간에 학생에게 완료된 과제를 첨부하려고한다고 가정 해 보겠습니다. 이 엔터티를 할당 할 논리적 장소 (지정)는 등록 엔터티에 있습니다. 등록하면 고유 한 기본 키로 할당 쿼리가 더 간단 해집니다.
별도의 ID 열을 갖는 것이 좋습니다. 데이터베이스 테이블에서 무언가를 얻으려면 다음을 수행하는 것이 더 쉽습니다.
SELECT whatever FROM table WHERE id=13
col1 = 'val1'AND col2 = 'val2'AND col3 = 'val3'어디서나 테이블에서 SELECT보다
예를 들어, 웹 애플리케이션에서 다음과 같은 URL로 변환됩니다.
www.somewebsite.com/somepage.php?id=13
또는 이와 같이 :
www.somewebsite.com/somepage.php?col1=val1&col2=val2&col3=val3
SELECT
쿼리 가 발생할 수 있습니다 . 그리고, B)는 , 당신이) 나쁜 프레임 워크를 사용하여 작업하는 경우가 아니면이 실제로 (URL 요구 사항의 모든 종류의 원인이 어떻게 어떤 생각이 없습니다. 내 URL에는 쿼리 문자열이 포함 ?id=13
되어 있지 않습니다 ?col1=val1&col2=val2&col3=val3
.
기본적으로 대리 키 또는 자연 키를 사용해야하는지 묻습니다 (이 경우 복합 자연 키 처럼 들립니다 ). 다음은 훌륭한 기사입니다. http://www.agiledata.org/essays/keys.html
대리 키는 DB의 수명 동안 관리를 단순화하기 때문에 선호합니다. 키 변경이 의미가 바뀌는 의미에 대해 걱정할 필요가 없습니다. 이는 절대 발생하지 않아야하지만 인간이 관여하는 실제 시스템에서는 발생하지 않습니다. 그러나 DB에 많은 "조회"테이블이있는 경우 (예 : 기본적으로 키 : 값 쌍인 테이블) 대리 키는 의미있는 결과를 얻기 위해 해당 테이블을 쿼리에 조인해야하기 때문에 번거로울 수 있습니다.
예를 들어 주소와 국가라는 두 개의 엔터티가 있다고 가정합니다.
select * from Address where CountryCode = 'US'
select Address.* from Address join Country on Address.CountryID = Country.ID where Country.Code = 'US'
자연 키가 너무 자주 변경되지 않는다고 확신하면 조회 테이블에 대한 자연 키와 다른 모든 항목에 대한 자연 키를 위임하는 것이 편안합니다.