IT

데이터베이스 테이블에는 프라이머리 키가 없을 수 있습니까?

itgroup 2022. 11. 7. 21:29
반응형

데이터베이스 테이블에는 프라이머리 키가 없을 수 있습니까?

관계형 데이터베이스(MySQL/SQL SERVER 등)의 테이블에 프라이머리 키가 없을 수 있는지 알려 주시겠습니까?

예를 들어, 나는 테이블을 가질 수 있다.day_temperature등록하는 곳temperature그리고.time. 이러한 테이블의 프라이머리 키를 가질 이유는 없습니다.

엄밀히 말하면, 이러한 테이블을 선언할 수 있습니다.

하지만 당신의 경우,time로 만들어야 한다.PRIMARY KEY왜냐하면 같은 시간에 다른 온도를 갖는 것은 아마도 잘못된 것이고 같은 온도를 한 번 이상 갖는 것은 아마도 소용이 없기 때문이다.

논리적으로 각 테이블에는PRIMARY KEY두 개의 기록을 구별할 수 있게 해줬습니다.

데이터에 후보 키가 없는 경우 대리 키를 생성하기만 하면 됩니다.AUTO_INCREMENT,SERIAL또는 데이터베이스가 제공하는 모든 것)을 클릭합니다.

그 이유를 설명하자면PRIMARY KEY무거운 대상인 로그 또는 유사한 테이블입니다.DML지표가 있으면 허용 수준을 넘어 퍼포먼스에 영향을 미칩니다.

그렇듯이 상황에 따라 다르죠.

테이블에 기본 키가 있을 필요는 없습니다.훨씬중요한 것은 정확한 지표를 갖는 것이다.데이터베이스 엔진은 기본 키가 인덱스에 미치는 영향(즉, 기본 키 열/열에 대한 고유한 인덱스 생성)에 따라 달라집니다.

그러나 귀하의 경우(및 기타 99%의 경우)에는 다음과 같은 새로운 자동 증가 고유 컬럼을 추가합니다.temp_id프라이머리 키를 대신할 수 있게 하는 거죠

를 들어 레코드(복제 레코드)의 검색이나 삭제 등, 이 테이블의 유지보수가 훨씬 쉬워집니다.테이블마다 문제를 해결할 시간이 생기기 때문입니다.

(동시에 등) 엔트리가 중복될 가능성이 없고 특정 레코드 또는 레코드 범위를 조회할 필요가 없는 경우 키 없이 할 수 있습니다.

PK는 필요하지 않지만 PK를 사용하는 것이 좋습니다.이는 고유한 행을 식별하는 가장 좋은 방법입니다.경우에 따라서는 자동 증분 int PK가 아니라 다른 항목에 PK를 생성합니다.예를 들어, 한 번에 하나의 고유한 행만 있는 경우 시간에 따라 PK를 생성해야 합니다.또한 시간을 기준으로 검색 시간을 단축하고 고유성을 보장합니다(데이터 무결성이 침해되지 않음을 확인할 수 있습니다.

MySQL에서 InnoDB 테이블에 기본 키를 추가하지 않더라도 MySQL은 숨겨진 클러스터 인덱스를 해당 테이블에 추가합니다.기본 키를 정의하지 않으면 MySQL은 모든 키 열이 NULL이 아닌 첫 번째 UNIQURE 인덱스를 찾고 InnoDB는 이를 클러스터형 인덱스로 사용합니다.

테이블에 프라이머리 키 또는 적절한 UNIQUICE 인덱스가 없는 경우 InnoDB는 행 ID 값을 포함하는 합성 컬럼에 클러스터화된 인덱스 GEN_CLUST_INDEX를 내부적으로 생성합니다.

https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html

특히 시간/온도 판독값이 중복될 가능성이 있는 경우 대리/자동 증가 키를 포함합니다.중복 행을 고유하게 식별할 수 있는 다른 방법은 없습니다.

그러면 시간이 주요 키가 됩니다.날짜 범위를 기준으로 데이터를 쿼리할 수 있도록 해당 열을 인덱싱하는 데 도움이 됩니다.PK는 궁극적으로 행을 고유하게 만들므로 예제에서는 datetime이 PK입니다.

테이블 중 하나에서 같은 질문을 받았어요.

문제는 PK가 테이블의 모든 행으로 구성되어야 하는데 각 행을 삽입하면 테이블 크기가 매우 빠르게 증가한다는 것입니다.

PK를 사용하지 않고 검색할 행에만 인덱스를 두도록 선택했습니다.

mysql에서 데이터베이스를 복제할 때 프라이머리 키가 없는 테이블로 인해 복제 지연이 발생할 수 있습니다.

http://lists.mysql.com/mysql/227217

ROW 또는 MIXED를 사용할 때 가장 일반적인 실수는 복제할 모든 테이블에 PRIMAY KEY가 있는지 확인하지 못한 것입니다.이는 ROW 이벤트(위에서 설명한 이벤트 등)가 슬레이브에 전송되고 마스터 복사본과 슬레이브의 테이블 복사본 모두 PRIMAY KEY가 테이블 위에 없는 경우 복제를 변경할 고유한 행을 쉽게 식별할 수 없기 때문입니다.

당신의 답변에 따르면 저는 다음 세 가지 옵션을 고려하겠습니다.

  • 양쪽 콜에 PK를 설정합니다.이렇게 하면 각 콜에 대해 1개의 온도만 존재할 수 있으며 그 반대도 마찬가지입니다.이 솔루션에서는 동일한 온도 또는 동일한 시간에 여러 행을 사용할 수 있으므로 동일한 온도 AND 시간을 가진 두 행이 없습니다.
  • PK는 전혀 넣지 않고 두 콜에 고유한 인덱스를 붙입니다.두 콜을 모두 포함하는 하나의 고유 인덱스.이렇게 하면 온도와 시간에 null이 허용되지만 인덱스를 유지할 공간이 늘어납니다.

이 두 가지 옵션은 읽기량이 많은 경우 검색 속도에 가장 적합하지만 인덱스를 업데이트해야 하므로 삽입 속도가 낮아집니다.

  • 인덱스도 PK도 넣지 마십시오. 삽입에는 최적이지만 검색에는 매우 좋지 않습니다.는 다른 메커니즘에 의해 취득되는 로깅 또는 dups 체크에 디바이스 삽입이 필요하지 않은 로깅에 도움이 됩니다.

또한 여기서 카디널리티를 고려하고 자동 증가된 숫자를 사용할 경우의 향후 결과에 대해 생각하는 것이 매우 중요합니다.삽입을 많이 할 계획이라면 서명되지 않은 자동 증가 비긴트라도 결국 소진될 수 있기 때문에 위험합니다.이 예에서는 데이터를 매일 얼마나 오랫동안 저장할 수 있을까요?만약 당신이 매분마다 온도를 저장한다면 이것은 문제가 될 것입니다.극단적인 예로 들겠습니다.

테이블에서 필요한 것을 생각하는 것이 가장 좋다고 생각합니다.1년 내내 임시직으로 1분도 빠짐없이 '저장 후 처리'를 하는 거야?이 표를 비즈니스 로직의 실시간 의사결정에 자주 사용할 예정입니까?실시간(oltp)에 필요한 데이터와 거의 필요하지 않은 장기 보존 데이터를 분리하여 검색 지연 시간을 길게 하는 것이 가장 좋다고 생각합니다.데이터를 2개의 다른 테이블로 복제할 수도 있습니다.하나는 인덱스가 높고 가끔 지워져 카디널리티를 제어할 수 있습니다.다른 하나는 인덱스가 거의 없는 마그네틱 디스크에 저장됩니다(메인 F에서 다른 F로 스키마를 전송할 수 있습니다).

기본 키가 필요 없는 테이블의 더 좋은 예가 있습니다. 바로 조이너 테이블입니다.예를 들어 "capabilities"라고 불리는 테이블과 "groups"라고 불리는 테이블이 있습니다.모든 그룹이 가지고 있을 가능성이 있는 모든 기능을 나타내는 joiner 테이블이 필요합니다.그것은 기본적인 것입니다.

create table capability_group
(  capability_id varchar(32),
    group_id     varchar(32));

There is no reason to have a primary key on that, because you never address a single row - you either want all the capabilities for a given group, or all the groups for a given capabilty. It would be better to have a unique constraint on (capabilty_id,group_id), and separate indexes on both fields.

ReferenceURL : https://stackoverflow.com/questions/2515596/can-a-database-table-be-without-a-primary-key

반응형