대리 키가 사용자에게 노출되어야합니까?


14

종종 자연 키가없는 테이블에서 사용자가 고유하게 생성 된 식별자를 가질 수있는 것이 여전히 유용합니다. 테이블에 대리 기본 키가 있고 (이 경우 확실하게 예상 할 수있는 경우) 해당 키를 사용자에게 노출해야합니까, 아니면 다른 필드를 해당 용도로 사용해야합니까?

대리 키를 표시하지 않는 한 가지 이유는 이제 레코드 간 관계를 유지하는 작업을 수행 할 수 없지만 특정 종류의 삭제 / 재 삽입과 같은 키 값을 변경하고 한 데이터베이스에서 여러 데이터베이스로 데이터를 복사하는 여러 가지 방법을 변경하기 때문입니다. 다른 것 등

대리 키를 노출하면 얻을 수있는 주요 이점은 필드를 간단하게 사용할 수 있다는 것입니다.

어떤 상황에서 대리 키를 사용자에게 직접 노출시키는 것이 더 낫습니까?


이 질문의 일부는 '사용자'를 정의해야한다는 것입니다. 사용자는 귀하가 노출하는 API의 소비자이거나 육체적 인 인간 일 수 있습니다. 대답은 둘 다 동일하지 않습니다.
James Snell

1
다육스러운 인간.
psr

데이터를 다르게 식별 할 수있는 모든 상황에는 다른 식별자가 있어야합니다. 따라서 새로운 시스템이 데이터와 연결되면 자체 PK가 있어야하고이를 데이터에 추가해야합니다. "주로 물이 많은 주머니"에 대한 가시성은이 시나리오의 '시스템'으로 간주됩니다. 내가 선호하는 솔루션은 엔터티의 키와 타임 스탬프 (추가 및 변경 및 삭제)를 특수 테이블에 저장하는 것입니다. 이러한 방식으로 데이터를 쉽게 배포 할 수 있습니다.

답변:


10

변경이 필요한 사용자 / 고객에게 노출되는 식별자에 대한 준비가되어 있어야하며, 데이터베이스에서 행의 ID를 변경하고 해당 변경 사항을 모든 외래 키에 전파하면 데이터가 중단됩니다.

데이터에 자연 비즈니스 키가없는 경우 "비즈니스 식별자"에 대한 추가 필드를 추가 할 수 있습니다. 사용되는 프로세스에 맞게 최적화해야합니다. 전화 키패드 입력은 숫자 만 의미합니다. 전화 / 언어를 통해 유사한 소리 기호 (B / D, M / N 등)를 피하십시오. 기억하기 쉬운 문구 ( "녹색 젤리")를 자동 생성 할 수도 있습니다.

그 결과 비즈니스는 나중에 레코드 참조 방법을 변경할 수 있으며 데이터 스키마 변경은 해당 스타일의 ID에 새 열을 추가하거나 이미 존재하는 ID를 변환하는 것입니다. 변경 사항은 전체 데이터베이스를 통해 전파되지 않으며 시간이 지남에 따라 유효한 하나의 ID (대리인)가 여전히 있습니다.

요컨대, 대리 키를 사용자에게 노출시키지 마십시오. 주석에서 알 수 있듯이 대리 키는 거의 변하지 않아야합니다. 반대로, 기업은 모든 것을 바꾸고 싶어합니다. 대리 키가 노출되면 비즈니스에서 키를 변경하기 전에 시간 문제 일뿐입니다.

부수적으로, 여기서 "노출"이라고 할 때, 사용자가 키를 직접 사용할 것이라는 기대를 가지고 (주문 번호를 지원하기 위해 전화하는 것과 같이) 사용자에게 키를 제공하는 것을 의미합니다 .


5
이 대답은 의미가 없습니다. 서로 게이트 키는 변경되지 않으며 사용자에게 노출시키지 않는 경우는 없습니다.
Robert Harvey

1
절대 말하지 마 후자의 설계로 인해 레코드 통합이 이루어지면 어떻게됩니까? 크기를 조정하고 정체성에서 멀어 지려면 어떻게해야합니까?
DougM

3
@DougM : 그런 다음 자체 대리 키를 사용하여 레코드를 새 통합 테이블에 기록하고 필요한 경우 새 테이블의 별도 필드 (및 원본 소스 테이블을 식별하는 필드)의 원래 키를 참조로 유지합니다. 이러한 종류의 통합은 매우 드 물어야하며 설계가 실패한 경우에만 가능합니다. 나를 따라 반복 : 대리. 열쇠. 못. 변화. 그것이 그들이 대리하는 이유입니다.
Robert Harvey

2
@RobertHarvey 나는 대리 키가 절대 바뀌지 않아야한다는 데 동의합니다. 이것이 외부 식별자를 잘못 만드는 것입니다. 어떻게 결국 고객이 변화를 원할 것입니다 그들은 기록을 참조하십시오. 이 시점에서 변경 불가능한 대리 키를 중심으로 전체 시스템을 구축했거나 비즈니스 식별자와 대리 키 사이에 일정 수준의 간접적 인 접근을 고려했습니다.
Chris Pitman

2
@sqlvogel : "surrogate"대신 "시스템 생성 기본 키"라는 용어를 사용하면 상황이 더 명확 해 집니까? 대리 키를 생성하는 알고리즘을 변경하고 싶지만 기본적으로 불변의 품질은 변경하지 않을 것에 동의합니다.
Robert Harvey

4

경우에 따라 대리 키가 필요하며 사용자에게 의미가 있습니다. 내가 가장 좋아하는 예는 "주문 번호"입니다. 주문 번호는 실제로 자연 키가 아닙니다. 자연 키는 타임 스탬프에 사용자를 더한 것일 수도 있고, 사용자가 타임 스탬프 단위 내에서 둘 이상의 주문을 생성 할 것으로 예상하는 경우에는 그 이상일 수도 있습니다.

그럼에도 불구하고, 사용자 는 주문 번호의 편리함을 이해 하고 기대합니다. 사용자에게 알려 주면 해를 끼치 지 않으며 많은 가치가 있습니다.

반면, 일부 대리 키는 사용자에게 의미가 없습니다. 물론, 건강 보험 회사에는 회원 ID, 생년월일, 이동 통신사 등을 기반으로 나를 식별하는 대리 키가 있지만 그 점에 대해서는 신경 쓰지 않습니다. 저의 고용주와 전 세계적으로 독특하지는 않습니다. 따라서 보험 회사의 대리 키).


사용자가 이해하고 상호 작용할 것으로 예상되면 더 이상 대리 키가 아닙니다. 서로 게이트 키는 비즈니스 의미가없는 것으로 정의됩니다. ID 번호라고해서 반드시 대리임을 의미하는 것은 아닙니다. 또한 "회원 ID, 생년월일 [...]을 (를) 기반으로 나를 식별하는 일부 대리 키"는 의미가 없습니다. 당신은 그들의 대리 키 (비즈니스 의미가 없음)는 자연 키를 구성 할 수있는 것들을 기반으로 당신을 식별한다고 말하고 있습니까?
Kyle McVay

종종 직원 시스템에서 동일한 이름을 가진 다른 사람들과 차별화되도록 직원 ID 번호가 부여됩니다. 보험 카드에는 회사 및 직원 ID가 표시 될 수 있습니다. 그러나 건강 보험 회사는 종종 고용주로부터받은 이름, 생년월일 및 직원 ID를 사용하는 대신 모든 시스템에서 사용할 수있는 자체 내부 ID를 생성합니다. 생성 된 키가 서로 게이트 또는 자연 키입니까? 요청한 사람에 따라 다름 ( en.wikipedia.org/wiki/Surrogate_key 에서 2 개의 대체 정의 확인 )
Alan Shutko

1

제대로 생성 된 GUID / UUID * 인 경우 대리 키만 노출해야합니다. 순차 대리 키 노출 은 OWASP Top 10 보안 문제에서 4 위입니다.

* 실제로 암호로 안전한 난수 또는 의사 난수 생성기에 의해 생성 된 것을 알지 않는 한 이러한 목적으로 제대로 생성되지 않았다고 가정하는 것이 가장 좋습니다.


2
GUID가 보안을 어떻게 향상시키는 지 확실하지 않습니다.
Robert Harvey

1
@RobertHarvey-나는 순차적이지 않으므로 추측 할 수 없기 때문에 가정합니다.
밥슨


@RobertHarvey가 명확 해졌습니다.
피터 테일러

1

테이블에 자연 키가없는 경우 서로 게이트 키는 이와 같은 행을 허용합니다.

surrogate_key  some_name
--
1              Wibble
2              Wibble
...
17             Wibble
...
235            Wibble

대리 키 대신 이러한 인공 키를 호출하지만이 질문에는 그 구별이 중요하지 않습니다.

이제 외래 키를 통해 이러한 대리 키를 참조하는 중요한 데이터가 있다고 가정하면 최종 사용자 는 대리 키 값을 모르는 경우 업데이트 할 행을 어떻게 알 수 있습니까?


"surrogate_key"열에 레이블을 지정하는 것은 약간 모순되지만 "서로 게이트 키 대신 인공 키"라고 말합니다. 비즈니스 의미가없고 고유 식별자로만 사용되므로 이러한 인공 키를 호출하는 경우이 키를 자연 화 (노출)하고 새 대리 키를 만들어야합니다. 즉, 자연 화 된 surrogate_key의 이름을 비즈니스 의미가있는 것으로 바꾸고 클라이언트에 노출시키고 내부 작업에 대한 진정한 대리자가 될 유사한 새 열을 만듭니다. 이상적이지는 않지만 진정한 대리를 노출하는 것보다 낫습니다.
Kyle McVay

@KyleMcVay : 모순되지 않습니다. 그것은 대리 의 의미를 존중하며 , 이것의 본질적인 아이디어는 "대체"이다. 대용 키의 자연 키에 대한 대체. (일반적으로 코드와 관계 이론은 이런 의미에서 서로 게이트 키 를 사용 합니다 .) 자연 키 없는 테이블 은 그러한 의미에서 서로 게이트 키를 가질 수 없습니다 . 그러나 다른 것 대신 사용되는 임의의 값을 가질 수 있습니다 . 그것이 제가 인공 키라고 부르는 것입니다.
Mike Sherrill 'Cat

귀하의 정의는 정확하지 않지만, 대리 키대리 라는 단어를 넘어서서 업계 고유의 추가 의미를 취 했다고 생각 합니다 . 고객에게 키를 공개하려는 경우 해당 키가 이제 비즈니스 의미를 가지고 있다고 주장합니다. 그것은 귀화 되었으며 , 이제 그것이 대표하는 개체의 논리적 일부로 간주되어야한다. 이 논리에 따르면 노출 된 대리 키와 같은 것은 없습니다. 인공 키를 공개하려는 경우 더 이상 대리 키가 아니므로 새 키가 필요합니다.
Kyle McVay

0

평신도의 말로 :

  • 대리자는 사용자에게 숨겨져 있어야합니다.
  • 다른 비즈니스 후보 키를 사용자에게 공개해야합니다.
  • 다른 후보 키가 없으면 PK를 표시해야합니다. 그러나이 경우 PK는 다른 열을 대체하지 않으므로 대리로 간주되지 않습니다.

왜 PK를 보여 주어야합니까? 나는 그것이 내 질문이라고 생각합니다-자동 생성 된 PK가 대리 키라고 제대로 불리는 지 여부는 접선입니다.
psr

1
@psr 질문 제목에 " 대리 키가 노출되었습니다"라고 표시되어 있습니다. 나는 거절했다. 그러나 다른 열쇠를 보여 주어야합니다. 다른 키가 없으면 가지고있는 유일한 키를 표시해야합니다. 이 경우 다른 키를 대신 할 수 없기 때문에 키가 실제로 서로 게이트가 아님을 분명히 알 수 있습니다.
Tulains Córdova

문제는 열을 추가해야하는지 또는 가지고있는 키를 표시해야하는지입니다.
psr

@psr 나는 더 명확하게하기 위해 내 대답을 다시 표현했습니다.
Tulains Córdova

1
나는 물질적으로 중요하지 않은 구별이라는 것을 알았습니다. 규칙에 따라 모든 테이블에 인공 키가 있고 인공 키만 조인에 참여하는 경우 (나의 원칙이기도 함) 다른 키가있을 수 있기 때문에 키가 대리라는 개념 사용 가능한 것은 중요하지 않습니다.
Robert Harvey

0

직접 또는 결함보고시 사용자에게 유용한 정보를 제공하는 필드 만 사용자에게 노출해야합니다.

반대로, 사용자가 수행하는 상호 작용을위한 레코드 (단순 또는 복합)를 식별하는 주요 수단 인 경우 항상 "대리 기본 키"를 공개해야합니다.


0

키를 최종 사용자에게 공개할지 여부는 중요하지 않습니다. 애플리케이션은 주문 ID를 아는 것만으로도 일반적으로 액세스 할 수 없었던 항목에 대한 액세스를 허용 할 수 없도록 필요한 권한을 수행해야합니다.

경고 : 서버 측 인증이 가능하거나 가능한 웹 기반 또는 n 계층 응용 프로그램을 가정합니다. SQL을 직접 실행하는 VB 앱이 있다면 이는 전혀 다른 문제입니다.


질문에서 언급했듯이 외래 키 관계를 유지하면서 레코드를 삽입하고 삭제할 수없는 것은 어떻습니까?
psr

키를 사용자에게 노출시키는 것과 어떤 관련이 있습니까? 어쩌면 나는 '노출'이라는 용어의 사용을 이해하지 못할 수도 있습니다. 나는 '사용자가 볼 수 있음'이라는 가정에서 일하고 있습니다.
GrandmasterB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.