6P by neo 2일전 | favorite | 댓글 1개

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를 통해 효율적으로 데이터를 저장하고 쿼리할 수 있음.
Hacker News 의견
  • 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%를 이해할 수 있어 자신이 맡았던 직무에 대한 자부심을 느끼게 됨