Skip to main content

01. [BackEnd] 시작하기

PostgreSQL, Golang, Docker를 이용해서 디자인, 개발, 배포에 관한 백엔드 학습을 진행한다.

앞으로 할 API 명세​

  1. Create and mange account

  2. Record all balance changes

  3. Money transfer transaction

오늘 배울 내용​

DB 디자인에 대해서 배울 예정이다.

  1. dbdiagram.io에서 DB schema 디자인에 대해 배울 것이다.

  2. 생성한 DB 다이어그램을 PDF나 PNG로 저장해서 공유하는 방법

  3. 생성한 DB 다이어그램에 따른 SQL 생성

dbdiagram.io​

메인 페이지​

Alt text

Go to app​

Alt text

좌측은 간단한 문법으로 테이블이 작성되어 있고

오른쪽은 보여지는 테이블입니다.

Export 버튼을 통해서 PDF, PNG를 생성할 수도 있고 PostgreSQL, MySQL, SQL server의 SQL을 생성할 수도 있습니다.

문법​

  1. as

Table accounts as A{

}

accounts 테이블의 별명을 as로 붙여줄 수 있다.

  1. auto increment * pk

Table accounts as A{
id int[pk, increment]
}

increment 설정을 하면 키 값을 자동으로 정할 수 있다.

pk 키워드를 설정하면 primary key다.

PostgreSQL의 경우에는 bigserial type을 사용하여 auto increment를 할 수 있다.

Table accounts as A{
id bigserial [pk]
}
  1. varchar & bigint

Table accounts as A{
id bigserial [pk]
owner varchar
balance bigint
currency varchar
}

varchar는 문자열, bigint는 큰 정수다. int만 쓰지 않기에 이를 고려할 필요가 있다.

  1. timestamptz

Table accounts as A{
id bigserial [pk]
owner varchar
balance bigint
currency varchar
created_at timestamptz
}

타임존 정보가 더 좋게 포함되어있다.

  1. default 키워드

Table accounts as A{
id bigserial [pk]
owner varchar
balance bigint
currency varchar
created_at timestamptz [default: `now()`]
}

default 키워드를 설정하면 디비에서 자동으로 설정해준다.

백틱으로 감싸줬다.

  1. 외래키

Table entries{
id bigserial [pk]
accounts_id bigint [ref: > A.id]
}

위처럼 외래키 참조할 수 있음.

accounts 테이블 입장에서 일대다 관계다.

Table entries{
id bigserial [pk]
accounts_id bigint
amount bigint
created_at timestamptz [default: `now()`]
}

Ref: entries.accounts_id > A.id

위처럼도 가능하다.

  1. not null

Table accounts as A{
id bigserial [pk]
owner varchar [not null]
balance bigint [not null]
currency varchar [not null]
created_at timestamptz [not null, default: `now()`]
}

not null이 붙으면 무조건 값이 들어와야 한다.

  1. note

    amount bigint [not null, note:'can be negative or positive']

위처럼 메모도 가능

  1. Enum

Enum Currency{
USD
EUR
KRW
}

위처럼 Enum을 정의할 수 있고

Table accounts as A{
id bigserial [pk]
owner varchar [not null]
balance bigint [not null]
currency Currency [not null]
created_at timestamptz [not null, default: `now()`]
}

위처럼 적용한 Enum을 타입으로 사용할 수 있다.

  1. index

Table accounts as A{
id bigserial [pk]
owner varchar [not null]
balance bigint [not null]
currency Currency [not null]
created_at timestamptz [not null, default: `now()`]

Indexes{
owner
}
}

인덱스를 설정해주면 인덱스로 값을 검색할 수 있다.

위의 경우에는 FindByOwner가 가능하다.

    Indexes{
from_accounts_id
to_accounts_id
(from_accounts_id, to_accounts_id)
}

위처럼 인덱스를 설정한다면 여러개의 필드를 기준으로 검색할 수 있다.

테이블 정보​

accounts : 사용자 계정

  • owner : 계정 주인
  • balance : 잔고
  • currency : 통화

entries : 계정의 잔고 변화 기록

  • amount : 잔고 변화 ( 양수, 음수 가능 )

transfer : 두 계좌의 이체를 기록

  • amount : 금액의 이동 ( 무조건 양수만 )

Alt text

Export SQL​

Alt text

SQL로 바꿔준다 !

12로 다시설치해서 하기