programing

전자 메일 주소를 기본 키로 사용하시겠습니까?

newstyles 2023. 4. 29. 08:55

전자 메일 주소를 기본 키로 사용하시겠습니까?

자동 증가 숫자와 비교할 때 전자 메일 주소가 기본 후보로 적합하지 않습니까?

우리 웹 애플리케이션은 시스템에서 고유한 전자 메일 주소가 필요합니다.그래서 저는 이메일 주소를 기본 키로 사용하려고 생각했습니다.하지만 제 동료는 문자열 비교가 정수 비교보다 느릴 것이라고 제안합니다.

이메일을 기본 키로 사용하지 않는 것이 타당한 이유입니까?

는 사용중다니입을 하고 있습니다.PostgreSQL.

문자열 비교가 int 비교보다 느립니다.그러나 전자 메일 주소를 사용하여 데이터베이스에서 사용자를 검색하는 경우에는 문제가 되지 않습니다.조인이 여러 개인 복잡한 쿼리가 있는 경우에는 문제가 되지 않습니다.

사용자에 대한 정보를 여러 테이블에 저장하는 경우, 사용자 테이블의 외부 키는 전자 메일 주소가 됩니다.즉, 전자 메일 주소를 여러 번 저장합니다.

저는 또한 이메일이 고유한 분야를 만들기 위한 나쁜 선택이라는 것을 지적할 것입니다. 이메일 주소를 공유하는 사람들과 심지어 소기업들도 있습니다.그리고 전화번호처럼, 이메일도 재사용될 수 있습니다.Jsmith@somecompany.com 은 1년 후에 존 스미스, 2년 후에 줄리아 스미스에게 쉽게 속할 수 있습니다.

이메일의 또 다른 문제는 이메일이 자주 바뀐다는 것입니다.만약 당신이 그것을 키로 다른 테이블에 가입한다면, 당신은 다른 테이블도 업데이트해야 할 것이고, 이것은 전체 고객 회사가 이메일을 변경할 때 상당한 성능 타격을 줄 수 있습니다(내가 본 바 있습니다).

기본 키는 고유하고 일정해야 합니다.

이메일 주소는 계절처럼 바뀝니다.조회에는 보조 키로 유용하지만 기본 키에는 적합하지 않습니다.

전자 메일 주소를 기본 키로 사용할 때의 단점:

  1. 조인을 수행할 때 속도가 느립니다.

  2. 외부 키가 게시된 다른 레코드는 더 큰 값을 갖게 되어 디스크 공간을 더 많이 차지합니다. (오늘날 디스크 공간의 비용을 고려할 때 레코드를 읽는 데 더 오래 걸리는 것을 제외하면 이는 아마도 사소한 문제일 것입니다.)#1 참조).

  3. 전자 메일 주소가 변경되어 이를 외부 키로 사용하는 모든 레코드가 업데이트될 수 있습니다.전자 메일 주소가 자주 변경되지 않기 때문에 성능 문제는 경미할 수 있습니다.더 큰 문제는 당신이 그것을 확실히 제공해야 한다는 것입니다.만약 당신이 코드를 작성해야 한다면, 이것은 더 많은 일이고 버그의 가능성을 소개합니다.데이터베이스 엔진이 "업데이트 캐스케이드 중"을 지원하는 경우, 이는 사소한 문제입니다.

전자 메일 주소를 기본 키로 사용할 경우의 이점:

  1. 일부 조인을 완전히 제거할 수 있습니다."마스터 레코드"에서 필요한 것이 전자 메일 주소인 경우, 추상 정수 키로 조인을 수행하여 검색해야 합니다.전자 메일 주소가 키인 경우 이미 가지고 있으므로 가입할 필요가 없습니다.이것이 당신에게 도움이 되는지는 이 상황이 얼마나 자주 발생하는지에 달려 있습니다.

  2. 임시 쿼리를 수행할 때 사람은 어떤 마스터 레코드가 참조되고 있는지 쉽게 확인할 수 있습니다.이는 데이터 문제를 추적할 때 큰 도움이 될 수 있습니다.

  3. 전자 메일 주소에 인덱스가 거의 필요하므로 기본 키로 설정하면 인덱스가 하나만 제거되므로 이제 업데이트할 인덱스가 두 개가 아닌 하나만 있기 때문에 삽입물의 성능이 향상됩니다.

제 겸손한 의견으로는, 어느 쪽이든 그것은 슬램덩크가 아닙니다.실제 키를 사용할 수 있을 때 자연 키를 사용하는 것을 선호하는 경향이 있습니다. 왜냐하면 사용하기 쉽고 대부분의 경우 단점은 별로 중요하지 않기 때문입니다.

아무도 이메일 주소가 비공개로 간주될 수 있는 문제에 대해 언급하지 않은 것 같습니다.키인 경우 은 "" "" "" "" "" "" ""와 같은 ...../Users/my@email.com사용자의 전자 메일 주소를 노출하지 않으려면 어떻게 해야 합니까?할 수 다른 방법을 , 고유한 하여 " 다과음 URL 들정값사고수을로으를합다찾니식아야수별방을"와 같은 을 만들 수 ..../Users/1그러면 결국 고유한 정수 값을 갖게 됩니다.

그것은 꽤 안 좋습니다.일부 전자 메일 공급자가 폐업했다고 가정합니다.그러면 사용자는 전자 메일을 변경하기를 원할 것입니다.전자 메일을 기본 키로 사용한 경우 사용자의 모든 외부 키가 해당 전자 메일을 복제하므로 변경하기가 매우 어렵습니다.

성능에 대한 고려 사항에 대해서는 언급조차 하지 않았습니다.

설정에 문제가 있는지는 모르겠지만 RDBMS에 따라 열의 값은 대소문자를 구분할 수 있습니다.포스트그레SQL 문서는 다음과 같이 말합니다. "열을 고유 또는 기본 키로 선언하면 암시적으로 생성된 인덱스는 대소문자를 구분합니다."즉, 전자 메일을 기본 키로 하는 테이블에서 검색에 대한 사용자 입력을 수락하고 사용자가 "John@Doe.com "을 제공하면 "john@doe.com "을 찾을 수 없습니다.

논리적 수준에서 이메일은 자연스러운 키입니다.물리적 수준에서 관계형 데이터베이스를 사용하는 경우 기본 키로 적합하지 않습니다.그 이유는 주로 다른 사람들이 언급한 성능 문제입니다.

이러한 이유로, 디자인을 적용할 수 있습니다.자연 키가 대체 키(UNIKE, NULL 아님)가 되고, 기본 키로 대리/인공/기술 키를 사용하면 자동 증가가 될 수 있습니다.

시스템 펀토아웃 요청,

만약 누군가가 그의 이메일 주소를 바꾸길 원한다면요?당신은 외국 키도 모두 바꿀 건가요?

그게 캐스케이드가 필요한 이유입니다.

숫자 대리 키를 기본 키로 사용하는 또 다른 이유는 플랫폼에서 인덱싱이 작동하는 방식과 관련이 있습니다.예를 들어 MySQL의 InnoDB에서는 테이블의 모든 인덱스에 기본 키가 앞에 추가되므로 속도와 크기를 위해 PK를 최대한 작게 만들 수 있습니다.또한 이와 관련하여 InnoDB는 기본 키가 순차적으로 저장될 때 더 빠르며 문자열은 도움이 되지 않습니다.

문자열을 대체 키로 사용할 때 고려해야 할 또 다른 사항은 원하는 실제 문자열의 해시를 사용하는 것이 일부 문자의 대문자와 소문자를 건너뛰는 것이 더 빠를 수 있다는 것입니다. (실제로 방금 말한 내용을 확인하기 위해 참고 자료를 찾다가 여기에 도착했습니다. 여전히 찾고 있습니다...)

네, 대신 정수를 사용하는 것이 더 좋습니다.전자 메일 열을 고유한 제약 조건으로 설정할 수도 있습니다.

다음과 같이:

CREATE TABLE myTable(
    id integer primary key,
    email text UNIQUE
);

예, 사용자가 전자 메일 주소를 업데이트하려고 하므로 잘못된 기본 키입니다.

정수 기본 키가 더 나은 또 다른 이유는 다른 테이블의 전자 메일 주소를 참조할 때입니다.주소 자체가 기본 키인 경우 다른 테이블에서 키로 사용해야 합니다.이메일 주소를 여러 번 저장합니다.

나는 우편물에 익숙하지 않습니다.기본 키는 큰 주제입니다.저는 이 사이트(stackoverflow.com )에서 몇 가지 훌륭한 질의응답을 보았습니다.

숫자 기본 키를 가지고 이메일 열에 고유 인덱스를 사용하면 성능이 향상될 수 있다고 생각합니다.전자 메일은 길이가 다양한 경향이 있으며 기본 키 색인에 적합하지 않을 수 있습니다.

여기와 여기에서 약간의 독서.

개인적으로 데이터베이스를 설계할 때 기본 키에 대한 정보를 사용하지 않습니다. 나중에 정보를 변경해야 할 가능성이 높기 때문입니다.기본 키를 제공하는 유일한 이유는 클라이언트 측에서 대부분의 SQL 작업을 수행하는 것이 편리하기 때문이며, 항상 자동 증분 정수 유형을 선택했습니다.

저는 이것이 약간 늦은 입력이라는 것을 알지만, 저는 사람들이 이메일 계정을 포기하고 서비스 제공자들이 다른 사람이 그것을 사용할 수 있도록 주소를 복구한다는 것을 추가하고 싶습니다.

@HLGEM이 지적했듯이, "Jsmith@somecompany.com 은 1년 후에 John Smith에게 쉽게 속할 수 있고 2년 후에 Julia Smith에게 속할 수 있습니다." 이 경우 John Smith가 귀하의 서비스를 원할 경우, 귀하는 그의 이메일 주소 사용을 거부하거나 Julia Smith와 관련된 모든 기록을 삭제해야 합니다.

만약 당신이 기록을 삭제해야 하고 그것들이 현지 법률에 따라 사업의 재무 이력과 관련이 있다면 당신은 곤경에 처할 수 있습니다.

따라서 이메일 주소, 번호판 등과 같은 데이터는 아무리 고유한 것처럼 보이더라도 사용자가 처리할 시간이 없을 수도 있는 흥미로운 문제를 제공할 수 있기 때문에 기본 키로 사용하지 않습니다.

적용 가능한 데이터 규제 법률을 고려해야 할 수도 있습니다.이메일은 개인 정보이며, 예를 들어 사용자가 EU 시민인 경우 GDPR에 따라 사용자가 기록에서 정보를 삭제하도록 지시할 수 있습니다(어느 국가에 기반을 두든 상관없이 이는 적용됨).

참조 무결성 또는 감사와 같은 과거의 이유로 레코드 자체를 데이터베이스에 보관해야 하는 경우 대리 키를 사용하면 모든 개인 데이터 필드를 NULL로 만들 수 있습니다.개인 데이터가 기본 키인 경우 이는 분명 쉽지 않습니다.

동료의 말이 맞습니다.기본 키에 자동 증분 정수를 사용합니다.

응용 프로그램 수준에서 전자 메일 고유성을 구현하거나 전자 메일 주소 열을 고유한 열로 표시하고 해당 열에 인덱스를 추가할 수 있습니다.

필드를 고유하게 추가하면 조인 및 외부 키 제약 조건 검사를 수행할 때가 아니라 해당 테이블에 삽입할 때만 문자열 비교 비용이 발생합니다.

물론 데이터베이스 수준에서 애플리케이션에 제약 조건을 추가하면 애플리케이션의 유연성이 저하될 수 있습니다.응용프로그램이 고유하거나 비어 있지 않아야 한다는 이유만으로 "고유" 또는 "null이 아님" 필드를 만들기 전에 항상 충분히 고려해야 합니다.

GUID를 기본 키로 사용...이렇게 하면 INSERT를 수행할 때 프로그램에서 이 키를 생성할 수 있으며 기본 키가 무엇인지 알아내기 위해 서버로부터 응답을 받을 필요가 없습니다.또한 테이블과 데이터베이스 전체에서 고유하며 언젠가 테이블을 잘라내고 자동 증분이 1로 재설정되면 어떤 일이 발생할지 걱정할 필요가 없습니다.

정수 기본 키를 사용하여 성능을 향상시킬 수 있습니다.

정수 기본 키를 사용해야 합니다.전자 메일 열이 고유해야 하는 경우 해당 열에 고유 인덱스를 설정하는 것이 어떻습니까?

기본 키로 int 값이 아닌 경우 대용량 데이터에서 삽입 및 검색 속도가 매우 느려집니다.

기본 키는 정적 속성을 선택해야 합니다.전자 메일 주소는 정적이지 않고 여러 후보가 공유할 수 있으므로 기본 키로 사용하는 것은 좋지 않습니다.또한 전자 메일 주소는 일반적으로 특정 길이의 문자열로, [len(email_address)>len(unique_id)]을 사용할 수 있으므로 더 많은 공간이 필요하고 최악의 경우에는 외부 키로 여러 번 저장됩니다.결과적으로 성능 저하로 이어질 수 있습니다.

그것은 테이블에 따라 다릅니다.표의 행이 전자 메일 주소를 나타내는 경우 전자 메일이 최상의 ID입니다.그렇지 않다면, 이메일은 좋은 아이디가 아닙니다.

전자 메일이 고유해야 하는 문제인 경우 해당 열로 고유한 인덱스를 만들 수 있습니다.

전자 메일은 고유 인덱스 후보로 적합하지만 기본 키가 아닌 경우, 예를 들어 기본 키인 경우 연락처의 전자 메일 주소를 변경할 수 없습니다.당신의 가입 문의도 더 느릴 것 같습니다.

전자 메일 주소를 기본 키로 사용하지 않고, 전자 메일을 고유하게 유지하되 기본 키로 사용하지 마십시오. 사용자 ID 또는 사용자 이름을 기본 키로 사용합니다.

언급URL : https://stackoverflow.com/questions/3804108/use-email-address-as-primary-key