# Postgres에 대해 누군가가 알려주었으면 하는 것

> Clean Markdown view of GeekNews topic #17732. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=17732](https://news.hada.io/topic?id=17732)
- GeekNews Markdown: [https://news.hada.io/topic/17732.md](https://news.hada.io/topic/17732.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-11-13T14:15:04+09:00
- Updated: 2024-11-13T14:15:04+09:00
- Original source: [challahscript.com](https://challahscript.com/what_i_wish_someone_told_me_about_postgres)
- Points: 7
- Comments: 2

## Summary

Postgres의 공식 문서는 매우 훌륭하지만 방대하여 초급 엔지니어가 처음부터 끝까지 읽기 어려울 수 있습니다. 데이터 정규화는 중복 데이터를 제거하는 과정으로, 비정규화는 특정 데이터를 더 빠르게 읽기 위해 필요할 때도 있지만 데이터 불일치나 쓰기 복잡성 증가의 비용이 따릅니다. `psql`의 출력 가독성을 향상시키고 자동 완성을 활용하는 방법, 인덱스의 정의와 한계, JSONB의 장단점 등 다양한 유용한 팁이 있습니다.

## Topic Body

#### Postgres에 대해 알았으면 좋았을 것들

- **Postgres 문서의 방대함**: Postgres의 공식 문서는 매우 훌륭하지만, 그 양이 방대하여 초급 엔지니어가 처음부터 끝까지 읽기 어렵다는 점이 있음.

#### 데이터 정규화

- **데이터 정규화**: 데이터베이스 스키마에서 중복 데이터를 제거하는 과정임. 예를 들어, `documents` 테이블에 `user_email` 열을 두지 않고, `users` 테이블과 외래 키로 연결하는 것이 좋음.
- **비정규화의 필요성**: 특정 데이터를 더 빠르게 읽기 위해 비정규화가 필요할 때도 있음. 그러나 비정규화된 데이터는 데이터 불일치나 쓰기 복잡성 증가의 비용이 따름.

#### Postgres 제작자의 조언 따르기

- **Postgres Wiki의 "하지 말아야 할 것들"**: 공식 Postgres Wiki에는 "하지 말아야 할 것들" 목록이 있음. 이해하지 못하더라도 실수를 피할 수 있음.
- **추천 사항**: 모든 텍스트 저장에 `text` 타입 사용, 모든 타임스탬프 저장에 `timestampz`/`time with time zone` 타입 사용, 테이블 이름은 snake_case로 작성.

#### 일반적인 SQL 특이점

- **SQL 대소문자 구분 없음**: SQL 키워드는 대소문자를 구분하지 않음. 이는 Postgres에만 국한되지 않음.
- **NULL의 특이성**: SQL의 `NULL`은 "알 수 없음"을 의미하며, 대부분의 연산자와 결합 시 결과가 `NULL`이 됨. `IS NULL`, `IS NOT NULL` 등의 연산자를 사용하여 `NULL`을 비교할 수 있음.

#### `psql`을 더 유용하게 만들기

- **출력 가독성 향상**: 터미널 페이저를 사용하여 긴 출력이 잘 보이도록 설정 가능. `less`를 페이저로 설정할 수 있음.
- **모호한 NULL 명확화**: `psql`에서 `NULL`을 나타내는 문자열을 설정하여 출력에서 `NULL`을 명확히 할 수 있음.
- **자동 완성 사용**: `psql`은 자동 완성을 지원하여 SQL 키워드나 테이블 이름을 쉽게 입력할 수 있음.

#### 인덱스 추가의 효과

- **인덱스의 정의**: 인덱스는 데이터를 빠르게 조회할 수 있도록 도와주는 데이터 구조임.
- **인덱스의 한계**: 로컬 데이터베이스에 행이 거의 없는 경우 인덱스가 유용하지 않을 수 있음. 여러 열을 인덱싱할 때는 순서가 중요함.

#### JSONB의 활용

- **JSONB의 장점과 단점**: Postgres는 JSON을 효율적으로 저장하고 쿼리할 수 있는 기능을 제공하지만, 잘못 사용하면 성능이 저하될 수 있음.
- **JSONB의 구조적 한계**: JSONB 열은 구조에 대한 보장이 없어, 표준 테이블 스키마만큼 자체 문서화되지 않음.

#### 기타 유용한 팁

- **긴 트랜잭션의 문제점**: 트랜잭션이 너무 오래 지속되면 다른 클라이언트가 데이터베이스에 접근하는 것을 방해할 수 있음.
- **Postgres의 강력한 기능**: Postgres는 문서 지향 데이터베이스의 강점을 제공하며, JSONB를 통해 효율적으로 데이터를 저장하고 쿼리할 수 있음.

## Comments



### Comment 31508

- Author: bbulbum
- Created: 2024-11-19T19:51:18+09:00
- Points: 1

하지 말아야할 것 언젠가 한번 읽어봐야겠어요

### Comment 31201

- Author: neo
- Created: 2024-11-13T14:15:04+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=42111896) 
- Postgres는 대소문자를 구분하지만, 쿼리에서 키워드를 대문자로 작성하는 것은 가독성을 높이기 위한 것임. 이는 필수는 아니지만, 디버깅 시 쿼리를 보기 쉽게 변환하는 것이 유용함
  - 다른 언어에서의 코드 정리와 유사하게, 일관된 들여쓰기 등은 이해 시간을 줄여주어 중요한 부분에 집중할 수 있게 해줌
  - "actuallyUsingCaseInIdentifiers"와 같은 식별자에 대문자를 사용하는 것은 피하고 싶음

- "Don't Do This" 위키 항목을 처음 발견했는데 매우 유용함

- 많은 내용이 Postgres에 국한되지 않음 (예: null의 특이성, 인덱스 컬럼 순서 등)
  - 예를 들어, null이 인덱스 및 고유 제약 조건과 상호작용하는 방식은 MySQL에서도 직관적이지 않음
  - 사용자 테이블에 null이 허용되지 않는 이메일 컬럼과 null이 허용되는 사용자 이름 컬럼이 있을 때, (email, username)과 같은 고유 제약 조건이 있으면 동일한 이메일을 null 사용자 이름과 함께 여러 번 삽입할 수 있음

- 데이터를 정규화하라는 조언은 신중히 접근해야 함
  - 저자는 10가지 다른 정규화 유형을 언급했지만, 대부분의 사람들은 그 중 7가지를 사용할 필요가 없음

- 개발자들이 정규화에 더 신경 쓰고 JSON(b) 컬럼에 모든 것을 넣는 것을 멈추길 바람

- "여정"이라는 단어는 과도한 사용으로 인해 블로그에서 불쾌하게 느껴짐

- 코드 섹션이 모바일에서 거의 스크롤할 수 없을 정도로 불편함

- JSON 스펙에서 'null'은 상수 값이며, SQL의 NULL과 다름

- 인덱스를 추가해도 아무런 효과가 없을 수 있음
  - Postgres의 이념이 너무 강하거나 이해하기 어려운 부분이 있음
  - 향후 버전에서 힌트 지원이 추가될 가능성이 있어 기대됨

- 이러한 기사를 읽고 90%를 이해할 수 있어 자신이 맡았던 직무에 대한 자부심을 느끼게 됨
