분류 sql

기본 키란 무엇입니까? 이 중요한 데이터베이스 개념과 SQL에서 사용하는 방법을 배우십시오.

컨텐츠 정보

  • 조회 592 (작성일 )

본문

기본 키 SQL 자습서 – 데이터베이스에서 기본 키를 정의하는 방법


모든 위대한 이야기는 정체성의 위기로 시작됩니다. 위대한 제다이 마스터 루크는 확실하지 않습니다. -내가 어떻게 중요한 사람이 될 수 있습니까? 힘을 활용하는 방법을 가르쳐 주려면 힘을 가진 요다가 필요합니다.


https://www.freecodecamp.org/news/primary-key-sql-tutorial-how-to-define-a-primary-key-in-a-database/ 


오늘은 요다가 되겠습니다.


기본 키를 선택하고 ID 위기에 대처 한 다음 데이터베이스에서 기본 키를 만들기 위한 코드 샘플로 마무리합니다.


기본 키를 선택하는 방법 


당신은 루크가 정체성 위기를 가진 유일한 사람이라고 생각할 수도 있지만, 사실이 아닙니다. 데이터베이스를 만들 때 모든 것이 정체성 위기에 처해 있습니다. 이것이 바로 우리가 기본 키가 필요한 이유입니다. 위기를 해결합니다. 모든 사람을 찾는 방법을 알려줍니다.


당신이 정부라고 상상해 봅시다. 여러분은 각 시민을 디지털 방식으로 식별하려고 합니다. 따라서 이 데이터베이스에 대한 모든 정보를 작성합니다.


First Name
Last Name
Passport Number

여권 번호를 기본 키-모든 사람의 신원으로 선택합니다. 여권에 주소와 기타 모든 것이 있기 때문에 필요한 것만 알 수 있습니다. 여권 번호가 고유하다는 것을 알고 있으므로 기분이 좋고 이 시스템을 구현할 수 있습니다.


몇 년 후, 당신은 추악한 진실을 발견합니다. 나라 전체가 정체성 위기에 직면하고 있습니다.


누군가의 여권이 만료 될 때마다 새로운 여권을 받습니다. 그들의 정체성이 바뀝니다. 다른 시스템은 기존 여권 번호를 계속 사용하므로 이제 유령 사람들을 가리킵니다.


독창성으로는 충분하지 않습니다. 행 수명 동안 값이 변경되어서는 안됩니다. 


그리고 여권이 없는 사람들도 있습니다. 기본 키는 NULL 일 수 없으므로 시스템에 입력 할 수 없습니다. NULL 키를 가진 사람을 어떻게 식별 할 수 있습니까?


모든 행에는 식별자가 있어야 합니다. NULL은 허용되지 않습니다. 


다음 반복은 시간이 지나도 변하지 않는 식별자와 모든 사람이 가지고 있는 식별자를 찾는 것을 의미합니다. 인도에서는 이것이 Adhaar 카드로 판명되었습니다. 미국에서는 사회 보장 번호.


데이터베이스를 작성하는 경우 기본 키로 만드십시오.


때로는 그러한 키가 없습니다. 아직 사회 보장 번호가 없는 국가를 고려하여 모든 시민의 디지털 기록을 만들려고 합니다. 새로운 SSN을 만들거나 데이터베이스의 강력한 기능을 활용하고 대리 키를 사용할 수 있습니다.


서로 게이트 키에는 실제 키가 없습니다. 데이터베이스 내부의 숫자일 뿐입니다. 따라서 새로운 국가 에이 테이블이 있습니다.


userID
First Name
Last Name
Passport Number

여권 번호는 고유합니다. 사용자의 식별자를 얻으려면 여권 번호를 통해 얻을 수 있습니다.


사용자 ID는 절대 변경되지 않습니다. 여권 번호는 변경 될 수 있지만 항상 고유하므로 항상 올바른 사용자를 확보하십시오. userID는 이 국가에 존재하지 않는 사회 보장 번호의 대리자입니다.


재미있는 사실 : 여기에 있는 여권 번호도 후보 키입니다. 절대 변경되지 않은 경우 기본 키가 될 수 있습니다. 이것은 비즈니스 로직 구별입니다. 


기본 테이크 아웃은 다음과 같습니다. 기본 키를 선택할 때마다 ID 위기를 생각하십시오. 누군가가 나중에 자신의 식별자를 변경할 수 있습니까? 여러 사람이 같은 식별자를 가진 상태로 들어갈 수 있습니까?


나는 사람들을 예로 들어 설명합니다. 왜냐하면 그것은 정체성을 더 명확하게 하기 때문입니다. 우리는 모든 사람이 정체성을 가져야 한다는 것을 알고 있습니다. 이 생각을 데이터베이스에 전달하십시오. 모든 것이 정체성을 가지고 있기 때문에 정확히 기본 키가 필요한 이유입니다.


참고 : 때로는 여러 키를 기본 키로 함께 사용하는 것이 가능하고 바람직 할 수 있습니다. 이것은 복합 키입니다. 


이제 실제 코드 예제로 기본 키를 정의 해 봅시다. 여기서 해야 할 일이 두 가지 있습니다. 먼저 기본 키를 식별합니다. 그런 다음 데이터베이스에서 이를 정의하는 구문을 학습합니다.


실제 예 


Flexport와 매우 유사한 배송 시작을 가정 해 봅시다. 한 곳에서 다른 곳으로 이동해야 하는 패키지가 있으며 이를 운반하는 선박이 있습니다. 또한 이 패키지를 주문하는 고객이 있습니다.


고객을 위해 하나의 테이블, 패키지를 위한 테이블 및 운송을 위한 테이블이 필요하다고 생각합니다. 현재 어떤 패키지가 어디에 있는지 보여줍니다.


필요한 열과 기본 키가 무엇인지 생각하십시오. Flexport의 엔지니어 인 경우, 이것은 실제 질문입니다. 아무것도 주어지지 않고 모든 것이 현실 세계에서 발견됩니다.


이 정보가 주어지면 이러한 테이블을 다음과 같이 디자인합니다.


Customers: first_name, last_name, email, address (for deliveries to their location)
Packages: weight, content
Transportation: <package_primary_key>, Port, time

기본 키가 없습니다. 더 읽기 전에 그들에 대해 생각하십시오.


패키지의 경우 서로 게이트 PackageID를 선택하겠습니다. 패키지의 모든 속성 (무게, 부피, 밀도, 나이)을 나열하려고 시도 할 수 있었습니다. 패키지를 고유하게 식별하지만 실제로는 수행하기가 매우 어렵습니다. 사람들은 이것에 신경 쓰지 않고 패키지가 한 곳에서 다른 곳으로 이동하는 것을 걱정합니다.


따라서 임의의 숫자를 만들어 ID로 사용하는 것이 좋습니다. 이것이 바로 FedEx, UPS 및 모든 배송 서비스에서 바코드와 ID를 사용하는 이유입니다. 패키지를 추적하기 위해 생성 된 대리 키입니다.


고객을 위해 대리 고객 ID를 선택하겠습니다. 여기에도 다시 고객의 사회 보장 번호를 선택할 수 있는 옵션이 있었습니다. 그러나 고객은 이 정보를 나와 공유하고 싶지 않아 배송 할 수 있습니다. 따라서 내부적으로 키를 생성하고 고객에게 이 키에 대해 알리지 않고 계속 CustomerNo라고 부릅니다. 345681.


재미있는 이야기 : 나는 이 고객을 노출 시킨 몇몇 회사를 알고 있으며, 고객은 1 번을 얻었다 고 주장했다. 꽤 재미 있었다. 엔지니어들은 실제로 프론트 엔드 코드를 다음과 같이 변경해야 했다 : if (cust == 345681) print (1); 


운송의 경우 복합 PackageID + Port + 시간을 선택합니다. 좀 더 흥미롭습니다. 나는 여기에서도 대리를 만들 수 있었고 그것은 잘 작동 할 것입니다.


그러나 여기에 색인 생성의 마법이 있습니다. 기본 키는 자동으로 인덱스를 가져 오므로 검색이 기본 키보다 훨씬 효율적입니다.


이 데이터베이스를 검색 할 때 대부분의 쿼리는 "이 패키지는 어디에 있습니까?"형식입니다. 다시 말해,이 PackageID가 주어지면 현재 포트 및 시간을 알려주십시오. 기본 키의 일부로 PackageID가 없으면 PackageID에 대한 추가 인덱스가 필요합니다.


이 소리가 좋습니까? 마지막 단계로 이 3 개의 테이블을 SQL로 정의 해 봅시다. 구문은 사용 중인 데이터베이스에 따라 약간 다릅니다.


MySQL에서 기본 키 정의 


CREATE TABLE customers
( customerID  INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  last_name   VARCHAR(30) NOT NULL,
  first_name  VARCHAR(25) NOT NULL,
  email		  VARCHAR(50) NOT NULL,
  address     VARCHAR(300)
);
CREATE TABLE packages
( packageID  INT(15) NOT NULL AUTO_INCREMENT,
  weight     DECIMAL (10, 2) NOT NULL,
  content    VARCHAR(50),
  CONSTRAINT packages_pk PRIMARY KEY (packageID) # An alternative way to above,
  # when you want to name the constraint as well.
);
CREATE TABLE transportation
( package 	INT(15) NOT NULL,
  port  	INT(15) NOT NULL,
  time	 	DATE NOT NULL,
  
  PRIMARY KEY (package, port, time),
  FOREIGN KEY package
  	REFERENCES packages(packageID)
	ON DELETE RESTRICT    # It's good practice to define what should happen on deletion. In this case, I don't want things to get deleted.

);

PostgreSQL에서 기본 키 정의 


CREATE TABLE customers
( customerID  SERIAL NOT NULL PRIMARY KEY, # In PostgreSQL SERIAL is same as AUTO_INCREMENT - it adds 1 to every new row.
  last_name   VARCHAR(30) NOT NULL,
  first_name  VARCHAR(25) NOT NULL,
  address     TEXT,
  email		  VARCHAR(50) NOT NULL
);
CREATE TABLE packages
( packageID  SERIAL NOT NULL,
  weight     NUMERIC NOT NULL,
  content    TEXT,
  CONSTRAINT packages_pk PRIMARY KEY (packageID) # In PostgreSQL, this alternative way works too.
);
CREATE TABLE transportation
( package 	INTEGER NOT NULL,
  port  	INT(15) NOT NULL,
  time	 	DATE NOT NULL,
  
  PRIMARY KEY (package, port, time),
  
  FOREIGN KEY package
  	REFERENCES packages(packageID)
	ON DELETE RESTRICT    # It's good practice to define what should happen on deletion. In this case, I don't want things to get deleted.

);

크게 다르지 않습니까? 기본 사항을 이해하면 문서를 간단히 살펴보면 거의 모든 데이터베이스에 적용 할 수 있습니다. 열쇠는 무엇을 찾아야 하는 지를 아는 것입니다!