문제

여기서 우리가 다시,오래된 인수가 여전히 발생하...

우리는 더 나은 비즈니스 핵심 기본 키로나 우리는 오히려 대리 id(i.eSQL Server id)가진 독특한 제약 조건이 비즈니스에 키 필드?

십시오를 제공,예나 증거를 지원하는 이론입니다.

도움이 되었습니까?

해결책

니다.귀하의 케이크와 그것을 먹는다.

을 기억하는 특별한 것은 아무것도 없에 대한 기본 키의 것을 제외하고는 표시 등.그것보다 더 아무것도하지 않 NULL 독특한 제약 조건,그리고 테이블이 있을 수 있습니다.

를 사용하는 경우 대리 키에,당신은 여전히 원하는 비즈니스 핵심 고유성을 보장하도록에 따라 사업 규칙이 있습니다.

다른 팁

몇 가지 이유로 사용하기 위한 대리 키:

  1. 안정성:변화하는 핵심기 때문에 사업이나 자연의 필요에 부정적인 영향을 미칠 것입니다 있습니다.대리 키는 거의 경우,적,변경할 필요가 없기 때문이 있음을 의미합니다.

  2. :할 수 있습을 표준화 기본 키를 열 이름 지정 규칙을 생각에 가입하는 방법에 대한 테이블과 함께 다양한 이름이 그들의 PKs.

  3. 속도:에 따라 PK 값과 유형,대리 키의 정수 작을 수 있고,빠르게 인덱스 검색입니다.

그것은 나는 아무도 아직 아무 말도에서의 지원이 아닌 대리(I 하는 것을 망설이 말하는"자연적인")키를 사용합니다.그래서 여기...

A 단점 의 대리 키가는 그들은 무의미 (인용으로 활용하여 일하지만,...).이 때로는 힘 당신은 참여 더 많은 테이블을 쿼리를 보다 정말 필요합니다.Compare:

select sum(t.hours)
from timesheets t
where t.dept_code = 'HR'
and t.status = 'VALID'
and t.project_code = 'MYPROJECT'
and t.task = 'BUILD';

에 대하여:

select sum(t.hours)
from timesheets t
     join departents d on d.dept_id = t.dept_id
     join timesheet_statuses s on s.status_id = t.status_id
     join projects p on p.project_id = t.project_id
     join tasks k on k.task_id = t.task_id
where d.dept_code = 'HR'
and s.status = 'VALID'
and p.project_code = 'MYPROJECT'
and k.task_code = 'BUILD';

지 않는 한 사람이 심각하게 생각하는 다음과 같은 좋은 아이디어?:

select sum(t.hours)
from timesheets t
where t.dept_id = 34394
and t.status_id = 89    
and t.project_id = 1253
and t.task_id = 77;

"그러나"사람이 말할 것이다,"무슨 일이면 코드에 대한 하위 또는 유효한 또는 HR 변화?" 는 나의 대답은 다음과 같습니다:"왜 당신 하나요?" 이러한지 않은""자연적인 열쇠는 의미에서 어떤 외부의 몸을 법률을 제정하는 이제부터는'올바른'해야 re-coded as'GOOD'.단지 작은 비율의"자연적인"키를 정말로 떨어지는 종류-주민번호 Zip 코드는 일반적인 예입니다.나는 확실히 사용하는 의미가 없는 숫자 키에 대한 테이블과 같은 사람,주소지 모든 것, 어떤 이유로 대부분의 사람들이 여기 것동을 목격하며 감동받습니다.

도 참조하십시오: 내 응답을 다른 질문

대리 키(일반적으로 정수)의 부가가치의 당신의 테이블에 관계는 더 빨리,그리고 경제에서 저장소 및 업데이트 속도(더 나은,외국 열쇠가 필요하지 않 업데이트할 때 사용자에게과는 대조적으로,비즈니스 핵심 분야,하는 변화는 지금과 다음).

테이블의 기본 키가 있어야 식별에 사용되는 유일하게 행는 주로 가입에 대한 목적입니다.생각하는 사람 테이블:이름 변경할 수 있습니다,그들은 보장하지 않는 유일하다.

생각하는 회사:당신은 행복한 Merkin 회사 사업과 함께 다른 회사에서 Merkia.당신은 영리한 충분히 사용하지 않는 회사 이름을 기본 키로,그래서 당신이 사용하 Merkia 정부 고유의 회사 ID 전체의 10 영숫자 문자만 사용할 수 있습니다.다음 Merkia 변경하는 회사 Id 를고 생각하기 때문에 그들은 그것은 것은 좋은 생각이 아니다.그것의 확인을 사용하여 db 엔진의 계단식 업데이트 기능에 대한 변경하지 않아야에 당신을 포함하는 첫 번째 장소입니다.나중에,당신의 사업을 확장하고 지금은 당신과 함께 일하는 회사에서 Freedonia.Freedonian 회사 id 는 최대 16 개의 문자입니다.필요할을 확대하는 회사 id 를 기본 키(또는 외국에서는 주문,문제 MoneyTransfers 등),추가하는 국가에서 필드의 기본 키(또는 외국에서 열쇠).Ouch!남북 전쟁에서 Freedonia,그것은 분할에서 세 개의 국가.국가의 이름을 연관 변경해야 새로운 하나;캐 업데이트합니다.BTW,어떤 당신의 기본 키?(국가,합의 경우)또는(하려면,국가)?후자는 데 도움이 결합,전자 피하는 또 다른 인덱스(또는 아마 많은,당신은 당신의 명령 그룹에 의해 국가 너무).

이러한 모든 증거하지 않지만,지시하는 대리 키를 고유하게 식별하기 위한 행 포함하여 모든 사용자,조인 작업하는 것이 바람직하는 비즈니스 키입니다.

대리 키지 않는 이유가 있을 변경합니다.내가 말할 수 없는 같은 자연에 대한 키를 사용합니다.마지막 이름,이메일,ISBN nubmers-그들은 모든 변경할 수 있습니다.

I hate 대리 키에 일반적입니다.그들만 사용해야 합 없는 경우 품질 자연적인 키를 사용할 수 있게 합니다.그것은 오히려 터무니없는 당신이 그것에 대해 생각하면 생각하는,추가하는 무의미한 데이터를 테이블을 만들 수 있습니다.

여기에는 나의 이유:

  1. 을 사용할 때 자연 키 테이블을 클러스터에 있는 그들은 대부분의 검색 따라서 쿼리를 만들기 더 빠르다.

  2. 할 때 사용자에게 추가해야 합니다 고유한 인덱스에서 논리 키를 열이 있습니다.당신은 여전히을 방지하기 위해 필요 논리적 데이터 중복.예를 들어,당신은 당신을 허용할 수 없 두 개의 조직으로 동일한 이름에서 조직 테이블도 pk 대리 id 열입니다.

  3. 때 대리 키는 기본 키로 사용 그것은 훨씬 적은 무엇인지 명확하게 자연의 기본 키가 있다.을 개발할 때 당신은 무엇을 알고 싶어 세트의 열을 만들 테이블의 독특한입니다.

  4. 에서 하나 관계 체인점,논리 키 체인입니다.그래서 예를 들어,조직이 여러 계정하고 계정에는 많은 송장을 이메일로 보낼 수 있습니다.그래서 논리-key 의 조직이 OrgName.논리-주요 계정 OrgName,계정 id.논리-key 의 송장 OrgName,계정 id,InvoiceNumber.

    때 대리 키는 사용되면,열쇠 고리가 잘리만을 외국 열쇠를 즉각적이 부모입니다.예를 들어,송장이 없 OrgName 열입니다.그것은 단지에 대한 열 계정 id.하려는 경우 검색에 대한 송장의 특정 조직에 가입 할 필요가 조직,계정 및 송장 테이블이 있습니다.당신이 사용하는 경우 논리적이,키를 다음을 쿼리할 수 있습니다 조직 테이블을 직접 있습니다.

  5. 저장 대리 키의 값을 조회 테이블 테이블을 가득 채워야 할 의미가 정수입니다.데이터를 보려면 복잡한 전망을 만들어야 하는 가입하는 모든 조회 테이블이 있습니다.조회 테이블은 의미를 개최하의 설정에 허용되는 값에 대한 열입니다.그것은 성문화하여 저장하는 정수 대리 키를 대신 합니다.거기에 아무것도 정규화하는 규칙을 해야하는 것이 좋 대리점 정수 값 대신 자체입니다.

  6. 나는 세 가지 서로 다른 데이터베이스의 책입니다.지 하나 그들의 대리 키를 사용하는 방법을 보여 줍니다.

저는 경험을 공유하고 싶으로 당신은 이 무한 전쟁:D 에 대 대리 키 딜레마입니다.내 생각에는 모두 대리 키(인공적인 자동 생성하는 것)천연 키(의 구성 칼럼(s)도메인을 의미)가 장점단점.그래서 당신의 상황에 따라서,그것을 좀 더 관련성이 있는 선택 방법 중 하나 또 다른합니다.

그것은 보인다는 많은 사람들이 현재 사용자에게로의 거의 완벽한 솔루션과 자연 키를 전염병이,내가에 초점을 다른 관점의 인수:

의 단점 대리 열쇠

대리 키는 다음과 같습니다.

  1. 성능 문제의 원인:
    • 그들은 일반적으로 구현을 사용하여 자동으로 증가 열을 의미:
      • 라운드 여행을 데이터베이스의 각 시간에 당신을 얻고 싶은 새로운 Id(내가 알기에는 이를 개선할 수 있 캐싱 기능을 사용하거나[seq]hilo 모두 알고리즘은 아니지만 아직도 그 방법들이 자신의 단점).
      • 면 하루를하는 데 필요한 데이터를 하나의 스키마 다른(그런 일이 매우 정기적으로 회사에서에서 이상)다음이 발생할 수 있습 Id 충돌 문제입니다.그리고 네가 나를 사용할 수 있다는 것을 알고 있 Uuid 하지만 그 지속가 필요합 32 진수 숫자!(당신이에 대한 데이터베이스 크기는 그것이 문제가 될 수 있습).
      • 중 하나를 사용하는 경우 시퀀스에 대한 귀하의 모든 사용자에게 다음에 대한 것이 끝날 경쟁에서 당신의 데이터베이스입니다.
  2. 오류가 발생하기 쉽습니다.시퀀스는 max_value 도록 제한-개발자라-당신은 관심을 두면 다음 포인트:
    • 해야 합니다 사이클 시퀀스(면 최대 값에 도달을 1,2,...).
    • 을 사용하는 경우에는 시퀀스로 주문(시간)데이터의 처리해야 합 케이스의 자전거(열 Id1 될 수 있습보다 새로운 행 Id 최대 값은-1)입니다.
    • 는지 확인 코드(심지어는 클라이언트 인터페이스는이 발생하지 않아야 합니다 그것이 있어야 내부 Id)를 지원합 32/64 비트는 정수를 저장하는 데 사용되는 당신의 순서의 값이다.
  3. 그들은 보장하지 않는 비 중복 데이터입니다.항상 확인할 수 있습니다 2 행으로 모든 동일한 열 값만으로 다른 생성되는 값입니다.나를 위해 이 의 문제가자에게 데이터베이스에서 디자인의 관점입니다.
  4. 더 많은 위키피디아...

신화에서 천연 키

  1. 복합 키가 적은 비효율적인 것보다 대리 키를 사용합니다.No!따라 달라집에 사용되는 데이터베이스 엔진:
  2. 자연 키 존재하지 않는 실제 생활에서.죄송하지만 그들은 존재!항공 업계,예를 들어,다음과 같은 튜플 될 것입니다 항상 독특한어 예약 항공편(항공,departureDate,flightNumber,operationalSuffix).더 일반적으로,때 집합의 비즈니스 데이터가 유일하도록 보장된 식별자에 의해 주어 그런 다음 데이터의 집합은[좋은 자신이 키자입니다.
  3. 자연의 열쇠"을 오염시키 스키마가"아이의 테이블이 있습니다.나를 위해 이것은 더 많은 느낌보다는 실제 문제입니다.는 4 열에 기본 키의 각 2 바이트는 것이 더 효율적일 수 있습니다 보다는 하나의 열 11 개의 바이트입니다.이 4 열의를 쿼리하는 데 사용할 수 있는 아이 테이블을 직접(이용하여 4 열에 where)에 가입하지 않고 부모 테이블.

결론

사용 천연 키 때 그것은 마 관련된 그래서 그 사용자에게 할 때 사용하는 것이 좋다.

는 희망이었다.

항상 사용하여 키가 없는 비즈니스 의미입니다.그냥 좋습니다.

편집:었을 찾으려고 노력에 대한 링크를 온라인으로 그것이지만,나는 할 수 없었습니다.그러나서 '패턴의 기업 Archtecture' [파울러]그것은 좋은 설명 사용하지 말아야 하는 이유 이외의 다른 키를 아무 의미되는 이외의 다른 핵심입니다.귀결한다는 사실 하나를 가지고 있어야 하 작업에만 적용됩니다.

대리 키가 있는 경우 매우 편리하게 사용할 계획인 ORM 도구를 처리/생성하는 데이터의 클래스입니다.하는 동안 사용할 수 있는 복합 키의 일부와 함께 고급 매퍼(read:hibernate),그것은 몇 가지를 추가하려면 복잡성의 코드입니다.

(물론,데이터베이스를 순수 주장할 것입 심지어는 개념 대리의 핵심은 가증한 것.)

나의 팬을 사용하여 액체를 위한 대리 키우 적합합니다.중요한 승리는 그들은 당신이 알고있는 키에 사전 예:을 만들 수 있습니다 클래스의 인스턴스 ID 가 이미 설정하고 유일하도록 보장된 식별자는 반면,말,정수 키해야 합니다 기본적으로 0-1 업데이트를 적절한 값을 저장할 때/업데이트합니다.

체가 처벌의 관점에서 조회 및 가입하속도에 따라 응용 프로그램에서 질문지 그들이 바람직합니다.

를 사용하여 대리 키은 더 나은 내 생각에 있으로 그것의 기회가 변화하고 있다.거의 아무것도 생각할 수 있는 사용할 수 있습니다 자연으로 열쇠 변경될 수 있습(면책 조항:항상 진실하다,그러나 일반적으로).

예 될 수 있는 DB-자동차의 첫 눈에 당신을 생각할 수 있는 라이센스 플레이트로 사용할 수 있습의 열쇠입니다.하지만 이러한 변경 될 수 있도록 될 것 나쁜 생각이 아니다.상이 정말로 원하는 것을 발견 밖으로 후에 를 해제용할 때,사람을 알고 싶은 왜 그들이 바꿀 수 없는 그들의 번호판을 자신의 빛나는 새로운 개인화된 하나입니다.

항상 사용 단일 컬럼,대리 키우면에서 모두 가능합니다.이 조인뿐만 아니라 삽입 업데이트//삭제 많기 때문에 당신이에 대해서만 책임이 추적을 하나의 조각의 정보를 유지합니다.

그런 다음 필요한 대로,스 귀하의 비즈니스 키라 고유의 제약 조건이나 인덱스입니다.이 당신을 유지하는 데이터 무결성을 그대로 유지됩니다.

비즈니스 로직/자연적인 열쇠 변경할 수 있습니다,하지만 phisical 키 테이블의해야하는 결코 변하지 않습니다.

에 데이터 웨어하우스 시나리오 나는 믿어 나를 따르 대리 열쇠 경로입니다.두 가지 이유:

  • 당신은 당신의 독립적인 소스 시스템은,변경이 이러한 데이터 형식으로 변경--영향을 미치지 않습니다 당신.
  • 귀하의 DW 미만이 필요한 물리적 공간 때문에 사용할만 정수 데이터 유형에 대한 대리 키를 사용합니다.또한 귀하의 인덱스는 더 나은 작동합니다.

자에게 유용할 수 있을 때 비즈니스 정보를 변경할 수 있습 또는 동일합니다.비즈니스의 이름이 없는 것에서 유일한 국가이다.가정을 다루는 두 개의 기업이라는 스미스 전자공학,에서 하나 캔자스 및 미시간입니다.할 수 있는 그들을 구별해 주는지만,그 변경합니다.도 상태를 변경할 수 있습;어떤 경우 스미스 전자공학의 캔자스 도시,캔자스 시티에서 이동 강하 Kansas City,Missouri?이 없는 명백한을 유지하는 방법으로 이러한 기업에 뚜렷한 자연 주요 정보,그래서 대체 키는 것은 매우 유용합니다.

의 생각 대리 키아 ISBN 번호입니다.일반적으로 식별할 책에 제목과 저자이다.그러나 나는 두 권의 책이라는 제목의"진주만"H.P.Willmott,그리고 그들은 확실히 다른 책을,하지만 다른 버전.한 경우에는,내가 참조할 수 있습을 보이는 책의,또는 이전 대상이지만,그것은 단지뿐만 아니라 나는 ISBN 입니다.

신호로 그것은 좋지 않은 연습하는 장소 클러스터 지수에게 즉Guid 를 읽 XY8D7-DFD8S,그들의 SQL 서버에는 아무 능력을 육체적으로 정렬 이러한 데이터이다.대신 곳이 독특한 지표에서 이러한 데이터 수 있지만 또한 유리를 단순히 실행 SQL 프로파일러를 위한 기본 테이블 작업 및 이러한 데이터로 다음과 같습니다

보 thread@ http://social.msdn.microsoft.com/Forums/en-us/sqlgetstarted/thread/27bd9c77-ec31-44f1-ab7f-bd2cb13129be

Case1: 귀하의 테이블 테이블 조회 과 50 미만 유형(삽입)

사업/자연적인 열쇠.예를 들어:

Table: JOB with 50 inserts
CODE (primary key)       NAME               DESCRIPTION
PRG                      PROGRAMMER         A programmer is writing code
MNG                      MANAGER            A manager is doing whatever
CLN                      CLEANER            A cleaner cleans
...............
joined with
Table: PEOPLE with 100000 inserts

foreign key JOBCODE in table PEOPLE
looks at
primary key CODE in table JOB

사례 2: 귀하의 테이블 테이블과 함께 수천명의 삽입

대리/자동 증가 열쇠.예를 들어:

Table: ASSIGNMENT with 1000000 inserts
joined with
Table: PEOPLE with 100000 inserts

foreign key PEOPLEID in table ASSIGNMENT
looks at
primary key ID in table PEOPLE (autoincrement)

첫번째 경우:

  • 당신이 선택할 수 있습니다 모든 프로그래머 테이블이 없는 사람들의 사용으로 가입 테이블 일이지만,그냥:"SELECT*에서 사람들은 어디에 JOBCODE='PRG'"

에서 두 번째 경우:

  • 귀하의 데이터베이스 쿼리가 빠르기 때문에 당신의 기본 키의 정수
  • 을 귀찮게 할 필요가 없으로 자신을 찾는 다음을 고유의 핵심이기 때문에 데이터베이스에 자체가 당신에게 다음을 증분.

이 경우 대리 키 꽤 많 의미가 있습니다.는 경우가 있는 곳에 하나를 선택 최선의 것에 대한 데이터베이스는 최선의 것에 대한 개체 모델,하지만 두 경우 모두,사용하는 의미 없는 키나 GUID 를 더 좋은 생각이 아니다.그것은 인덱싱을 쉽고 빠르게,그리고 그것은 정체성에 대한 개체는 변경되지 않습니다.

말을 위한 코스입니다.을 주 내 bias;나는 개발자가 첫째로,그래서 나는 주로 관심을주는 사용자가 작동하는 응용 프로그램.

일했는 시스템에서는 자연 키를,그리고 많은 시간을 보내고 확인하는 값이 변경되는 것을 통해 리플.

일했는 시스템에서만 사용자에게,그리고 유일한 단점이 되었습의 부족 denormalised 데이터에 대한 분할입니다.

가장 전통적인 PL/SQL 개발자가 함께 좋아하지 않게의 수가 많기 때문에 테이블당에 가입하지만,우리의 테스트 및 생산 데이터베이스 제기된 적이 없는 땀;여분의 조인 영향을 미치지 않았다는 응용 프로그램 성능이다.데이터베이스 방언을 지원하지 않는 절처럼"X 내부 조 Y 에 X.a=Y.b"또는 개발자를 사용하지 않는 구문,여분의 조인에 대한 대리 키게 할 쿼리가 열심히 읽고,더 이상 입력하고 확인:보@Tony 앤드류스 post.그러나 사용하는 경우 ORM 또 다른 어떤 SQL 을 생성 프레임워크 통지하지 않습니다.터치 입력한 완화.

어쩌면 완전히 이 주제와 관련이있지만,두 나는가를 다루는 대리 키를 사용합니다.Oracle 사전달 분석을 만듭 자동 생성 SKs 에 모든 차원에서 테이블 웨어하우,그리고 그것은 또한 매장에서 그 사실입니다.그래서,그들은 언제(크기)다시 로드해야 하는 새 열을 추가하거나 채워야 하는 모든 항목에 대한 차원에서,SKs 중에 할당 업데이트 SKs 와 동기화 원래 값이 저장된 사실을 강제 적용 충전의 모든 사실에는 테이블 가입니다.내가 선호하는 경우에도 SK 의미가 없었 수 있는 몇 가지 방법이 될 수 없는 변경에 대한 원/오래된 기록합니다.으로 많은 알,의자는 거의 제공인 조직의 요구 사항 및 우리가 지속적으로 사용자 정의.우리는 지금 3yrs 가치 데이터의에서 우리의 창고,완전한 재충전에서 Oracle 금융 시스템은 매우 크다.그래서 나의 케이스에서,그들은하지 않습에서 생성된 데이터 입력하지만,추가 창고에 도움을 보고 성능이다.나는 그것을 얻을,하지만 우리는 변화이며,그것은 악몽이다.

의 경우에는 시점에서 데이터베이스는 그것이 최고의 조합의 대리고 자연의 키를 사용합니다.예:를 추적할 필요가 있는 회원 정보를 위해 클럽도 있습니다.어떤 특성의 구성원이 결코 변하지 않습니다.e.g 날짜의 탄생은 하지만 이름을 변경할 수 있습니다.그래서 만들 멤버와 테이블 member_id 대리 키고에 대한 열 DOB.성 테이블이라는 사람이 이름에 대한 열 member_id,member_fname,member_lname,date_updated.이 테이블에서 자연 키 것 member_id+date_updated.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top