복붙노트

[RUBY-ON-RAILS] 고유 객체 ID 필드 대 복합 기본 키

RUBY-ON-RAILS

고유 객체 ID 필드 대 복합 기본 키

나는 복합 키가 더 이상 고유 오브젝트 ID 필드를 사용하는 것보다하고 데이터베이스를 구축 할 때, 하나의 고유 한 ID가 기본 키로 사용해서는 안됩니다 그 것을 아이디어로 구축 된 데이터베이스를 물려 받았다. 나는이 데이터베이스에 대한 레일 프런트 엔드를 구축 되었기 때문에 (이 복합 키를 처리하기 위해 사용자 정의보기 및 몇 가지 추가 보석을 사용하여 가능했다하더라도), 나는 레일 규칙을 준수하는 데 점점 어려움에 부딪쳤다.

그것을 쓴 사람에서이 특정 스키마 디자인 뒤에 추론 방법이 아닌 효율적으로 데이터베이스 핸들 ID 필드와는 인덱스를 구축 때, 나무의 종류가 결함이 함께 할 수 있었다. 이 설명은 어떤 깊이를 결여하고 난 아직도 개념 주위에 내 머리를 정리하려고 해요 (I 복합 키를 사용하여 익숙 해요,하지만 시간의 100 %).

누구의 제안 의견이나이 주제에 어떤 큰 깊이를 추가 할 수 있습니까?

해결법

  1. ==============================

    1.일반적으로 사용되는 엔진 (MS SQL 서버, 오라클, DB2, MySQL은, 등)의 대부분은 서로 게이트 키 시스템을 사용하여 눈에 띄는 문제가 발생하지 않을 것입니다. 일부는 심지어 대리의 사용으로 성능 향상을 경험할 수 있지만, 성능 문제는 매우 플랫폼 별입니다.

    일반적으로 사용되는 엔진 (MS SQL 서버, 오라클, DB2, MySQL은, 등)의 대부분은 서로 게이트 키 시스템을 사용하여 눈에 띄는 문제가 발생하지 않을 것입니다. 일부는 심지어 대리의 사용으로 성능 향상을 경험할 수 있지만, 성능 문제는 매우 플랫폼 별입니다.

    일반적인 용어로, 자연 키 (및 확장에 의해, 복합 키) 구절 게이트 키 토론 시야에 가능성 "정답"와 오랜 역사를 가지고 있습니다.

    (단수 또는 복합) 자연 키의 인수는 일반적으로 몇 가지 다음과 같습니다 :

    1) 그들은 이미 데이터 모델에서 사용할 수 있습니다. 대부분의 개체는 이미 모델로 하나 개 이상의 속성이나 관계를 만드는 목적을위한 키의 요구를 충족 속성의 조합을 포함된다. 각 테이블에 추가 속성을 추가하면 불필요한 중복을 통합합니다.

    특정 조인에 대한 2) 그들은 필요가 없습니다. 당신은 송장 번호와 고객 번호와 고객, 송장이있는 경우 예를 들어, (둘 다 "자연"키가 있습니다), 그리고 특정 고객 코드에 대한 모든 송장 번호를 검색하려면, 당신은 단순히 FROM SELECT INVOICENUMBER "를 사용할 수 있습니다 송장 WHERE CustomerCode = 'XYZ123' ". 고전적인 대리 키 방식에서 SQL은 다음과 같이 보일 것입니다 : "송장 INNER FROM SELECT Invoice.InvoiceNumber가 WHERE Customer.CustomerCode = 'XYZ123'Invoice.CustomerID = Customer.CustomerID ON 고객 가입하세요".

    3) 그들은 데이터 모델링에 더 보편적으로 - 적용 방법에 기여한다. 자연 키, 같은 디자인은 다른 SQL 엔진 사이에 큰 변화가 사용할 수 있습니다. 많은 대리 키 접근 따라서 서로 다른 플랫폼에서 구현하는 데이터 모델의 더 전문화를 요구, 키 생성 특정 SQL 엔진 기술을 사용합니다.

    대리 키에 대한 인수는 SQL 엔진 특정 문제를 주변에 회전하는 경향이있다 :

    비즈니스 요구 사항 / 변경을 지배 할 때 1) 그들은 속성을 쉽게 변경 할 수 있습니다. 그들은 데이터를 하나의 테이블로 분리 할 속성 수 있기 때문이다. 이것은 주로 효율적으로 같은 도메인으로 표준 SQL 구문을 구현하지 않는 SQL 엔진에 대한 문제입니다. 속성이 도메인 문에 의해 정의되는 경우, 속성에 대한 변경은 ALTER DOMAIN 문을 사용하여 스키마 전체 수행 할 수 있습니다. 다른 SQL 엔진은 도메인을 변경에 대해 서로 다른 성능 특성을 가지고 있고, 데이터 모델러는 속성을 변경할 수있는 능력을 향상시키기 위해 대리 키를 추가하여 이러한 상황을 보상하기 때문에 일부 SQL 엔진은 전혀 도메인을 구현하지 않습니다.

    2) 그들은 자연 키보다 동시성 쉽게 구현을 가능하게한다. 고객 코드가 있기 때문에 자연 키 값을 고유 키의 경우, 두 사용자 경우 동시에 같은 고객 행으로, 동일한 정보가 설정 작업을하고 있으며, 사용자의 수정 중 하나가, 다음 두 번째 사용자에 의한 갱신은 실패 업데이트는 더 이상 데이터베이스에 존재하지 않습니다. 불변의 ID 값이 데이터베이스에 변경 가능한 고객 코드 행을하지 식별하는 데 사용되기 때문에 서로 게이트 키의 경우, 업데이트가 성공적으로 처리합니다. 고객 코드는 행의 실제 "정체성"변경 되었기 때문에 두 번째 사용자가 변경을 진행 시켜서는 안됩니다 가능성이 변경된 경우 - - 그러나, 두 번째 업데이트를 허용하는 것이 바람직하지 않다 두 번째 사용자 수도 잘못된 행을 업데이트합니다. 대리 키도 자연 키도는, 스스로이 문제를 해결합니다. 포괄적 인 동시성 솔루션은 키의 구현 외부에서 해결해야합니다.

    3) 그들은 자연의 키보다 더 나은 수행합니다. 성능은 가장 직접 SQL 엔진에 의해 영향을 받는다. 다른 SQL 엔진을 사용하여 동일한 하드웨어에서 구현 된 동일한 데이터베이스 스키마는 종종 인해 SQL 엔진 데이터 저장 및 검색 메커니즘, 극적으로 다른 성능 특성을해야합니다. 일부 SQL 엔진 등 고객 코드와 같은 속성은 데이터베이스 스키마의 여러 ​​위치에 나타날 때 데이터가 실제로 중복 저장되어 밀접하게 대략적인 플랫 파일 시스템. 변경이 데이터 또는 스키마를 만들 필요가 때 SQL 엔진이 중복 스토리지는 성능 문제가 발생할 수 있습니다. 다른 SQL 엔진은 데이터 및 스키마의 빠른 변화를 허용, 데이터 모델 및 저장 / 검색 시스템간에 더 나은 분리를 제공합니다.

    4) 대리 키는 특정 데이터 액세스 라이브러리 및 GUI 프레임 워크 더 잘 작동합니다. 때문에 대부분의 대리 키 디자인 (예 : 모든 관계형 키를 정수)의 균일 한 특성으로, 데이터 액세스 라이브러리으로 ORMs, 및 GUI 프레임 워크 데이터의 특별한 지식을 필요없이 정보와 함께 작업 할 수 있습니다. 그들의 이질적인 성격 (다른 데이터 유형, 크기 등)에 대한 자연 키, 자동 또는 반자동 툴킷 및 라이브러리와 함께 잘 작동하지 않습니다. 마음에 특정 툴킷과 데이터베이스를 설계 임베디드 SQL 데이터베이스와 같은 전문 시나리오의 경우, 허용 될 수있다. 다른 시나리오에서, 데이터베이스는 여러 플랫폼, 응용 프로그램, 보고서 시스템 및 장치에 의해 동시에 액세스 기업 정보 자원이다, 따라서 특정 라이브러리 또는 프레임 워크에 중점을두고 설계 잘 때와 같이 작동하지 않습니다. 다음 훌륭한 도구 키트가 도입 될 때 특정 툴킷 책임되기로 또한 작동하도록 설계 데이타베이스 사이.

    나는 자연 키 (명백하게)의 측면에 떨어지는 경향이 있지만 나는 그것에 대해 광신적 아닙니다. 때문에 특정 데이터베이스 I 도움이 디자인은 다양한 응용 프로그램에서 사용할 수있는 환경 I 일에, 나는 데이터 모델링의 대부분을 자연 키를 사용하여 거의 서로 게이트를 소개합니다. 그러나, 나는 사용 대리 기존 데이터베이스를 다시 구현하려고 내 방식의 외출하지 않습니다. 대리 키 시스템은 잘 작동하지 않습니다 - 이미 잘 작동 변경 뭔가 필요합니다.

    각 방법의 장점을 논의 일부 우수한 자원이 있습니다 :

    http://www.google.com/search?q=natural+key+surrogate+key

    http://www.agiledata.org/essays/keys.html

    http://www.informationweek.com/news/software/bi/201806814

  2. ==============================

    2.나는 15 년 동안 데이터베이스 응용 프로그램을 개발했고 나는 비 대용 키가 대리 키보다 더 나은 선택이었다 경우 건너 못하고있다.

    나는 15 년 동안 데이터베이스 응용 프로그램을 개발했고 나는 비 대용 키가 대리 키보다 더 나은 선택이었다 경우 건너 못하고있다.

    나는 그런 경우가 실제로 데이터베이스를 액세스하는 응용 프로그램을 개발의 실질적인 문제에 당신이 요소는 일반적으로 대리 키의 장점은 비의 이론적 순도를 압도하기 시작하면, 난 그냥 말하고 존재하지 않는다고 말하는 게 아니에요 -surrogate 키.

  3. ==============================

    3.기본 키는 일정하고 의미가 있어야한다; 비 대리 키는 일반적으로 결국, 하나 또는 두 개의 요구 사항을 실패

    기본 키는 일정하고 의미가 있어야한다; 비 대리 키는 일반적으로 결국, 하나 또는 두 개의 요구 사항을 실패

    재고 항목의 테이블 : 간단하고 일반적인 예를 취할. 이 항목 번호 (SKU 번호, 바코드, 일부 코드, 또는 무엇이든) 기본 키,하지만 년 후 모든 항목 번호 변경을 유혹 할 수 있으며, 당신은 매우 지저분한 갱신 - 더 - whole- 남아있어 데이터베이스 문제 ...

    편집 : 철학적보다 더 실용적입니다 추가 문제가있다. 많은 경우에 나중에 후, 어떻게 든 특정 행을 찾으를 업데이트하거나 (또는 ​​둘 다)를 다시 찾을 것입니다. 복합 키를 다시 찾기 또는 업데이트에 대한 WHERE 절에 추적 및 더 많은 제약 조건을 유지 (또는 삭제)하기 위해 더 많은 정보가있다. 중요한 하나의 세그먼트가 그 사이에 변경 될 수도 있다는 것도 가능하다! 대리 키, 하나 유지하는 값 (대리의 ID)와 크게 상황을 단순화은 변경할 수 없습니다 정의에 의해 항상있다.

  4. ==============================

    4.이 데이터베이스가 서로 게이트 키 토론 대 위대한 자연 키의 자연 키 측에 만든 사람처럼 들린다.

    이 데이터베이스가 서로 게이트 키 토론 대 위대한 자연 키의 자연 키 측에 만든 사람처럼 들린다.

    나는 ID 필드에한데, btree에 문제 들어 본 적이없는, 그러나 나는 또한 어떤 훌륭한 깊이에서 그것을 공부하지 않은 ...

    나는 대리 키 옆에 가을 : 당신은 단지 다른 테이블에서 하나의 값을 반복하고 있기 때문에, 대리 키를 사용할 때 덜 반복 있습니다. 인간은 거의 손으로 테이블을 조인하지 않기 때문에이 숫자 나하지 않을 경우, 우리는 상관하지 않습니다. 인덱스에서 찾아 볼 수있는 하나의 고정 된 크기의 열이 거기 때문에,이 대리는 기본 키에 의해 빠른 조회 시간이뿐만 아니라 가정하는 것이 안전합니다.

  5. ==============================

    5.사용의 고유 한 (객체) ID가 '필드 단순화 조인,하지만 여전히 고유 한 다른 (아마도 복합) 키를 가지고하는 것을 목표로한다 -하지 null이 제약을 완화하지 않고, DO가 고유 제한 조건을 유지한다.

    사용의 고유 한 (객체) ID가 '필드 단순화 조인,하지만 여전히 고유 한 다른 (아마도 복합) 키를 가지고하는 것을 목표로한다 -하지 null이 제약을 완화하지 않고, DO가 고유 제한 조건을 유지한다.

    DBMS에 효과적으로 고유의 정수를 처리 할 수없는 경우에는 큰 문제가있다. 그러나, '독특한 (객체) ID'와 다른 키를 모두 사용하는 것은 단지 다른 키보다 더합니다 (인덱스)를 사용하여 더 많은 공간을 수행하고, 각 삽입 작업에 갱신에 두 개의 인덱스가 있습니다. 하지만 한 원래 키를 유지으로도, 당신은 괜찮을거야 - 공짜 아니다는 그래서. 당신이 다른 키를 제거하는 경우에, 당신은 당신의 시스템의 디자인을 깨고있다; 지옥은 결국 느슨한 휴식한다 (당신은 나 지옥 파산 느슨한 발견되지 않을 수도 있습니다).

  6. ==============================

    6.나는 기본적으로 대리 키 팀의 일원이다, 나는 감사하고 사람이 여기 JeremyDWill 제시 등의 인수를 이해하더라도, 나는 여전히 "자연"키가 더 나은 대리보다 경우를 찾고 있어요 ...

    나는 기본적으로 대리 키 팀의 일원이다, 나는 감사하고 사람이 여기 JeremyDWill 제시 등의 인수를 이해하더라도, 나는 여전히 "자연"키가 더 나은 대리보다 경우를 찾고 있어요 ...

    이 문제를 다루는 다른 게시물은 일반적으로 관계형 데이터베이스 이론과 데이터베이스 성능을 참조하십시오. 항상이 경우 잊어 버린 또 다른 흥미로운 인수는, 테이블 정상화 및 코드 생산성 관련이있다 :

    때마다 나는 나는 테이블을해야 만들     잃게 시간

    내 대답은이 모든 질문에 '노 :

    각 테이블 (의는 'myTable에'를 부르 자)의 첫 번째 필드는 고유 식별자의 유형 인 'id_MyTable'라고했다 : 나는 아주 기본적인 규칙과 지난 5 년 동안 공부하고 있었어요 그래서. 이 테이블은 같은 'id_Computer'의 조합 'id_User'형태의 매우 허용 기본 키, 나는이 'id_ComputerUser'필드를 생성하는 것을 선호는 'ComputerUser'테이블과 같은 "다 대다"관계를 지원하더라도 고유 식별자 인 단지 규칙에 충실합니다.

    가장 큰 장점은 코드 내에서 기본 키 및 / 또는 외부 키의 사용에 대해 animore을 걱정하지 않아도됩니다. 당신이 테이블 이름이 있으면, 당신은 PK의 이름과 유형을 알고있다. 당신이 당신의 데이터 모델에서 구현되는 링크 알게되면, 테이블에서 사용할 수있는 외부 키의 이름을 알 수 있습니다.

    내 규칙이 가장 좋은 하나입니다 확실하지 않다. 그러나 그것은 매우 효율적입니다!

  7. ==============================

    7.새로운 아키텍처를 개발하는 실용적인 접근 방식은 짧은 descriptionary 테이블에 대한 다중 컬럼 매우 독특한 기록과 복합 키의 수천을 포함 할 테이블에 대한 대리 키를 사용 하나입니다. 나는 보통 현실 세계의 프로그래머가 복합 키를 선호하면서 대학이 대리 키의 사용을 지시 할 것을 찾을 수 있습니다. 단지 방법은 하나 또는 다른 - 당신은 정말 올바른 테이블에 기본 키의 유형을 적용해야합니다.

    새로운 아키텍처를 개발하는 실용적인 접근 방식은 짧은 descriptionary 테이블에 대한 다중 컬럼 매우 독특한 기록과 복합 키의 수천을 포함 할 테이블에 대한 대리 키를 사용 하나입니다. 나는 보통 현실 세계의 프로그래머가 복합 키를 선호하면서 대학이 대리 키의 사용을 지시 할 것을 찾을 수 있습니다. 단지 방법은 하나 또는 다른 - 당신은 정말 올바른 테이블에 기본 키의 유형을 적용해야합니다.

  8. ==============================

    8.천연 키를 이용하여 지속 층 같은 자동 ORM 악몽을 사용한다. 또한, 다수의 컬럼에 외래 키가 서로 중첩하는 경향이 탐색 및 OO 방식의 관계를 갱신 할 때 다른 문제점을 제공한다.

    천연 키를 이용하여 지속 층 같은 자동 ORM 악몽을 사용한다. 또한, 다수의 컬럼에 외래 키가 서로 중첩하는 경향이 탐색 및 OO 방식의 관계를 갱신 할 때 다른 문제점을 제공한다.

    여전히 당신은 고유의 구속에서 자연 키를 변환하고 자동을 생성 된 ID를 추가 할 수 있습니다; 이 외부 키의 문제를 제거하지 않습니다,하지만 그 손에 의해 변경되어야 할 것이다; 당신은 문제가 대부분의 곳을 리팩토링에 집중할 수 있도록 희망 여러 열 및 중복 제약, 모든 관계의 소수 일 것이다.

    자연 PK 그들은 단지 ORM과 잘 지내지 경향, 자신의 동기를 부여하고 용도 시나리오를 가지고 나쁜 일이 (TM)를하지 않습니다.

    내 느낌은 다른 개념으로, 자연 키와 테이블 정상화 때 분별하지 블라인드 디자인 제약으로 사용되어야한다는 것이다

  9. ==============================

    9.여기 짧고 달콤한 될거야 : 복합 기본 키가 좋은 요즘되지 않습니다. 당신이 할 수있는 경우 대리 임의의 키에 추가하고 고유 제한 조건을 통해 현재 키 방식을 유지한다. ORM 당신은 그리 행복하지 행복, 원래 프로그래머가있어하지만 그는 당신의 상사 않는 한 그는 그냥 처리 할 수, 행복하다.

    여기 짧고 달콤한 될거야 : 복합 기본 키가 좋은 요즘되지 않습니다. 당신이 할 수있는 경우 대리 임의의 키에 추가하고 고유 제한 조건을 통해 현재 키 방식을 유지한다. ORM 당신은 그리 행복하지 행복, 원래 프로그래머가있어하지만 그는 당신의 상사 않는 한 그는 그냥 처리 할 수, 행복하다.

  10. ==============================

    10.복합 키가 잘 될 수있다 - 그들은 성능에 영향을 줄 수 있습니다 -하지만 그들은 고유 (대리) 키가 유일한 답이 아니라고 거의 같은 방법으로, 유일한 해답이 아니다.

    복합 키가 잘 될 수있다 - 그들은 성능에 영향을 줄 수 있습니다 -하지만 그들은 고유 (대리) 키가 유일한 답이 아니라고 거의 같은 방법으로, 유일한 해답이 아니다.

    무엇 저를 염려하는 복합 키를 선택하는 추론의 모호성이다. 더 자주 기술 아무것도하지 모호성 이상은 이해의 부족을 나타냅니다 - 어쩌면 다른 다음 사람이 책이나 문서에서 가이드 라인입니다 ....

    이 하나의 고유 한 ID와 아무것도 잘못입니다 - 당신이 데이터베이스 서버에 연결하는 응용 프로그램을 가지고 당신은 당신이 모든 좋은 것 사용중인 데이터베이스를 선택할 수있는 경우 가리키고는, 당신은 꽤 많이 열쇠로 무엇이든 할 수 있으며, 정말 너무 심하게 고통 받고 있습니다.

    단 하나의 대답은 없기 때문에, 이것에 대해 쓴 많은이 있었다, 그리고 될 것입니다. 이 방법은 다음과 숙련 된 방식으로 신중하게 적용되는 이러한 요구에 접근한다.

    나는 ID의이 데이터베이스에 의해 자동으로 제공되는 문제를 많이 했어 - 나는 가능한 한 그들을 피하기, 그러나 아직도 가끔를 사용합니다.

  11. ==============================

    11.이것은 거의 확실 말도했지만, 다른 세션에서 높은 속도로 PK로 증가 번호를 할당 할 때 인덱스 블록 경합의 문제와 관련있을 수 있습니다. 그렇다면 다음 REVERSE KEY 지수는 더 큰 인덱스 크기의 비용이기는하지만 인해 블록 분할 알고리즘의 변화에 ​​도움이 거기에있다. http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/schema.htm#sthref998

    이것은 거의 확실 말도했지만, 다른 세션에서 높은 속도로 PK로 증가 번호를 할당 할 때 인덱스 블록 경합의 문제와 관련있을 수 있습니다. 그렇다면 다음 REVERSE KEY 지수는 더 큰 인덱스 크기의 비용이기는하지만 인해 블록 분할 알고리즘의 변화에 ​​도움이 거기에있다. http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/schema.htm#sthref998

    그것은 당신의 도구 세트와 더 빠른 개발을 돕는 경우 특히 합성을 이동합니다.

  12. ==============================

    12.내가 경험 한 아니라고하지만 여전히 나는 ID가 여기 예제를 사용하여 설명이다로서 기본 키를 사용하여 찬성 해요 ..

    내가 경험 한 아니라고하지만 여전히 나는 ID가 여기 예제를 사용하여 설명이다로서 기본 키를 사용하여 찬성 해요 ..

    외부 데이터의 포맷은 시간이 지남에 따라 변할 수있다. 예를 들어, 책의 ISBN이 책의 테이블에서 좋은 기본 키를 만들 것이라고 생각할 수 있습니다. 결국, ISBN이는 독특합니다. 이 특별한 책이 기록되는 그러나, 미국의 출판 업계는 추가 숫자는 모두의 ISBN에 추가되는 주요 변화를 준비하고있다. 우리가 책의 테이블의 기본 키로 ISBN을 사용했다면, 우리는이 변화를 반영하기 위해 각 행을 업데이트해야 할 것입니다. 그러나 우리는 또 다른 문제가있는 것입니다. 데이터베이스의 다른 테이블이있을거야 기본 키를 통해 책을 테이블에 참조 행. 우리가 처음 통과하고 이러한 모든 참조를 업데이트하지 않는 한 우리는 책 테이블의 키를 변경할 수 없습니다. 그리고는 외래 키 제약 조건을 삭제 테이블을 업데이트, 도서 테이블을 갱신하고, 마지막으로 제약을 다시 설정이 포함됩니다. 모두 모두,이 고통의 무언가이다. 우리는 기본 키로 우리 자신의 내부 값을 사용하는 경우 문제가 멀리 이동합니다. 어떤 타사는 우리의 변경을 알려 스키마를-우리가 우리 자신의 키 스페이스를 제어 임의 함께 올 수 있습니다. ISBN이 같은 뭔가 변화가 필요없는 경우, 그것은 데이터베이스의 기존 관계의 영향을주지 않고 변경할 수 있습니다. 실제로, 우리는 그 행에있는 데이터의 외부 표현에서 행의 뜨개질 서로를 분리했습니다.

    설명은 매우 학문에 열중하지만 난 생각하지만 그것은 간단한 방법으로 일을 설명합니다.

  13. ==============================

    13.@JeremyDWill

    @JeremyDWill

    토론을 많이 필요로하게되었던 약간의 균형을 제공해 주셔서 감사합니다. 특히, 도메인에 대한 정보를 주셔서 감사합니다.

    실제로 일관성을 위해 시스템 전체의 대리 키를 사용하지만, 관련 장단점이있다. 내가 쉽게 / 짧은 것 정규 값 낫다고 사용 작은 공간 내 모든 쿼리의 짧은 목록 조회 테이블이 날 때 대리 키를 사용하여 저주하는 가장 흔한 원인은 / 빠른 난 그냥 값을 만들었다 경우 대신 갖는 PK의 테이블에 참여한다.

  14. ==============================

    14.당신은 둘 다 할 수 있습니다 - 어떤 큰 회사 데이터베이스 가능성이 높습니다 실행 인간의 DBA를 포함한 여러 응용 프로그램을 사용할 수 있도록하기 때문에 일회성 ORM 시스템의 이익을 위해 순수을 설계 항상 실용적이거나 바람직하지 않다 쿼리 및 데이터 가져 오기.

    당신은 둘 다 할 수 있습니다 - 어떤 큰 회사 데이터베이스 가능성이 높습니다 실행 인간의 DBA를 포함한 여러 응용 프로그램을 사용할 수 있도록하기 때문에 일회성 ORM 시스템의 이익을 위해 순수을 설계 항상 실용적이거나 바람직하지 않다 쿼리 및 데이터 가져 오기.

    내가이 일을하는 경향이 각 테이블에 "ROWID"속성을 추가하는 것입니다 -이 필드는 GUID, 각 행에 매우 독특합니다. 자연 키 (가능한 경우)입니다 - 이것은 기본 키가 아닙니다. 그러나,이 데이터베이스의 상단에 작업을 어떤 ORM 레이어는 파생 개체를 식별하기 위해 ROWID를 사용할 수 있습니다.

    따라서 당신은 할 수 있습니다 :

    CREATE TABLE dbo.Invoice (
      CustomerId varchar(10),
      CustomerOrderNo varchar(10),
      InvoiceAmount money not null,
      Comments nvarchar(4000),
      RowId uniqueidentifier not null default(newid()),
    
      primary key(CustomerId, CustomerOrderNo)
    )
    

    당신의 DBA가 행복 그래서, 당신의 ORM 건축가는 행복하고 데이터베이스 무결성이 유지됩니다!

  15. ==============================

    15.난 그냥 자동 생성 (나는 그들에게 많이 볼 수 있기 때문에) 관계형 데이터베이스와 정체성 필드 정수 논의 할 때 내가 적용을 참조하지 않는 것이 여기에 무언가를 추가하고 싶어하고, 그것의 기본 유형은 어떤 점에서 오버플로 할 수있다.

    난 그냥 자동 생성 (나는 그들에게 많이 볼 수 있기 때문에) 관계형 데이터베이스와 정체성 필드 정수 논의 할 때 내가 적용을 참조하지 않는 것이 여기에 무언가를 추가하고 싶어하고, 그것의 기본 유형은 어떤 점에서 오버플로 할 수있다.

    지금이 자동으로 합성 식별자에게 갈 길을 만든다 말하려고 아니지만, 그것은 더 많은 데이터를 논리적으로 (여전히 고유) 테이블에 추가 할 수에도 불구하고 사실의 문제, 하나의 자동 생성 된 정수의 정체성이 발생하지 않도록 할 수있다.

    그래, 난 대부분의 경우 그것은 가능성, 그리고 64 비트 정수를 사용하여 당신에게 여유를 많이 제공하고,이 같은 오버 플로우가 지금까지 발생한 경우 현실적으로 아마도 데이터베이스가 다르게 설계되었습니다 것을 알고 있습니다.

    하지만 그건 그 일을하지 못하도록하지 않습니다 ... 특정 패스트 푸드 회사의 글로벌 수준에서 모든 트랜잭션을 저장 할 것으로 예상된다 그것의 정체성, 같은 단일 자동 생성 된 32 비트 정수를 사용하여 테이블로 실패 할 것입니다 그것은 삽입을 시도하자마자 그것은 21억4천7백48만3천6백48번째 거래를 (그리고 그것은 완전히 가능한 시나리오입니다).

    그것은 사람들이 얼버무하거나 완전히 무시하는 경향이, 노트에 뭔가입니다. 모든 테이블이 규칙에 삽입 될 것입니다 경우 고려 사항은 시간이 지남에 축적됩니다 얼마나 자주 그리고 얼마나 많은 데이터에 대한, 그리고 정수 식별자도 사용해야 기반 여부를해야한다.

  16. from https://stackoverflow.com/questions/159087/composite-primary-keys-versus-unique-object-id-field by cc-by-sa and MIT license