[Ruby On Rails] Active Record_Datatype

sunaaa·2021년 4월 16일
3

Ruby On Rails

목록 보기
11/20

ActiveRecord ?

루비온레일즈에서는 ActiveRecord라는 ORM을 사용한다

# app/models/order.rb 
class Order < ApplicationRecord 
end
  • Order 모델이 상속받는 ApplicationRecord는 모든 모델에서 공통으로 사용하는 기능을 넣을 수 있도록 레일즈 5.0부터 추가되었음
  • 모든 모델이 ApplicationRecord를 상속받음
  • 레일즈 5.0 이상 프로젝트 생성시 자동 생성됨
  • OrderApplicationRecord를 상속받고, ApplicationRecordActiveRecord를 상속받음
  • ActiveRecord는 데이터를 읽고(find) 쓰는(create)등의 기능을 제공함
  • Order 모델은 빈 클래스지만 ActiveRecord에서 제공하는 기능을 모두 사용할 수 있음

ActiveRecord에서 지원하는 데이터 타입

NATIVE_DATABASE_TYPES = {
# 선택한 데이터베이스에 필요한 기본 키 데이터 유형으로 변환
  primary_key: "bigint auto_increment PRIMARY KEY",
# 이름 및 이메일과 같은 짧은 문자열에 사용
  string:      { name: "varchar", limit: 255 },
# 일반적으로 textarea에 의해 캡처되는 긴 문자열에 사용
  text:        { name: "text" },
# 정수에 사용 ex) 0,12,1253
  integer:     { name: "int", limit: 4 },
# 고정 부동 소수점 정밀도로 저장된 10진수에 사용
  float:       { name: "float", limit: 24 },
# 저장된 정밀도는 다양함. 정확한 수학 계산에 적합
  decimal:     { name: "decimal" },
# 날짜와 시간 모두 필요시 사용
  datetime:    { name: "datetime" },
# 날짜와 시간, 시간대 모두 필요시 사용. 일반적으로 created_at / updated_at에 사용됨
  timestamp:   { name: "timestamp" },
# 시, 분, 초 필요시 사용
  time:        { name: "time" },
# 년, 월, 일 필요시 사용
  date:        { name: "date" },
# 이미지, 비디오 및 기타 파일을 Blob이라는 데이터 정크에 원래 형식으로 저장할 때 사용
  binary:      { name: "blob" },
# 바이너리와 유사하며 파일에 대한 메타 데이터를 포함. Blob은 변경할 수 없음
  blob:        { name: "blob" },
# true/false 값에 사용
  boolean:     { name: "tinyint", limit: 1 },
# rails5 부터 생김. 기본적으로 JSON 값을 저장할 수 있음 . (많은 사람들이 여전히 Postgres의 jsonb 데이터 유형을 사용함)
  json:        { name: "json" },
}

다른 DB 데이터 유형에 매핑되는 Rails 데이터 유형


어떨 때 어떤 데이터타입을 쓰면 좋을까?

📅 1. 날짜나 시간 값을 저장할래!

1) 시간대에 영향을 받지 않는 1970년 이전 또는 2038 년 이후 날짜와 시간을 저장해야 한다면 => DATETIME
2) 데이터베이스 크기에 대해 걱정할 필요가 있고 저장할 데이터가 1970 ~ 2038 기간 내에 있다면? => TIMESTAMP
3) 날짜만 저장하면 되나요? => DATE
4) 시간만 저장하면 되나요? => TIME

: datetime (8byte)

  • YYYY-MM-DD HH : MM : SS 형식의 날짜 및 시간을 저장
  • 레코드 변경에 영향을받지 않는 특정 및 정적 값을 저장하는 데 사용됨(생년월일과 같은 열에 유용)
  • 다른 TIME ZONE 관련 설정의 영향을 받지 않음
  • 지원 범위 : '1000-01-01 00:00:00 ′ ~'9999 -12-31 23:59:59 ′

: timestamp (4byte)

  • 1970-01-01 이후의 초 수를 저장합니다.
  • 레코드 변경 사항을 추적하고 레코드가 변경 될 때마다 업데이트하는 데 사용됨(updated_at, created_at와 같은 열에 유용함)
    • 저장을 위해 내부적으로 현재 시간대를 UTC로 변환하고 검색 중에 다시 현재 시간대로 변환함. DATETIME은 이것을 할 수 없음.
  • 다른 TIME ZONE 관련 설정의 영향을 받음
  • 지원 범위 : '1970-01-01 00:00:01 ′ UTC ~'2038-01-19 03:14:07 ′ UTC

: date (3byte)

  • 날짜 구성 요소만 저장함
  • 형식 : YYYY-MM-DD
  • 지원범위 : 1000-00-01~ 9999-12-31

: time (3byte)

  • 형식 : HH:MM:SS
  • 지원범위 : -838:59:59 ~ 838:59:59
  • 24 시간 이상을 허용하므로 엄격하게는 "시간"이 아님. "경과 시간"으로도 사용할 수 있음.

Q. datetime vs timestamp

  • 동일한 time_zone일 때는 동일한 결과가 나옴
  • time_zone이 변경되면, datetime timestamp는 time_zone의 의존하기 때문에 변경된 time_zone이 반영되지만 datetime은 그렇지 않음
  • 서울 오전 9시에 작성한 글이 미국으로 Replication하는 경우 여전히 오전 9시로 반영되는 상황이 벌어지게 된다.
  • 이런 경우에는 UTC 지원 가능한 timestamp를 사용하는 것이 더 좋음

2. ✍ 텍스트 값을 저장할래!

1) 고정길이 -> varchar(길이)
2) 가변길이 -> char(길이)
3) 가변길이 문자열(더 긴거) -> text

Q. 고정길이는 어떨때 씀?

  • 우편번호(5글자), 연락처(11글자) 같은 것

Q. 가변길이는 어떨 때 씀?

  • 사용자가 자유롭게 입력 가능한 값. 길이 제한만 줄때 씀.
  • 이메일이나 아이디 몇글자 일지 모르잖슴? 최대허용길이만 정해줌

Q. char(n) vs varchar(n) vs test vs string in PostgreSQL

  • character(n)다른 데이터베이스 시스템에서는 크기 제한을 하면 성능상의 이점이 있지만 PostgreSQL에서는 그러한 이점이 없음
  • 실제로 character(n)는 추가 스토리지 비용 때문에 일반적으로 세 가지 중 가장 느림
  • 대부분의 상황에서 text또는 character를 씀
  • 마찬가지로, postgresql을 쓰는 경우, string이나 varchar를 쓸 필요가 없고 text를 쓰면 됨
  • 열 크기에 대한 길이 제한이 필요한 경우에만 varchar(n)를 씀
profile
Be Playful Front-end Developer

0개의 댓글