programing

PostgreSQL에서 상속된 테이블을 사용해야 하는 경우

telebox 2023. 5. 2. 22:34
반응형

PostgreSQL에서 상속된 테이블을 사용해야 하는 경우

상속된 테이블을 사용해야 하는 상황은 무엇입니까?저는 그것들을 매우 짧게 사용하려고 노력했고 상속은 OOP 세계에서 같지 않았습니다.

저는 다음과 같이 작동한다고 생각했습니다.

users에는 모든 사용자 수준에 필요한 모든 필드가 있습니다.과 같은 표moderators,admins,bloggers등 그러나 부모로부터 필드를 확인하지 않았습니다.예를들면users 상속된 전자메필있상속됨고가드일▁email▁has가 있습니다.bloggers둘 다 은 아닙니다.users그리고.bloggers 테이블 즉, 두 테이블 모두에 전자 메일 필드를 추가하는 것과 같습니다.

row_is_deleted, created_at, modified_at와 같이 일반적으로 사용되는 필드만 생각할 수 있었습니다.상속된 테이블의 용도는 이것뿐입니까?

포스트그레스에서 테이블 상속을 사용하는 몇 가지 주요 이유가 있습니다.

통계에 필요한 표가 있다고 가정해 보겠습니다. 이 표는 매월 작성되고 작성됩니다.

statistics
    - statistics_2010_04 (inherits statistics)
    - statistics_2010_05 (inherits statistics)

이 예제에서는 각 테이블에 2,000.000개의 행이 있습니다.각 테이블에는 일치하는 달의 데이터만 저장되도록 CHECK 제약 조건이 있습니다.

그렇다면 상속을 멋진 기능으로 만드는 것은 무엇입니까? 데이터를 분할하는 것이 멋진 이유는 무엇입니까?

  • 성능: 데이터를 선택할 때 x와 Y 사이의 날짜가 있는 통계에서 *를 선택하고 Postgres는 해당 테이블만 사용합니다.예: 선택 * '2010-04-01'과 '2010-04-15' 사이의 날짜가 statistics_2010_04 테이블만 스캔하고 다른 모든 테이블은 터치되지 않습니다. 빠른 속도로!
  • 인덱스 크기:칼럼 날짜에 지방 지수가 큰 큰 지방 테이블은 없습니다.매월 소규모 테이블과 소규모 인덱스, 더 빠른 읽기가 가능합니다.
  • 유지 관리:다른 모든 데이터를 잠그지 않고 매월 테이블에서 진공 전체, 재색인, 클러스터를 실행할 수 있습니다.

테이블 상속을 성능 향상 도구로 올바르게 사용하려면 postgresql 설명서를 참조하십시오.각 테이블에 CHECK 제약 조건을 설정하여 데이터베이스에 데이터가 분할(분할)되는 키를 알려주어야 합니다.

특히 월별로 그룹화된 로그 데이터를 저장할 때는 테이블 상속을 많이 사용합니다.힌트: 변경되지 않는 데이터(로그 데이터)를 저장하는 경우 CREATE INDEX ON()을 사용하여 생성하거나 인덱스(필 팩터=100);즉, 인덱스에 업데이트 공간이 예약되지 않습니다. 디스크에서 인덱스가 더 작습니다.

fillfactor기본값은 100(http://www.postgresql.org/docs/9.1/static/sql-createtable.html 에서)입니다.

fillfactor 10에서 입니다. 패킹입니다. 100(완전 패킹)은 다음과 같습니다. 100(완전 패킹)입니다.

"표 상속"은 "계급 상속"과 다른 것을 의미하며, 그들은 다른 목적을 수행합니다.

Postgres는 데이터 정의의 전부입니다.때로는 매우 복잡한 데이터 정의가 필요합니다.OOP(일반적인 Java 색상의 사물 의미)는 단일 원자 구조의 데이터 정의에 행동을 종속시키는 것입니다.여기서는 '상속'이라는 단어의 목적과 의미가 크게 다릅니다.

OOP Land에서 정의할 수 있습니다(여기서는 구문 및 의미론에 대해 매우 느슨함).

import life

class Animal(life.Autonomous):
  metabolism = biofunc(alive=True)

  def die(self):
    self.metabolism = False

class Mammal(Animal):
  hair_color = color(foo=bar)

  def gray(self, mate):
    self.hair_color = age_effect('hair', self.age)

class Human(Mammal):
  alcoholic = vice_boolean(baz=balls)

이에 대한 표는 다음과 같습니다.

CREATE TABLE animal
  (name       varchar(20) PRIMARY KEY,
   metabolism boolean NOT NULL);

CREATE TABLE mammal
  (hair_color  varchar(20) REFERENCES hair_color(code) NOT NULL,
   PRIMARY KEY (name))
  INHERITS (animal);

CREATE TABLE human
  (alcoholic  boolean NOT NULL,
   FOREIGN KEY (hair_color) REFERENCES hair_color(code),
   PRIMARY KEY (name))
  INHERITS (mammal);

하지만 그 행동들은 어디에 있을까요?그들은 어디에도 맞지 않습니다.데이터베이스는 절차 코드가 아닌 데이터와 관련이 있기 때문에 데이터베이스 세계에서 논의되는 "개체"의 목적은 아닙니다.계산을 수행하기 위해 데이터베이스에 함수를 작성할 수 있지만(종종 매우 좋은 아이디어이지만 이 경우에는 적합하지 않습니다) 함수는 방법과 같지 않습니다. 지금 말씀하시는 OOP 형태로 이해되는 방법은 의도적으로 덜 유연합니다.

도식적 장치로서 상속에 대해 한 가지 더 지적해야 할 사항이 있습니다.Postgres 9.2 이후에는 모든 파티션/테이블 패밀리 구성원에서 외부 키 제약 조건을 한 번에 참조할 수 없습니다.수표를 작성하여 이를 수행하거나 다른 방법으로 해결할 수 있지만 기본 제공 기능은 아닙니다(복잡한 인덱싱 문제로 귀결되며 아무도 자동화에 필요한 비트를 작성하지 않았습니다).이러한 목적으로 테이블 상속을 사용하는 대신, 종종 객체 상속에 대해 데이터베이스에서 더 잘 일치하는 것은 테이블에 대한 스키마 확장을 만드는 것입니다.이와 같은 것:

CREATE TABLE animal
  (name       varchar(20) PRIMARY KEY,
   ilk        varchar(20) REFERENCES animal_ilk NOT NULL,
   metabolism boolean NOT NULL);

CREATE TABLE mammal
  (animal      varchar(20) REFERENCES animal PRIMARY KEY,
   ilk         varchar(20) REFERENCES mammal_ilk NOT NULL,
   hair_color  varchar(20) REFERENCES hair_color(code) NOT NULL);


CREATE TABLE human
  (mammal     varchar(20) REFERENCES mammal PRIMARY KEY,
   alcoholic  boolean NOT NULL);

이제 외래 키 참조로 안정적으로 사용할 수 있는 동물의 인스턴스에 대한 표준 참조가 있고 확장된 데이터의 "다음" 테이블을 가리키는 xxx_ilk 정의 테이블을 참조하는 "ilk" 열이 있습니다(또는 ilk가 제네릭 유형 자체인 경우 없음을 나타냅니다).이러한 종류의 스키마에 대해 테이블 함수, 뷰 등을 작성하는 것은 매우 쉬워서 OOP 스타일 클래스 상속에 의존하여 객체 유형의 패밀리를 만들 때 대부분의 ORM 프레임워크가 백그라운드에서 바로 이러한 작업을 수행합니다.

상위 테이블에 외래 키를 생성할 필요가 없는 한 OOP 패러다임에서 상속을 사용할 수 있습니다.예를 들어 추상 클래스 차량이 차량 테이블에 저장되어 있고 이를 상속하는 테이블 차량이 있는 경우 모든 차량이 차량 테이블에 표시되지만 차량 테이블의 드라이버 테이블에 있는 외부 키는 이러한 레코드와 일치하지 않습니다.

상속은 분할 도구로도 사용할 수 있습니다.이 기능은 테이블이 영구적으로 증가해야 하는 경우(로그 테이블 등)에 특히 유용합니다).

상속의 주요 용도는 파티셔닝이지만 다른 상황에서 유용한 경우도 있습니다.내 데이터베이스에는 외래 키에서만 다른 테이블이 많이 있습니다.내 "추상 클래스" 테이블 "이미지"에 "ID"(모든 테이블에 기본 키가 있어야 함)와 게시물이 포함되어 있습니다.GIS 2.0 래스터.site_map 또는 artifact_drawing과 같은 상속된 테이블에는 외부 키 열("site_map"의 경우 site_name 텍스트 열, "artifact_drawing" 테이블의 경우 "artifact_id" 정수 열)과 기본 및 외부 키 제약 조건이 있으며 나머지는 "image" 테이블에서 상속됩니다.앞으로 모든 이미지 테이블에 "description" 열을 추가해야 하므로 실제 문제를 일으키지 않고도 상당한 작업을 절약할 수 있습니다(데이터베이스 실행 속도가 약간 느려질 수 있음).

EDIT: 또 다른 유용한 사용: 등록되지 않은 사용자를 두 테이블로 처리하는 경우, 다른 RDBMS는 두 테이블을 처리하는 데 문제가 있지만 Postgre에서는SQL 간단합니다. 추가만 하면 됩니다.ONLY상속된 "등록되지 않은 사용자" 테이블의 데이터에 관심이 없는 경우.

상속된 테이블에 대한 유일한 경험은 파티션 분할입니다.작동은 괜찮지만 Postgre의 가장 정교하고 사용하기 쉬운 부분은 아닙니다.SQL.

지난 주 우리는 동일한 OOP 문제를 보고 있었지만, Hibernate에 너무 많은 문제가 있었습니다. 우리는 우리의 설정이 마음에 들지 않아서 Postgre에서 상속을 사용하지 않았습니다.SQL.

테이블 간에 1대 1 이상의 관계가 있을 때 상속을 사용합니다.

예: x, y, 회전, 척도 속성을 가진 객체 맵 위치를 저장하려고 합니다.

이제 지도에 표시할 여러 종류의 개체가 있고 각 개체에는 고유한 지도 위치 매개 변수가 있으며 지도 매개 변수는 재사용되지 않는다고 가정해 보겠습니다.

이러한 경우 테이블 상속은 정규화되지 않은 테이블을 유지 관리하거나 위치 ID를 생성하여 다른 테이블을 상호 참조하지 않도록 하는 데 매우 유용합니다.

저는 그것에 대해 몇 가지 작업을 시도해 보았습니다. 데이터베이스 상속에 대한 실제 사용 사례가 있는지 지적하지는 않겠지만, 결정을 내리기 위한 세부 사항을 알려드리겠습니다.다음은 Postgres의 예입니다.QL: https://www.postgresql.org/docs/15/tutorial-inheritance.html 아래 SQL 스크립트를 사용해 보십시오.

CREATE TABLE IF NOT EXISTS cities (
  name       text,
  population real,
  elevation  int     -- (in ft)
);

CREATE TABLE IF NOT EXISTS capitals (
  state      char(2) UNIQUE NOT NULL
) INHERITS (cities);

ALTER TABLE cities
ADD test_id varchar(255); -- Both table would contains test col
DROP TABLE cities; -- Cannot drop because capitals depends on it

ALTER TABLE cities
ADD CONSTRAINT fk_test FOREIGN KEY (test_id) REFERENCES sometable (id);

제 의견을 보시면 아시겠지만, 다음과 같이 요약하겠습니다.

  • 필드를 추가/삭제/업데이트할 때 상속 테이블도 영향을 받습니다.
  • 상위 테이블을 삭제할 수 없습니다.
  • 외부 키는 상속되지 않습니다.

성장하는 애플리케이션의 경우 미래의 변화를 쉽게 예측할 수 없기 때문에 초기 데이터베이스 개발에 이를 적용하지 않을 입니다.

기능도 안정적이고 기존 모델과 거의 동일한 데이터베이스 모델을 만들고 싶을 때는 사용 사례를 고려할 수 있습니다.

가능한 한 적게 사용하세요.그리고 그것은 보통 절대로, 관계 모델을 위반하는 구조를 만드는 방법으로 요약된다는 것을 의미합니다. 예를 들어, 정보 원칙을 어기고 관계 대신 가방을 만드는 것입니다.

대신 추가 정규 형식을 포함하여 적절한 관계형 모델링과 결합된 테이블 분할을 사용합니다.

언급URL : https://stackoverflow.com/questions/3074535/when-to-use-inherited-tables-in-postgresql

반응형