source

PostgreSQL에서 다대다 관계를 구현하는 방법은 무엇입니까?

factcode 2023. 5. 4. 20:36
반응형

PostgreSQL에서 다대다 관계를 구현하는 방법은 무엇입니까?

저는 제목이 자명하다고 생각합니다.Postgre에서 테이블 구조를 만드는 방법SQL을 사용하여 다대다 관계를 만듭니다.

예:

Product(name, price);
Bill(name, date, Products);

SQL DDL(데이터 정의 언어) 문은 다음과 같습니다.

CREATE TABLE product (
  product_id serial PRIMARY KEY  -- implicit primary key constraint
, product    text NOT NULL
, price      numeric NOT NULL DEFAULT 0
);

CREATE TABLE bill (
  bill_id  serial PRIMARY KEY
, bill     text NOT NULL
, billdate date NOT NULL DEFAULT CURRENT_DATE
);

CREATE TABLE bill_product (
  bill_id    int REFERENCES bill (bill_id) ON UPDATE CASCADE ON DELETE CASCADE
, product_id int REFERENCES product (product_id) ON UPDATE CASCADE
, amount     numeric NOT NULL DEFAULT 1
, CONSTRAINT bill_product_pkey PRIMARY KEY (bill_id, product_id)  -- explicit pk
);

몇 가지 조정을 했습니다.

  • n:m 관계는 일반적으로 별도의 표에 의해 구현됩니다.bill_product이 경우에는

  • 열을 대체 기본 키로 추가했습니다.Postgres 10 이상에서는 열을 대신 고려합니다.참조:

    제품 이름이 거의 고유하지 않기 때문에 강력하게 추천합니다(좋은 "자연 키"가 아닙니다).또한 고유성을 적용하고 외부 키에서 열을 참조하는 것이 일반적으로 4바이트로 저렴합니다.integer((-8바이트)도 가능합니다bigint)로 저장된 문자열을 사용하는 경우보다text또는varchar.

  • 같은 기데이유형이의안사함용름과 같은 기본 date식별자로서이것은 가능하지만 스타일이 나쁘고 혼란스러운 오류와 오류 메시지를 초래합니다.따옴표 없이 소문자로 묶지 않은 합법적인 식별자를 사용합니다.예약된 단어를 사용하지 말고 가능하면 이중 따옴표로 묶은 대/소문자 구분자를 사용하지 마십시오.

  • "이름"은 좋은 이름이 아닙니다.테이블의 열 이름을 변경했습니다.product되려고product(또는)product_name또는 유사).그것은 더 나은 명명 규칙입니다.그렇지 않은 경우, 관계형 데이터베이스에서 많이 수행하는 쿼리에서 두 개의 테이블을 조인할 때 "name"이라는 이름의 열이 여러 개 생성되고 열 별칭을 사용하여 혼란을 정리해야 합니다.그건 도움이 안 됩니다.또 다른 널리 퍼진 안티패턴은 열 이름으로 "id"입니다.
    나는 A의 이름이 무엇인지 확신할 수 없습니다.bill되지요. bill_id이 경우에는 아마 충분할 것입니다.

  • price데이터 유형입니다. numeric입력한 대로 정확하게 분수 숫자를 저장합니다(부동점 유형 대신 정밀도 유형을 사용).만약 당신이 정수를 독점적으로 다룬다면, 그것을 만드세요.integer예를 들어, 가격을 센트로 절약할 수 있습니다.

  • amount("Products"는 연결 표에 .bill_product그리고 유형입니다.numeric뿐만 아니라.다시.integer당신이 정수를 독점적으로 다루는 경우.

  • 외래 키가 표시됩니다.bill_product변화를 캐스케이드하기 위해 두 가지를 모두 만들었습니다.ON UPDATE CASCADE만약에product_id또는bill_id변경될 경우 변경 내용은 의 모든 종속 항목으로 캐스케이드됩니다.bill_product아무 것도 부서지지 않습니다.그것들은 그들 자신의 중요성이 없는 참고 자료일 뿐입니다.
    저도 사용했습니다.ON DELETE CASCADE위해서bill_id법안이 삭제되면 세부 정보도 함께 사라집니다.
    제품의 경우는 그렇지 않습니다.청구서에 사용된 제품을 삭제하지 않을 수 있습니다.이 작업을 시도하면 Postgres에서 오류가 발생합니다.다음에 다른 열을 추가할 수 있습니다.product대신 사용되지 않는 행("소프트 삭제")을 표시합니다.

  • 이 기본 예제의 모든 열은 다음과 같이 됩니다.NULL값은 허용되지 않습니다.(예, 모든 열 - 기본 키 열이 정의됩니다.UNIQUE NOT NULL자동으로.)그것은NULL어떤 열에서도 값이 의미가 없습니다.그것은 초보자의 삶을 더 쉽게 만듭니다.하지만 그렇게 쉽게 도망칠 수는 없을 것입니다. 어쨌든 당신은 취급하는 을 이해해야 합니다.추가 열이 허용할 수 있음NULL도입할 수 있는 가치, 기능 및 결합NULL쿼리 등의 값

  • 설명서의 장을 읽습니다.

  • 기본 키는 키 열에 고유한 인덱스를 사용하여 구현되므로 PK 열에 조건이 있는 쿼리를 빠르게 실행할 수 있습니다.그러나 키 열의 순서는 다중 열 키와 관련이 있습니다.PK 이후bill_product사용 중(bill_id, product_id)내 예에서, 당신은 단지 다른 인덱스를 추가할 수 있습니다.product_id또는(product_id, bill_id)주어진 것을 찾는 질문이 있는 경우product_id아니요bill_id참조:

  • 매뉴얼의 인덱스에 대한 장을 읽습니다.

언급URL : https://stackoverflow.com/questions/9789736/how-to-implement-a-many-to-many-relationship-in-postgresql

반응형