2009-12-24 4 views
5

을위한 최선의 선택 개인 (예 : 클라이언트, 사용자, 고객, 직원 등)을 나타내는 테이블에서 기본 키를 선택하는 것은 무엇입니까? 내 첫 번째 선택은 SSN 번호입니다. 그러나 SSN을 사용하는 것은 개인 정보 보호 문제와 다른 규정으로 인해 권장되지 않았습니다. SSN은 사람의 평생 동안 바뀔 수 있으므로 반대하는 또 다른 이유가 있습니다.개인 테이블 기본 키

잘 선택된 자연 기본 키의 기능 중 하나는 중복을 피하는 것입니다. 저는 사람이 데이터베이스에 두 번 등록되는 것을 원하지 않습니다. 일부 대용 또는 생성 된 기본 키는 중복 항목을 피하는 데 도움이되지 않습니다. 이것을 접근하는 가장 좋은 방법은 무엇입니까?

편집 :

어떤 사람 엔티티에 대한 응용 프로그램에서 고유성을 보장하는 가장 좋은 방법이며, 이것은 기본 키 또는 고유성 제약 조건 데이터베이스 수준에서 처리 될 수 있는가?

+0

Oracle PL/SQL에서는 비즈니스 로직을 조작하기 위해 SQL 코드를 작성할 수 있으므로 데이터베이스 수준의 고유성을 유지 관리 할 수 ​​있습니다. 사실 다른 모든 T-SQL 방언은 내가 아는 한 당신에게 그 힘을줍니다. 그러나 이것은 모든 sql 엔진에 대한 표준 동작이 아닙니다. 독창성은 요구 사항에서 비즈니스 논리 문제로 간주됩니다. 그래서 응용 프로그램에서 이동하십시오. – user114285

답변

3

위에서 언급 한 것처럼 자동 증가를 기본 키로 사용하십시오. 그러나 나는 이것이 당신의 진정한 질문이라고 생각하지 않습니다.

진짜 질문은 중복 된 항목을 피하는 방법입니다. 이론 상으로는 2 명의 사람들이 같은 날에 같은 이름으로 태어날 수 있고 같은 세대에 살 수 있고 다른 사람들이 사용할 수있는 사회 보장 번호가 없습니다. (하나는 외국인을 방문 할 수 있습니다).

그러나 일반적으로 성명, 생년월일, 주소 및 전화 번호의 조합으로 중복을 피하기에 충분합니다. 주소는 다르게 입력 될 수 있고 사람들은 여러 개의 전화 번호를 가질 수 있으며 사람들은 중간 이름을 생략하거나 이니셜을 사용할 수도 있습니다. 중복 된 항목을 피하는 것이 얼마나 중요한지, 사용자베이스가 얼마나 큰지 (따라서 충돌 가능성)에 달려 있습니다.

물론 SSN/SIN을 얻을 수 있다면 고유성을 결정하기 위해 SSN/SIN을 사용할 수 있습니다.

7
난 당신이 사용하고있는 데이터베이스 엔진 모르는

하지만 (적어도 MySQL의에 - 7.4.1. Make Your Data as Small as Possible 참조) 정수, 최단를 사용는, 일반적으로 성능 및 메모리 요구 사항에 가장 적합한 것으로 간주됩니다.

정수 (auto_increment)를 기본 키로 사용합니다.
아이디어의 존재 다음 PK가 짧은

  • 경우는,
  • 외래 키에 사용되는 열이 짧은 경우 (이 두 개의 긴 문자열보다 두 정수를 비교하기 위해 빠르고 쉽게) 각 행을 식별하는 데 도움이 그 열의 값이 여러 위치에 저장되기 때문에 외래 키에 대한 메모리가 더 적게 필요합니다.

그리고 가능한 경우 및/또는 필요하다면 다른 열 (단일성을 결정하는 색인)에 UNIQUE 색인을 설정하십시오.


편집 :

+0

해당 열은 무엇이며 데이터베이스 수준에서 사람 개체의 고유성을 보장 할 수 있습니까? – Dan

+3

사람을 독특하게 만드는 것은 더 복잡한 질문입니다. 이름이 아니라 주소가 아니라 생년월일이 아니라 ... ;;; 어쩌면 그 중 일부의 조합일까요? 이름 + 중간 이름 (영어로 된 이름이 확실하지 않음) + 성 + 생년월일 + 출생지 + 성별 ;; 그것들은 일반적으로 "행정적인"형식에 사용되는 것들이며, 나쁘지도 않아야합니다. –

+0

@dan 여러 개의 실제 데이터베이스 서버가 있고 사람을 동기화 상태로 유지하기 위해 올바른 응용 프로그램 논리 (또는 복제)가없는 경우 보증이 중단되는 유일한 시간입니다. 이를 위해 여러분은 person-id를 전역 적으로 고유하게 유지하는 로직을 준비해야합니다 (참고 : GUID가 있어야 함을 의미하지는 않습니다). –

1

사용하는 A : 여기 당신에게 관심을 가질만한 다른 질문/답변의 커플 utogenerated 정수 기본 키를 누른 다음 고유해야한다고 생각되는 항목에 고유 제한 조건을 지정하십시오. 그러나 SSN은 이 아니기 때문에 실제 세계에서는이 아닙니다. 따라서 데이터베이스가 좋은 비즈니스 모델이라는 사실을 받아 들일 수 없으므로 고객을 돌리는 생각을하지 않는 한이 열에 고유성 제약 조건을 두는 것은 좋지 않습니다.

0

@ 마크 및 @ 파스칼에 추가하려면 (자동 증가 정수가 가장 좋습니다) - SSN은 유용하며 올바르게 모델링되어야합니다. 보안 문제는 응용 프로그램 논리의 일부입니다. 별도의 테이블로 정규화 할 수 있으며 날짜 발행 필드를 제공하여 고유하게 만들 수 있습니다.

p.s. '응용 프로그램 보안'에 동의하지 않는 사용자에게 엔터프라이즈 DB는 세부적인 ACL 모델을 갖습니다. 그래서 이것은 끈적 거리지 않을 것입니다.

1

나는 자연 키를 선호하지만 테이블 person은 잃어버린 경우입니다. SSN은 고유하지 않으며 모든 사람이 유일하지 않습니다.

1

대리 키를 권하고 싶습니다. 다른 후보 키에 필요한 모든 인덱스를 추가하되 비즈니스 로직을 핵심 키로 유지하는 것이 좋습니다.

3

어떤 속성을 사용할 수 있습니까? 어떤 애플리케이션이 신경 써야할까요? 예를 들어 똑같은 장소에서 똑같은 순간에 두 사람을 태어날 수는 없지만 그 정확성 수준에서 해당 데이터에 액세스 할 수는 없습니다. 따라서 모델링하려는 애트리뷰트 중에서 허용 가능한 수준의 데이터 무결성을 제공하기에 충분한 애트리뷰트를 결정해야한다. 선택한 항목에 상관없이 데이터 무결성 측면 (동일한 사용자의 여러 행 삽입 방지)에 중점을 둡니다.

다른 테이블의 조인/외부 키의 경우 서로 게이트 키를 사용하는 것이 가장 좋습니다.

기본 키이라는 문구가 잘못 사용되었거나 혼동을 야기하기에 이르렀습니다. 모든 키, 당신은 그것을 플래그 여부를 기본 키, 고유 키, 또는 고유 색인는 여전히 키, 그리고 테이블의 모든 행이의 속성에 대해 고유 한 값을 포함해야합니다 대체 키. 그런 의미에서 모든 키는 동등합니다. 무엇보다 중요한 것은 (의미있는 실제 도메인 모델 데이터 속성에 의존하는) 자연 키인지 또는 대리자 (실제 데이터 속성의 독립)인지 여부입니다.

두 번째로 중요한 것은 .. 대리 키는 좁고 단순하며 결코 바뀌지 않습니다 (아무 이유도 없습니다 - 그들은 아무 의미도 없습니다) 그래서 그들은 조인이나 다른 종속 테이블의 외래 키에 더 나은 선택입니다.

그러나 데이터 무결성을 보장하고 동일한 도메인 엔터티에 대해 여러 행 삽입을 방지하기 위해 이들은 전혀 쓸모가 없습니다. 자연 키, 사용 가능한 데이터 중에서 선택해야합니다. 귀하의 응용 프로그램은 어떤 목적을 위해 모델링됩니다.

키가 100 % 불변 일 필요는 없습니다. 예를 들어 이름과 전화 번호 및 생년월일을 사용하면 (예를 들어, 사람이 이름이나 전화 번호를 변경하더라도 테이블의 값을 간단히 변경할 수 있습니다. 다른 행에 키 속성에 새 값이 이미있는 한 괜찮습니다.

당신이 선택한 키가 99.9 %의 경우에만 작동한다고하더라도 (같은 이름과 전화 번호를 가진 두 사람이 출현 할만큼 불행하고 동시에 우연히 출생 한 경우), 적어도 데이터의 99.9 %는 정확하고 일관성이 보장됩니다. 예를 들어 생년월일을 고유하게 만들거나 키에 다른 속성을 추가하여 구분할 수 있습니다. 변경으로 인해 데이터베이스 전체의 외래 키에서 데이터 값을 업데이트 할 필요가없는 한 (이 키를 다른 곳의 FK로 사용하지 않으므로) 중요한 문제가 발생하지 않습니다.

1

저는 신뢰할 수있을 때 자연스러운 키를 선호합니다.

은행 등을 운영하는 경우를 제외하고는 고객 및 사용자가 유효한 SSN을 제공 할 이유가 없으며 반드시 SSN을 가져야합니다. 따라서 사업상의 이유로 SSN에 대한 불신을 강요합니다. 비슷한 주체가 "사람"에 대한 임의의 주어진 자연의 열쇠를 보유 할 것이다.

인공 ("대리모") 키를 할당 할 수밖에 없습니다. 그것은 정수 일 수도 있습니다. 충분히 큰 정수인지 확인하여 곧 확장 할 필요가 없습니다.