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 이상에서는 열을 대신 고려합니다.참조:
- 직렬 기본 키 열을 사용하여 테이블 이름을 안전하게 변경
- 자동 증분 테이블 열
- https://www.2ndquadrant.com/en/blog/postgresql-10-identity-columns/
제품 이름이 거의 고유하지 않기 때문에 강력하게 추천합니다(좋은 "자연 키"가 아닙니다).또한 고유성을 적용하고 외부 키에서 열을 참조하는 것이 일반적으로 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
'source' 카테고리의 다른 글
의 버전을 반환하는 PowerShell 스크립트.기계의 NET Framework? (0) | 2023.05.04 |
---|---|
그래프에서 xxick을 제거하는 방법 (0) | 2023.05.04 |
iOS에서 최신 장치 언어를 가져오시겠습니까? (0) | 2023.05.04 |
저장소에서 모든 Git 및 Mercurial 커밋을 검색하여 특정 문자열을 찾는 방법은 무엇입니까? (0) | 2023.05.04 |
Postgresql Aggresql (0) | 2023.05.04 |