Postgres 도구 모음에 대한 강력한 보완: 테이블 상속

10555 단어 postgres
표 계승은 Postgres에서 자주 사용되지 않는 기능이지만 데이터 검색과 데이터베이스 관리를 통해 시간을 절약할 수 있다.
본고에서, 나는 Postgres에서 계승을 어떻게 사용하는지 소개하고, 계승을 언제 사용하는지 예시를 제공할 것이다.
이 문서의 예제try Arctype's free SQL editor에 따라 Postgres 데이터베이스에 빠르게 연결합니다.
Try Arctype today

Postgres의 표 계승은 무엇입니까?


계승은 대상을 대상으로 프로그래밍하는 주요 원칙 중의 하나다.이것은 공유 속성을 가지도록 다른 대상에서 하나의 대상을 파생시키는 과정이다.
PostgreSQL의 계승을 통해 다른 테이블을 기반으로 하위 테이블을 만들 수 있습니다. 하위 테이블은 부모 테이블의 모든 열을 포함합니다.
다양한 유형의 주택을 저장하는 데 사용되는 데이터베이스를 살펴보자.
우리는 모든 가정에 침실, 욕실, 주방 같은 것들이 있다는 것을 안다.우리는 이 공유 속성을 저장하기 위해 부모 테이블을 만들 수 있다.
지금 우리는 발코니가 있는 집을 위해 청사진을 추가하고 싶다고 가정해 봅시다.이 새 청사진은 우리가 가지고 있는 것과 똑같지만, 새 방이 하나 있다.우리는 전체 청사진을 다시 만드는 것이 아니라 아버지 시계를 계승하는 새 '자' 시계를 만들 수 있다.
이제 주부 청사진의 사본이 생겼는데, 중복된 청사진을 만들 필요가 없는 새로운 '천정' 프로젝트를 포함하고 있다.

내가 왜 상속을 사용해야 합니까?


두 가지 주요 이점은 다음과 같습니다.
  • 고성능 쿼리
  • 보다 편리한 데이터베이스 관리
  • 보다 효율적인 쿼리
    상속은 데이터를 비교적 작은 표로 나누는데, 이 표들은 부모의 일부 필드를 상속한다.이것은 실제로 데이터에 대해 구역을 나누어 검색 데이터의 속도를 높였다.BETWEEN 두 날짜의 데이터를 가져오고 있다고 가정하십시오.year_sales라는 부표와 계승표가 있는데 매달의 데이터를 포함한다.
    검색2020-10-12020-10-15 사이의 모든 매출액을 검색하라는 명령은 10월의 표만 스캔한다.
    계승된 표는 관리하기 쉬운 색인도 만들었다.모든 단독 테이블에 포함된 데이터가 비교적 적기 때문에 색인과 무색인의 검색 속도를 가속화시켰다.
    더욱 편리한 데이터베이스 관리
    미래에 모델 변경을 하는 것은 더욱 쉽다. 왜냐하면 아버지 시계를 한 번 변경한 후에 이를 모든 계승 시계에 전파하기 때문이다.이것은 시간을 절약하고 의외의 의견 차이의 가능성을 줄였다.
    유지보수 명령을 실행합니다. 예를 들어 완전히 비우거나 인덱스 계승된 표를 다시 인덱스하면 다른 데이터를 막지 않고 진행됩니다.

    예 1: 상속 월별 스토리지 테이블 통계 사용


    표 계승에서 가장 자주 사용하는 용례 중 하나는 월별로 구분된 정보를 저장하는 것이다.이것은 데이터에 대해 구역을 나누어 더욱 빠른 조회를 실현하는 데 도움이 된다.
    이 솔루션을 사용하여 아키텍처를 구축했습니다.
    1. 프로세스 집행 감사
    상속된 표는 시스템에 연속적으로 불러오거나 마운트하는 데이터, 사용자 요청과 계산 과정, 그리고 시스템의 건강 상태를 감시하는 데 사용되는 기타 중요한 정보를 추적하는 데 사용된다.
    2. 응용 프로그램의 핵심 모듈에 대한 사용자 조작 심사
    시스템의 데이터를 누가 변경했는지, 언제 변경했는지 추적하는 감사 시스템을 만들 수 있습니다.만약 시스템에 많은 사용자가 있다면 매우 많은 데이터가 있을 것이다.따라서 데이터 접근 속도를 높이기 위해 표 계승을 사용하는 것이 더욱 효과적이다.
    우리 예를 하나 봅시다.
    먼저 생성 모드 "example1":
    CREATE SCHEMA example1
        AUTHORIZATION postgres;
    
    그런 다음 상위 로깅 테이블을 만듭니다.
    CREATE TABLE example1.logging
    (
        id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
        event_name character varying NOT NULL,
        start_time timestamp(6) without time zone NOT NULL,
        end_time timestamp(6) without time zone NOT NULL,
        CONSTRAINT february_log_pkey PRIMARY KEY (id, start_time, end_time)
    )
    TABLESPACE pg_default;
    
    상위 테이블의 필드를 상속하는 특정 월과 연도의 하위 로그 레코드 테이블을 만듭니다.
    CREATE TABLE example1.january_log_2021
    (
        CONSTRAINT start_time CHECK (start_time BETWEEN '2021-01-01' and '2021-01-31')
    )
        INHERITS (example1.logging)
    TABLESPACE pg_default;
    
    이 코드는 CHECK 명령을 사용하여 '시작 시간' 열에 검사 제약을 포함합니다.이렇게 하면 날짜와 시간을 1월 이내로 유지할 수 있다.
    2021년 1월 기록표 작성:
    INSERT INTO example1.january_log_2021(id,
        event_name, start_time, end_time)
        VALUES 
               (1, 'Log in', '2021-01-11 03:26:11', '2021-01-11 03:26:13'),
               (2, 'Log out', '2021-01-03 12:11:17', '2021-01-03 12:11:18'),
               (3, 'Upload file xml', '2021-01-06 16:14:28', '2021-01-06 16:14:59'),
               (4, 'Delete data', '2021-01-05 23:01:55', '2021-01-05 23:01:58');
    
    SELECT 명령을 사용하여 데이터가 성공적으로 삽입되었는지 확인할 수 있습니다.
    SELECT * FROM example1.january_log_2021;
    

    각 하위 테이블의 데이터도 자동으로 상위 테이블에 추가됩니다.

    예#2: 레거시를 사용하여 선박의 이동 추적


    내가 계승을 사용하는 또 다른 예는 지리적 위치를 바탕으로 선박과 그 이동에 대한 정보를 저장하는 것이다.
    배마다 공통점과 독특한 가치관이 있다.이러한 특성 때문에 나는 계승을 이용하여 모델을 설계하고 부표를 바탕으로 모든 비행선에 단독 표를 만들기로 결정했다.
    상속 모델을 사용하면 다음과 같은 이점을 얻을 수 있습니다.
  • 응용 프로그램이 선박 운동 지도를 구축할 때 단일 선박의 표를 참고하여 보고 구축과 모니터링의 속도를 향상시켰다.
  • 일부 선박 유형에 새로운 특정 필드를 추가할 때 모든 표를 변경할 필요가 없습니다.
  • 우리는 단일 요청으로 모든 선박의 기선 데이터를 검색할 수 있다.
  • 우리는 이렇게 했다.
    먼저 "test"라는 새 모드를 만듭니다.
    CREATE SCHEMA test
        AUTHORIZATION postgres;
    
    다음을 사용하여 데이터베이스를 만듭니다.
    CREATE TABLE test.ship
    (
        AIS_name text NOT NULL,
        type text NOT NULL,
        flag text NOT NULL,
        IMO character varying NOT NULL,
        MMSI character varying NOT NULL,
        callsign character varying NOT NULL,
        year_built character varying NOT NULL,
        length character varying NOT NULL,
        width character varying NOT NULL,
        draught character varying NOT NULL,
        speed character varying NOT NULL,
        AIS_class character varying NOT NULL,
        cargo character varying,
        CONSTRAINT ship_pkey PRIMARY KEY (MMSI)
    )
    
    TABLESPACE pg_default;
    
    테이블 "sail ship"을 생성합니다. 이 테이블은 "ship"의 하위 테이블입니다.
    CREATE TABLE test.sail_ship
    (
        -- Inherited from table test.ship: AIS_name text NOT NULL,
        -- Inherited from table test.ship: type text NOT NULL,
        -- Inherited from table test.ship: flag text NOT NULL,
        -- Inherited from table test.ship: IMO character varying NOT NULL,
        -- Inherited from table test.ship: MMSI character varying NOT NULL,
        -- Inherited from table test.ship: callsign character varying NOT NULL,
        -- Inherited from table test.ship: year_built character varying NOT NULL,
        -- Inherited from table test.ship: length character varying NOT NULL,
        -- Inherited from table test.ship: width character varying NOT NULL,
        -- Inherited from table test.ship: draught character varying NOT NULL,
        -- Inherited from table test.ship: speed character varying NOT NULL,
        -- Inherited from table test.ship: AIS_class character varying NOT NULL,
        -- Inherited from table test.ship: cargo character varying,
        id_sail integer NOT NULL,
        course text NOT NULL,
        navigation_status text NOT NULL,
        CONSTRAINT sail_ship_pkey PRIMARY KEY (id_sail)
    )
        INHERITS (test.ship)
    TABLESPACE pg_default;
    
    지금 양식'범선'을 작성하세요.
    INSERT INTO test.sail_ship(AIS_name, type, flag, IMO, MMSI, callsign, year_built, length, width, draught, speed, AIS_class, cargo, id_sail, course, navigation_status)
        VALUES ('A P T JAMES', 'Ferry', 'Trinidad and Tobado', '9877717', '362254000', '9YNM', '2020', '94 m', '26 m', '2.9 m/', '13.1 kn/20.2 kn', '-', '-', 1, '-', '-'),
               ('MOZART', 'Container ship', 'Liberia', '9337274', '636018378', 'A8MA9', '2007', '222 m', '30 m', '10.4 m /', '12.9 kn / 23.6 kn', '-', 'Containers', 2, '-', '-'),
               ('ALIANCA SKY', ' Bulk carrier', 'Liberia', '9128441', '636014513', 'A8UK6', '1997', '186 m', '30 m', '8.8 m /', '10.2 kn / 17.2 kn', '-', 'Agricultural Commodities', 3, '-', '-'),
               ('XXX7', 'Ship', 'China', '-', '412444890', 'BVMY5', '-', '-', '-', '-/', '60.5 kn / 66.1 kn', '-', '-', 4, '-', '-');
    
    테이블 "sail ship"은 모 테이블 "ship"의 모든 열을 상속합니다.
    또한 부모 테이블에 데이터를 추가하여 어떤 일이 발생할지 살펴봅니다.
    INSERT INTO test.ship(AIS_name, type, flag, IMO, MMSI, callsign, year_built, length, width, draught, speed, AIS_class, cargo)
        VALUES ('A P T JAMES', 'Ferry', 'Trinidad and Tobado', '9877717', '362254000', '9YNM', '2020', '94 m', '26 m', '2.9 m/', '13.1 kn/20.2 kn', '-', '-');
    

    그림에서 보듯이 이 필드는 추가되었지만, 메인 키는 중복되어 더 이상 유일한 것이 아니다
    이것은 대학원생 유전의 경고이다.하위 테이블에 추가할 때 유일한 키를 위반하더라도 오류가 발견되지 않았습니다.ONLY 조작부호를 사용하여'ship'테이블에서 데이터를 검색하면 하위 테이블에서 중복된 항목을 삭제할 수 있습니다.
    여기에 ONLY 키워드는 조회가'ship'표에만 적용되고 계승 차원 구조에서ship 아래의 표에는 적용되지 않는다는 것을 나타낸다.
    SELECT AIS_name, type, flag, year_built FROM ONLY test.ship;
    

    PostgreSQL 상속 시 주의해야 할 사항

  • 명령을 사용할 수 없음RENAME 명령은 ALTER TABLE을 하위 테이블에 적용합니다.
  • 메인 키와 외부 키의 유일성은 계승되지 않는다.상속 메커니즘에서는 상속 계층의 테이블 간에 INSERT 또는 COPY 명령의 데이터를 자동으로 배포할 수 없습니다.지정한 표에만 삽입하고 다른 내용은 삽입하지 않습니다.
  • 사용자는 부모 테이블과 하위 테이블에 대한 접근 권한을 동시에 가져야 한다.
  • 열은 수동으로 삭제해야 합니다.캐스케이드 삭제 시 부모 테이블에 DROP COLUMN 명령을 사용하면 하위 테이블에 영향을 주지 않습니다.
  • 결론


    이 문서에서는 다음을 설명합니다.
  • 박사후 어떻게 전승하는가
  • 왜 응용 프로그램에서 계승을 사용해야 하는가
  • 실제 응용 프로그램에서 계승을 어떻게 사용하는지 두 가지 예
  • SQL 편집기를 찾고 있다면 데이터베이스를 보다 쉽게 사용할 수 있습니다try Arctype today for free.
    Try Arctype today

    좋은 웹페이지 즐겨찾기