물리 ERD

각 칸의 뜻은 합의문에 적힌 대로 한 줄로 적었습니다. 관계 화살표만 있는 그림은 erd-links.html 입니다.

회원과 상품

customers

가입한 고객의 로그인 계정과 표시 정보다.

칸설명타입비움기본키
id이 고객의 번호다.bigint필수identityPK
login_id고객 로그인 아이디다. 소문자 4자 이상 20자 이하이고 가입 뒤에는 바꾸지 않는다.text필수
password_hashArgon2id 비밀번호 해시다. $argon2id$v=19$m=19456,t=2,p=1$ 로 시작한다.text필수
email소문자 이메일 평문이다. 만기 안내의 계정 수신 주소로 쓴다.text필수
name고객에게 보여주는 이름이다. 앞뒤 공백을 뺀 1자 이상 100자 이하다.text필수
phone일반전화 암호문이다. 비울 수 있고, 값이 있으면 v1: 으로 시작한다.text가능
mobile휴대폰 암호문이다. 필수이며 v1: 으로 시작한다. 만기 안내는 이메일로 보낸다.text필수
postal_code우편번호 암호문이다. 비울 수 있고, 값이 있으면 v1: 으로 시작한다.text가능
address주소 암호문이다. 비울 수 있고, 값이 있으면 v1: 으로 시작한다.text가능
address_detail상세주소 암호문이다. 비울 수 있고, 값이 있으면 v1: 으로 시작한다.text가능
terms_version가입 때 동의한 약관 버전 글자다.text필수
terms_accepted_at가입 트랜잭션이 약관 동의를 받은 시각이다.timestamptz필수
created_at이 행을 만든 시각이다.timestamptz필수now()
currency이 고객의 통화다. KRW 또는 USD 다. 이 고객의 주문과 결제와 서비스는 이 통화다. 주문, 결제, 서비스, 예치금, 환불, 세금 문서, 명의변경의 받는 자리가 있으면 바꾸지 못한다.char(3)필수KRW
uq_customer_login_id (login_id)
uq_customer_email (email)

staff

인트라넷에 로그인하는 직원이다. 고객과 다른 표다.

칸설명타입비움기본키
id이 직원의 번호다.bigint필수identityPK
login_id인트라넷 로그인 아이디다. 소문자 4자 이상 20자 이하이고 만든 뒤 바꾸지 않는다.text필수
password_hash직원 비밀번호의 Argon2id 해시다. 고객과 같은 접두로 시작한다.text필수
email직원의 소문자 이메일이다. 그만둔 뒤에도 같은 주소는 다시 쓰지 않는다.text필수
name직원 이름이다. 세션을 열 때 이 시점의 이름을 감사 라벨로 복사한다.text필수
disabled_at값이 있으면 그 직원은 새로 로그인하지 못한다. 행은 남기고 이 시각만 채운다.timestamptz가능
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_staff_login_id (login_id)
uq_staff_email (email)

login_locks

로그인 실패 횟수와 잠금 끝 시각이다. 고객과 직원이 따로이고 이 표의 변경은 감사 기록이 아니다.

칸설명타입비움기본키
id이 잠금 행의 번호다.bigint필수identityPK
subjectcustomer 또는 staff 중 어느 쪽 계정인지다.text필수
customer_id고객 계정이면 그 고객이다. 직원 잠금은 비운다.bigint가능FK customers.id
staff_id직원 계정이면 그 직원이다. 고객 잠금은 비운다.bigint가능FK staff.id
failed_count이 창에서 틀린 비밀번호 횟수다. 0 이상 5 이하다.integer필수
window_started_at이번 실패 창이 시작된 시각이다. 15분이 지나면 횟수는 1부터 다시 센다.timestamptz필수
locked_until다섯 번째 실패 시각부터 15분이다. 이 시각 전에는 맞는 비밀번호도 로그인되지 않는다. 잠금이 아니면 비운다.timestamptz가능
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_login_locks_customer (customer_id) where customer_id is not null
uq_login_locks_staff (staff_id) where staff_id is not null

login_ip_allows

로그인을 허용할 주소다. 한 행도 없으면 주소는 가리지 않고, 하나라도 있으면 등록한 주소만 된다.

칸설명타입비움기본키
id이 허용 주소 행의 번호다.bigint필수identityPK
subjectcustomer 또는 staff 중 어느 쪽 계정인지다.text필수
customer_id고객이 등록한 주소면 그 고객이다. 직원 주소는 비운다.bigint가능FK customers.id
staff_id직원이 등록한 주소면 그 직원이다. 고객 주소는 비운다.bigint가능FK staff.id
address로그인할 수 있는 호스트 주소다. IPv4 는 /32, IPv6 는 /128 만 된다.inet필수
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_login_ip_allows_customer (customer_id, address) where customer_id is not null
uq_login_ip_allows_staff (staff_id, address) where staff_id is not null

tlds

최상위 도메인 라벨과, 등록인 식별이 필수인지만 둔다.

칸설명타입비움기본키
id이 최상위 라벨 행의 번호다.bigint필수identityPK
label점이 없는 소문자 라벨 하나다. 한글 최상위는 퓨니코드로 저장한다.text필수UNIQUE
identity_required참이면 이 라벨의 등록인은 식별값이 있어야 등록과 등록인 변경이 성공한다.boolean필수
created_at이 행을 만든 시각이다.timestamptz필수now()

products

판매하는 상품이다.

칸설명타입비움기본키
id이 상품의 번호다.bigint필수identityPK
code상품을 구분하는 코드다.text필수UNIQUE
product_typedomain, hosting, ssl, addon, mail, server, dbms, security, dns 중 상품 종류다.text필수
name상품을 보여주는 이름이다. 도메인 링크가 없는 안내 메일은 이 이름을 서비스 표시로 쓴다.text필수
billing_modelone_time 은 한 번 청구, recurring 은 반복 청구다.text필수
statusactive 는 판매 중이고 retired 는 판매를 끝낸 상품이다.text필수
tld_id도메인 상품이 가리키는 최상위 라벨이다. 다른 상품은 비울 수 있다.bigint가능FK tlds.id
created_at이 행을 만든 시각이다.timestamptz필수now()

prices

상품의 행동과 기간에 매긴 원가와 판매가다.

칸설명타입비움기본키
id이 가격 행의 번호다.bigint필수identityPK
product_id이 가격이 속한 상품이다.bigint필수FK products.id
actionregister, renew, transfer, restore, upgrade, addon_add, owner_change, usage 중 이 가격의 행동이다.text필수
period_unityear, month, day, hour, once 중 가격의 기간 단위다. 반기는 month 와 개수 6이다. 판매가는 그 개수만큼의 금액이다.text필수
period_countperiod_unit 을 몇 번 적용하는 개수다.integer필수
currency이 가격의 통화다. KRW 또는 USD 다. KRW 의 원가와 판매가는 원이고, USD 는 센트다.char(3)필수KRW
cost_amount이 가격의 원가다.bigint필수
sell_amount부가세 포함 판매가다. 기간 한정 할인은 이 금액만 다른 가격 행으로 나눈다.bigint필수
effective_from이 가격이 적용되기 시작하는 시각이다.timestamptz필수
effective_to이 가격이 끝나는 시각이다. 비어 있으면 이후 시각에도 현재 가격이 될 수 있다.timestamptz가능
created_at이 행을 만든 시각이다.timestamptz필수now()

주문과 돈

services

고객이 보유한 권리다. 갱신 줄이 여러 개여도 서비스 행은 하나다.

칸설명타입비움기본키
id이 서비스의 번호다.bigint필수identityPK
customer_id이 권리를 가진 고객이다. 만든 뒤 바꾸지 않고, 명의변경은 새 서비스 행을 만든다.bigint필수FK customers.id
product_id지금 연결된 상품이다. 유료 상품 변경이 이행되면 이 칸을 새 상품으로 둔다.bigint필수FK products.id
parent_service_id유료로 따로 해지할 수 있는 자식의 부모 서비스다. addon 은 부모를 반드시 가진다.bigint가능FK services.id
kinddomain, hosting, ssl, addon, mail, server, dbms, security, dns 중 하나다. 그 상품의 product_type 과 같다.text필수
statuspending, active, past_due, suspended, expired, terminated, failed 중 서비스 상태다.text필수
quantity기본은 1이다. 추가 디스크처럼 개수로 파는 서비스의 수량이다.integer필수1
auto_renew참이면 만료에 맞춰 연장 주문을 만든다. 거짓이어도 해지 예약이 없으면 안내 메일은 만든다.boolean필수
cancel_at해지를 예약한 시각이다. 이 값이 있으면 자동 안내 메일을 만들지 않는다.timestamptz가능
suspend_reasons정지 이유 목록이다. unpaid, abuse, legal, customer 만 두고, 하나라도 있으면 상태는 suspended 다.text[]필수{}
recurring_amount다음 자동 연장에 쓰는 한 기간의 총액이다. 비어 있으면 가격표의 판매가를 따른다.bigint가능
discount_percent이 서비스 하나에만 쓰는 할인 퍼센트다. 1 이상 99 이하다.integer가능
discount_until이 시각보다 일찍 만든 주문에만 할인을 쓴다. 비어 있으면 기한을 두지 않는다.timestamptz가능
currency이 서비스 금액의 통화다. KRW 또는 USD 다. recurring_amount 는 그 단위다.char(3)필수KRW
started_at권리가 시작된 시각이다. 처음 비어 있으면 첫 줄의 기간 시작으로 채운다.timestamptz가능
next_due_at다음 청구 시각이다. 안내 메일의 기준일은 이 시각의 서울 날짜를 본다.timestamptz가능
expires_at고객이 지금 보유한 권리의 끝 시각이다.timestamptz가능
included_traffic_bytes포함된 트래픽의 바이트 수다. 호스팅과 서버만 두고, 비어 있으면 사용량을 측정하지 않는다.bigint가능
suspended_at정지된 시각이다.timestamptz가능
terminated_at종료된 시각이다.timestamptz가능
created_at이 행을 만든 시각이다.timestamptz필수now()
UNIQUE (id, kind)
uq_open_addon (parent_service_id, product_id) where parent_service_id is not null and status in ('pending', 'active', 'past_due', 'suspended')

orders

청구 번호가 있는 주문 헤더다. 개통 결과는 줄에 있다.

칸설명타입비움기본키
id이 주문의 번호다.bigint필수identityPK
order_no고객에게 보이는 청구 번호다.text필수UNIQUE
customer_id이 주문의 고객이다. 명의변경 주문은 옛 서비스의 고객이다.bigint필수FK customers.id
sourcecustomer, staff, system 중 주문을 만든 쪽이다.text필수
currency이 주문 금액의 통화다. KRW 또는 USD 다. 한 주문의 줄은 이 통화다.char(3)필수KRW
status줄 상태에서 정한 헤더 상태다. awaiting_payment, paid, partially_fulfilled, fulfilled, cancelled 중 하나다.text필수
ordered_at주문을 만든 시각이다.timestamptz필수
idempotency_key같은 시스템 갱신 주문을 두 번 만들지 않게 하는 키다.text가능UNIQUE
created_at이 행을 만든 시각이다.timestamptz필수now()

order_items

한 주문의 금액과 기간을 담는 줄이다.

칸설명타입비움기본키
id이 주문 줄의 번호다.bigint필수identityPK
order_id이 줄이 속한 주문이다.bigint필수FK orders.id
parent_order_item_id같은 주문에서 이 추가 줄이 따라가는 부모 줄이다.bigint가능FK order_items.id
product_id이 줄의 상품이다.bigint필수FK products.id
service_id이 줄이 붙는 서비스다. 등록과 명의변경은 실행할 때 채우고, 갱신은 처음부터 있다.bigint가능FK services.id
actionregister, transfer_in, renew, restore, add, change, owner_change, credit, usage 중 이 줄이 하는 일이다. credit 는 권리를 줄이는 줄이다.text필수
statuspending, paid, fulfilled, cancelled, refunded 중 이 줄의 상태다. 개통이 실패하면 paid 로 남고 같은 작업을 다시 시도한다.text필수
product_name주문 당시의 상품 이름이다. 결제된 뒤에는 바꾸지 않는다.text필수
period_unityear, month, day, hour, once 중 이 줄의 기간 단위다.text필수
period_count이 줄이 덮는 기간의 개수다. 달력 월이면 개월 수이고, 맞춤으로 자른 줄이면 서울 날짜 차다. 일 가격과 시 가격을 담은 줄은 그 가격의 개수다.integer필수
period_start이 줄이 덮는 기간의 시작 시각이다.timestamptz가능
period_end이 줄이 덮는 기간의 끝 시각이다.timestamptz가능
quantity이 줄의 수량이다.integer필수
unit_price주문 당시의 단가다. 결제된 뒤에는 바꾸지 않는다.bigint필수
supply_amount부가세를 뺀 공급가 스냅샷이다. amount 에서 vat_amount 를 뺀 값이다.bigint필수
vat_amount부가세 스냅샷이다. amount 의 부호를 유지한 채 절대값을 11로 나눈 몫이다.bigint필수
cost_amount주문 당시의 원가다. 프리미엄 도메인의 실제 원가도 여기에 고정한다.bigint필수
cost_currency원가의 통화다. 이 줄의 currency 와 같다. KRW 는 원이고 USD 는 센트다.char(3)필수KRW
amount이 줄이 정산되어야 할 부가세 포함 금액이다.bigint필수
settled_amount확인된 결제 배분 합에, 이 줄에 쓴 예치금의 절대값을 더한 값이다. amount 와 같아지면 개통한다.bigint필수0
currency이 줄 금액의 통화다. KRW 또는 USD 다. 단가와 공급가와 부가세와 청구액과 정산액은 그 단위다.char(3)필수KRW
requested_name개통 전에 신청한 도메인 이름이다. 소문자 퓨니코드다.text가능
from_product_id상품을 바꿀 때의 이전 상품이다. 상품이 그대로면 비운다.bigint가능FK products.id
from_service_id명의변경 전의 서비스다. owner_change 일 때만 채운다.bigint가능FK services.id
to_customer_id명의변경으로 서비스를 받는 고객이다. owner_change 일 때만 채운다.bigint가능FK customers.id
auth_code들어오는 기관 이전이 진행되는 동안의 인증코드다. 성공하거나 취소하면 비운다.text가능
usage_id트래픽 초과 줄이 가리키는 사용량 행이다. usage 일 때만 채운다.bigint가능FK service_usage.id
config가격이 없는 구성의 요청 스냅샷이다. 운영체제, 네임서버, 레코드, 파킹, 포워딩, CSR 이 여기 남는다.jsonb가능
price_id이 줄의 금액에 쓴 가격 행이다.bigint가능FK prices.id
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_paid_period (service_id, period_start) where action in ('register', 'renew', 'transfer_in') and status in ('paid', 'fulfilled') and period_start is not null
uq_paid_register_name (requested_name) where action in ('register', 'transfer_in') and status = 'paid'
uq_open_owner_change (from_service_id) where action = 'owner_change' and status in ('pending', 'paid')
uq_usage_line (usage_id) where usage_id is not null and status <> 'cancelled'

service_usage

호스팅이나 서버가 쓴 트래픽을 재는 구간이다.

칸설명타입비움기본키
id이 사용량 구간의 번호다.bigint필수identityPK
service_id트래픽을 측정한 서비스다.bigint필수FK services.id
meter측정 항목이다. traffic_bytes 만 둔다.text필수
period_start측정 구간의 시작 시각이다.timestamptz필수
period_end측정 구간의 끝 시각이다. 시작보다 늦다.timestamptz필수
included_bytes행을 넣을 때 그 서비스에 포함돼 있던 바이트다. 이후 포함량을 바꿔도 이 값은 그대로다.bigint필수
used_bytes그 구간에 실제로 쓴 바이트다.bigint필수
billed_bytes쓴 양이 포함량보다 크면 그 차이고, 아니면 0이다.bigint필수
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_usage_period (service_id, meter, period_start)

payments

카드 또는 무통장으로 들어온 돈이다.

칸설명타입비움기본키
id이 결제의 번호다.bigint필수identityPK
customer_id이 결제의 고객이다.bigint필수FK customers.id
methodcard 또는 bank_transfer 다. 가상계좌 대기와 무통장 입금도 bank_transfer 다.text필수
statuspending 은 대기, confirmed 는 확인, failed 는 실패다.text필수
amount이 결제의 금액이다.bigint필수
currency이 결제 금액의 통화다. KRW 또는 USD 다.char(3)필수KRW
pg_tid결제사가 부여한 카드 거래 번호다. 카드 영수증은 이 번호를 본다.text가능UNIQUE
payment_method_id저장된 카드로 낼 때 그 카드 행을 가리킨다.bigint가능FK payment_methods.id
paid_at결제가 확인된 시각이다.timestamptz가능
created_at이 행을 만든 시각이다.timestamptz필수now()

payment_methods

자동결제에 쓰는 저장 카드다.

칸설명타입비움기본키
id이 저장 카드의 번호다.bigint필수identityPK
customer_id이 카드를 저장한 고객이다.bigint필수FK customers.id
method저장 수단의 종류다. card 만 둔다.text필수
statusactive 는 쓸 수 있는 카드이고 revoked 는 해제한 카드다.text필수
billing_key카드 자동결제 토큰의 암호문이다. v1: 으로 시작하고 평문 토큰은 두지 않는다.text필수
billing_key_digest평문 토큰의 HMAC-SHA256 을 소문자 16진수 64자로 둔 값이다. 사용 중인 같은 카드는 이 값으로 가른다.text필수
card_last4카드 끝 네 자리 평문이다.text가능
card_issuer카드 발급사 이름 평문이다.text가능
is_default이 카드가 그 고객의 기본 결제 수단이면 참이다. 참인 동안은 active 이고 고객당 하나다.boolean필수
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_default_payment_method (customer_id) where status = 'active' and is_default
uq_active_billing_key (billing_key_digest) where status = 'active'

payment_allocations

결제가 어느 주문 줄에 얼마를 배분했는지다.

칸설명타입비움기본키
id이 배분 행의 번호다.bigint필수identityPK
payment_id배분의 원천 결제다.bigint필수FK payments.id
order_item_id금액을 배분받는 주문 줄이다.bigint필수FK order_items.id
amount그 결제가 이 줄에 배분한 금액이다. 예치금을 쓰는 일은 이 표를 만들지 않는다.bigint필수
created_at이 행을 만든 시각이다.timestamptz필수now()

refunds

고객에게 돌려주는 환불 한 건이다.

칸설명타입비움기본키
id이 환불의 번호다.bigint필수identityPK
customer_id환불을 받는 고객이다.bigint필수FK customers.id
payment_id카드로 되돌릴 때 그 결제를 가리킨다.bigint가능FK payments.id
statusrequested, approved, rejected, completed 중 환불 진행 상태다.text필수
methodbalance 는 예치금 적립, bank 는 계좌 지급, card 는 카드 취소다.text필수
amount이 환불의 금액이다. 그 환불의 줄 합과 같다.bigint필수
reason환불 사유 글자다.text필수
requested_by환불을 요청한 사람의 이름 글자다.text필수
approved_by환불을 승인한 사람의 이름 글자다.text가능
created_at이 행을 만든 시각이다.timestamptz필수now()

refund_lines

환불이 어느 주문 줄에서 얼마를 되돌리는지다.

칸설명타입비움기본키
id이 환불 줄의 번호다.bigint필수identityPK
refund_id이 줄이 속한 환불이다.bigint필수FK refunds.id
order_item_id금액을 되돌리는 주문 줄이다.bigint필수FK order_items.id
amount그 주문 줄에서 되돌리는 금액이다.bigint필수
created_at이 행을 만든 시각이다.timestamptz필수now()

customer_balance_entries

예치금의 적립과 사용을 한 줄씩 적는 장부다.

칸설명타입비움기본키
id이 예치금 행의 번호다.bigint필수identityPK
customer_id이 예치금 장부의 고객이다. 고객별 잔액 합은 0 이상으로 유지한다.bigint필수FK customers.id
amount양수는 과입금이나 환불 적립이고, 음수는 주문 줄에 예치금을 쓴 금액이다.bigint필수
payment_id과입금이나 카드 충전이 원인이면 그 결제를 가리킨다.bigint가능FK payments.id
order_item_id예치금을 주문 줄에 쓰면 그 줄을 가리킨다.bigint가능FK order_items.id
refund_id환불금을 예치금으로 넣으면 그 환불을 가리킨다.bigint가능FK refunds.id
reason이 변동의 사유 글자다. 결제, 주문 줄, 환불 중 원인 칸은 하나만 채운다.text필수
created_at이 행을 만든 시각이다.timestamptz필수now()

도메인

domains

우리가 스폰서인 한 구간의 도메인이다.

칸설명타입비움기본키
id이 스폰서 구간의 번호다. 기관 이전으로 나갔다가 다시 들어오면 새 번호다.bigint필수identityPK
domain_name소문자 퓨니코드 이름이다. 이전이나 삭제 뒤 같은 이름이 다시 등록되면 새 행이다.text필수
tld_id이 이름의 최상위 라벨 행이다.bigint필수FK tlds.id
roid레지스트리 객체 번호다. 같은 번호로도 새 스폰서 구간이 생긴다.text가능
registry_account_id어느 레지스트리 계정으로 주고받았는지 적는 문자열이다.text필수
lifecycle_status스폰서 구간의 수명이다. active, expired_grace, redemption, pending_delete, pending_transfer, transferred_out, deleted 중 하나다.text필수
epp_statusesclientHold 처럼 레지스트리가 주는 상태 목록이다. 수명 상태와 따로 둔다.text[]필수{}
registrant_lock_until등록인 변경이 성공한 뒤 60일 동안 이전 잠금을 유지하는 끝 시각이다.timestamptz가능
registered_at이 스폰서 구간이 등록된 시각이다.timestamptz가능
expires_at레지스트리에 등록된 이 구간의 만료 시각이다.timestamptz필수
registrar_renew_policy레지스트리 연장 명령을 어떻게 낼지의 방침이다. follow_service, always, never 중 하나다.text필수
registry_autorenewed_at레지스트리가 먼저 자동연장한 시각이다. 같은 기간을 한 번 더 연장하지 않으려고 본다.timestamptz가능
predecessor_domain_id이 구간보다 앞선 도메인 행이다.bigint가능FK domains.id
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_live_domain_name (domain_name) where lifecycle_status not in ('transferred_out', 'deleted')

domain_services

도메인 서비스와 그 스폰서 구간을 연결한다.

칸설명타입비움기본키
service_id이 연결의 기본키이자 도메인 서비스 번호다.bigint필수PK FK services.id
kind항상 domain 이다. services 의 kind 와 같은 쌍으로 연결한다.text필수
domain_id연결된 도메인 스폰서 구간이다.bigint필수FK domains.id
linked_at서비스와 도메인 구간을 연결한 시각이다.timestamptz필수
unlinked_at그 연결을 푼 시각이다. 비어 있으면 현재 연결이다.timestamptz가능
created_at이 행을 만든 시각이다.timestamptz필수now()
FK (service_id, kind) → services (id, kind)
uq_current_domain_link (domain_id) where unlinked_at is null

domain_reservations

결제 전에 도메인 이름을 잠시 잡아 둔다.

칸설명타입비움기본키
id이 이름 예약의 번호다.bigint필수identityPK
requested_name결제 전에 잡아 둔 도메인 이름이다. 소문자 퓨니코드다.text필수
order_item_id이 예약을 만든 주문 줄이다.bigint필수FK order_items.id
expires_at이 이름 예약이 끝나는 시각이다.timestamptz필수
released_at예약을 놓은 시각이다. 비어 있으면 아직 그 이름을 잡고 있다.timestamptz가능
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_open_reservation (requested_name) where released_at is null

contacts

레지스트리에 등록하는 연락처다. 회원 정보와 따로 둔다.

칸설명타입비움기본키
id이 레지스트리 연락처의 번호다.bigint필수identityPK
customer_id이 연락처를 가진 고객이다. 비울 수 있다.bigint가능FK customers.id
name레지스트리에 내는 영문 이름 평문이다.text필수
name_loc국문 이름 평문이다. 등록인 안내 메일은 이 값이 있으면 이 이름을 쓴다.text가능
contact_kindindividual 은 개인, organization 은 조직이다.text필수
organization조직 이름이다. organization 일 때만 채운다.text가능
email레지스트리 연락처의 이메일 평문이다.text필수
phone레지스트리 연락처의 전화 평문이다.text필수
mobile레지스트리 연락처의 휴대폰 평문이다.text가능
street거리 주소 평문이다.text필수
city도시 평문이다.text필수
state지역 평문이다.text가능
postal_code우편번호 평문이다.text필수
country_code국가 코드 글자다.text필수
registry_contact_id레지스트리가 부여한 연락처 번호다.text가능
identity_kindbirth_date 는 생년월일, business_no 는 사업자번호다. 식별값과 함께 있거나 둘 다 비운다.text가능
identity_value등록인 식별의 암호문이다. 개인은 생년월일, 조직은 사업자번호이고 v1: 으로 시작한다.text가능
created_at이 행을 만든 시각이다.timestamptz필수now()

domain_contacts

도메인의 등록인, 관리자, 기술, 청구 역할과 연락처의 연결이다.

칸설명타입비움기본키
id도메인 역할과 연락처를 연결한 행의 번호다.bigint필수identityPK
domain_id이 역할이 붙은 도메인 구간이다.bigint필수FK domains.id
roleregistrant, admin, tech, billing 중 하나다.text필수
contact_id그 역할에 연결된 연락처다.bigint필수FK contacts.id
linked_atEPP 성공으로 이 역할이 현재가 된 시각이다. 비어 있으면 대기 행이다.timestamptz가능
unlinked_at그 역할에서 빠진 시각이다. 연결 시각이 있고 이 칸이 비어 있으면 현재 연락처다.timestamptz가능
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_current_domain_contact (domain_id, role) where linked_at is not null and unlinked_at is null
uq_pending_domain_contact (domain_id, role) where linked_at is null

our_nameservers

우리가 운영하는 네임서버 이름이다.

칸설명타입비움기본키
host_name우리가 운영하는 네임서버의 소문자 호스트 이름이다. 이 표의 기본키다.text필수PK
created_at이 행을 만든 시각이다.timestamptz필수now()

domain_nameservers

도메인에 지금 설정된 네임서버다.

칸설명타입비움기본키
id이 네임서버 설정의 번호다.bigint필수identityPK
domain_id네임서버가 설정된 도메인 구간이다.bigint필수FK domains.id
host_name그 도메인에 설정된 네임서버의 소문자 호스트 이름이다.text필수
sort_order이 도메인에서 네임서버를 나열하는 순서다.integer필수
ipv4글루 네임서버의 IPv4 글자다. 글루가 아니면 비운다.text가능
ipv6글루 네임서버의 IPv6 글자다. 글루가 아니면 비운다.text가능
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_domain_nameserver (domain_id, host_name)

domain_ds_records

스폰서 도메인의 DNSSEC DS 다.

칸설명타입비움기본키
id이 DS 행의 번호다.bigint필수identityPK
domain_id이 DS가 등록된 도메인 구간이다.bigint필수FK domains.id
key_tagDS 의 키 태그다. 0 이상 65535 이하다.integer필수
algorithmDNSSEC 알고리즘 번호다. 1 이상 255 이하다.integer필수
digest_type다이제스트 종류다. 2만 둔다.integer필수
digest소문자 16진수 64자의 다이제스트다.text필수
created_at이 행을 만든 시각이다.timestamptz필수now()

호스팅과 부가

hosting_servers

호스팅 패널이 도는 서버다.

칸설명타입비움기본키
id이 호스팅 서버의 번호다.bigint필수identityPK
hostname호스팅 서버의 호스트 이름이다.text필수
panel_type그 서버의 패널 종류 글자다.text필수
status그 서버의 상태 글자다.text필수
created_at이 행을 만든 시각이다.timestamptz필수now()

hosting_accounts

그 서버 위의 패널 계정이다.

칸설명타입비움기본키
id이 패널 계정의 번호다.bigint필수identityPK
server_id이 계정이 있는 호스팅 서버다. 서버를 옮기면 이 칸만 바꾼다.bigint필수FK hosting_servers.id
panel_account_id패널이 부여한 계정 식별자다.text필수
username패널 계정의 로그인 이름이다.text필수
status이 패널 계정의 상태 글자다.text필수
os_template지금 적용된 운영체제 템플릿이다. 가격이 없는 구성의 현재값이다.text가능
created_at이 행을 만든 시각이다.timestamptz필수now()

hosting_services

호스팅 서비스와 패널 계정의 연결이다.

칸설명타입비움기본키
service_id이 연결의 기본키이자 호스팅 서비스 번호다.bigint필수PK FK services.id
kind항상 hosting 이다. services 의 kind 와 같은 쌍으로 연결한다.text필수
hosting_account_id이 호스팅이 쓰는 패널 계정이다. 명의변경 뒤에도 이 계정은 유지한다.bigint필수FK hosting_accounts.id
created_at이 행을 만든 시각이다.timestamptz필수now()
FK (service_id, kind) → services (id, kind)

certificates

발급된 인증서다.

칸설명타입비움기본키
id이 인증서의 번호다.bigint필수identityPK
common_name인증서의 대표 이름이다.text필수
issuer인증서를 발급한 곳의 이름이다.text필수
serial인증서 일련번호다.text필수
expires_at인증서가 만료되는 시각이다.timestamptz필수
status인증서의 상태 글자다.text필수
dcv_method도메인 소유 확인 방법이다. email, dns, http 중 하나이거나 비운다.text가능
created_at이 행을 만든 시각이다.timestamptz필수now()

ssl_services

SSL 서비스와 인증서의 연결이다.

칸설명타입비움기본키
service_id이 연결의 기본키이자 SSL 서비스 번호다.bigint필수PK FK services.id
kind항상 ssl 이다. services 의 kind 와 같은 쌍으로 연결한다.text필수
certificate_id이 SSL 서비스가 쓰는 인증서다. 명의변경은 같은 인증서를 새 서비스가 가리킨다.bigint필수FK certificates.id
created_at이 행을 만든 시각이다.timestamptz필수now()
FK (service_id, kind) → services (id, kind)

mail_services

메일 상품의 용량과 연결 존이다.

칸설명타입비움기본키
service_id이 연결의 기본키이자 메일 서비스 번호다.bigint필수PK FK services.id
kind항상 mail 이다. services 의 kind 와 같은 쌍으로 연결한다.text필수
quota_bytes이 메일 서비스에 허용된 용량의 바이트 수다.bigint필수
zone_id이 메일 서비스에 연결한 DNS 존이다.bigint가능FK dns_zones.id
created_at이 행을 만든 시각이다.timestamptz필수now()
FK (service_id, kind) → services (id, kind)

server_services

서버 상품의 호스트와 주소다.

칸설명타입비움기본키
service_id이 연결의 기본키이자 서버 서비스 번호다.bigint필수PK FK services.id
kind항상 server 이다. services 의 kind 와 같은 쌍으로 연결한다.text필수
hostname그 서버의 호스트 이름이다.text필수
ipv4그 서버의 IPv4 글자다.text필수
created_at이 행을 만든 시각이다.timestamptz필수now()
FK (service_id, kind) → services (id, kind)

dbms_services

DBMS 상품의 접속 식별이다.

칸설명타입비움기본키
service_id이 연결의 기본키이자 DBMS 서비스 번호다.bigint필수PK FK services.id
kind항상 dbms 다. services 의 kind 와 같은 쌍으로 연결한다.text필수
hostDBMS 가 듣는 호스트 글자다.text필수
portDBMS 가 듣는 포트 번호다.integer필수
db_name데이터베이스 이름이다.text필수
created_at이 행을 만든 시각이다.timestamptz필수now()
FK (service_id, kind) → services (id, kind)

security_services

WAF, VPN, NMS 중 어떤 보안 상품인지다.

칸설명타입비움기본키
service_id이 연결의 기본키이자 보안 서비스 번호다.bigint필수PK FK services.id
kind항상 security 다. services 의 kind 와 같은 쌍으로 연결한다.text필수
security_kindwaf, vpn, nms 중 이 보안 상품의 종류다.text필수
created_at이 행을 만든 시각이다.timestamptz필수now()
FK (service_id, kind) → services (id, kind)

DNS

dns_zones

레코드를 두는 존이다. 스폰서 도메인 또는 dns 서비스 중 하나에 붙는다.

칸설명타입비움기본키
id이 존의 번호다.bigint필수identityPK
zone_name소문자 퓨니코드로 적은 존 이름이다.text필수
domain_id우리가 스폰서인 도메인의 존이면 그 도메인 구간을 가리킨다.bigint가능FK domains.id
service_id타사 이름이나 2차 도메인이면 kind 가 dns 인 서비스를 가리킨다.bigint가능FK services.id
parent_zone_id이 존의 부모 존이다. 2차 도메인은 비울 수 있다.bigint가능FK dns_zones.id
closed_atdns 서비스를 끝내며 존을 닫은 시각이다. 명의변경은 이 칸을 비운 채 서비스만 바꾼다.timestamptz가능
created_at이 행을 만든 시각이다.timestamptz필수now()
uq_zone_domain (domain_id) where domain_id is not null
uq_zone_service (service_id) where service_id is not null
uq_open_external_zone_name (zone_name) where service_id is not null and closed_at is null

dns_records

존에 저장하는 DNS 레코드다.

칸설명타입비움기본키
id이 레코드의 번호다.bigint필수identityPK
zone_id이 레코드가 속한 존이다.bigint필수FK dns_zones.id
host존 안에서 이 레코드의 호스트 글자다.text필수
record_typeA, AAAA, CNAME, MX, TXT, CAA, SRV, DNAME 중 레코드 타입이다.text필수
ttl응답을 캐시하는 초다.integer필수
priorityMX 또는 SRV 의 우선순위다. 다른 타입은 비울 수 있다.integer가능
value레코드가 가리키는 값이다.text필수
created_at이 행을 만든 시각이다.timestamptz필수now()

zone_publish

존을 위임, 파킹, URL 포워딩 중 무엇으로 내는지다.

칸설명타입비움기본키
zone_id이 발행 설정의 존이다. 이 표의 기본키다.bigint필수PK FK dns_zones.id
modedelegation 은 위임, parking 은 파킹, http_forward 는 URL 포워딩이다.text필수
forward_urlURL 포워딩 주소다. http:// 또는 https:// 로 시작한다.text가능
forward_keep_url포워딩할 때 원래 주소를 유지하면 참이다. http_forward 일 때만 참이 된다.boolean필수
parking_title파킹 페이지의 제목이다.text가능
parking_note파킹 페이지의 안내 글이다.text가능
inquiry_enabled파킹 페이지에서 문의를 받으면 참이다. parking 일 때만 참이 된다.boolean필수
created_at이 행을 만든 시각이다.timestamptz필수now()

개통, 세금, 안내

provisioning_jobs

주문 줄을 레지스트리나 존에 반영하는 작업이다. 재시도는 같은 행에서 한다.

칸설명타입비움기본키
id이 개통 작업의 번호다.bigint필수identityPK
order_item_id이 작업이 이행하는 주문 줄이다.bigint필수FK order_items.id
idempotency_key같은 개통 작업을 두 번 넣지 않게 하는 키다.text필수UNIQUE
job_typeepp_create, epp_renew, epp_delete, epp_update_contact, epp_update_ns, epp_update_status, epp_transfer_reject, epp_authinfo, epp_update_ds, epp_transfer, zone_sync, privacy_on, privacy_off, migrate 중 작업 종류다.text필수
status이 작업의 진행 상태 글자다.text필수
attempts이 작업을 다시 시도한 횟수다. 실패해도 주문 줄을 새로 만들지 않고 이 값을 올린다.integer필수
last_error마지막 실패의 오류 글자다.text가능
created_at이 행을 만든 시각이다.timestamptz필수now()

registry_events

레지스트리가 보낸 수신 사건이다.

칸설명타입비움기본키
id이 수신 사건의 번호다.bigint필수identityPK
registry_account_id그 메시지를 받은 레지스트리 계정 문자열이다. 같은 계정의 메시지 번호는 한 번만 저장한다.text필수
message_id레지스트리 메시지 번호다.text필수
domain_id어느 도메인 구간인지다. 아직 이름을 맞추지 못하면 비운다.bigint가능FK domains.id
event_type레지스트리 사건의 종류 글자다.text필수
payload그 메시지의 본문이다.jsonb필수
processed_at우리가 그 사건을 처리한 시각이다.timestamptz가능
created_at이 행을 만든 시각이다.timestamptz필수now()
UNIQUE (registry_account_id, message_id)

customer_tax_profiles

고객 한 명의 세금계산서와 현금영수증 신청 정보다.

칸설명타입비움기본키
customer_id이 프로필의 고객이다. 고객당 한 행이고 기본키다.bigint필수PK FK customers.id
buyer_kindindividual 은 개인, business 는 사업자다. 세금계산서는 business 만 고른다.text필수
legal_name세금 문서에 쓸 상호 또는 이름 평문이다.text필수
business_no숫자 10자리 사업자번호 평문이다. 하이픈은 빼고 저장한다.text가능
representative_name대표자 이름 평문이다.text가능
address사업장 주소 평문이다.text가능
email세금 문서에 쓸 이메일 평문이다.text가능
business_type업태 평문이다.text가능
business_item종목 평문이다.text가능
evidence_preferencenone, tax_invoice, cash_receipt 중 고객이 고른 증빙이다.text필수
cash_receipt_purposepersonal 은 소득공제용, business 는 지출증빙용이다.text가능
cash_receipt_identifier현금영수증 식별자의 암호문이다. v1: 으로 시작한다.text가능
created_at이 행을 만든 시각이다.timestamptz필수now()

tax_documents

발행한 세금계산서 또는 현금영수증이다.

칸설명타입비움기본키
id이 증빙 문서의 번호다.bigint필수identityPK
customer_id이 문서를 받는 고객이다.bigint필수FK customers.id
doc_typetax_invoice 는 세금계산서, cash_receipt 는 현금영수증이다.text필수
statusissued 는 살아 있는 발행분이고 void 는 발행분 합계에서 빠진다.text필수
supply_amount이 문서에 담긴 줄의 공급가 합이다.bigint필수
vat_amount이 문서에 담긴 줄의 부가세 합이다.bigint필수
amount이 문서에 담긴 줄의 부가세 포함 금액 합이다.bigint필수
written_on문서를 만든 서울 날짜다. 이후 바꾸지 않는다.date필수
approval_no밖에서 돌아온 승인번호다. 한 번 채우면 바꾸지 않는다.text가능
buyer_legal_name발행 당시의 공급받는자 이름이다.text필수
buyer_business_no발행 당시의 사업자번호다. 프로필을 나중에 고쳐도 이 값은 그대로다.text가능
buyer_representative발행 당시의 대표자 이름이다.text가능
buyer_address발행 당시의 공급받는자 주소 평문이다.text가능
buyer_email발행 당시의 공급받는자 이메일이다.text가능
business_type발행 당시의 업태다.text가능
business_item발행 당시의 종목이다.text가능
cash_receipt_purpose발행 당시의 현금영수증 용도다. 차액 문서는 원본의 용도를 복사한다.text가능
cash_receipt_identifier발행 당시의 식별자 암호문이다. 프로필 암호문을 바이트 그대로 복사한다.text가능
adjusts_document_id금액을 고치는 문서가 가리키는 원본이다.bigint가능FK tax_documents.id
created_at이 행을 만든 시각이다.timestamptz필수now()

tax_document_lines

그 문서가 담는 주문 줄과 금액이다.

칸설명타입비움기본키
id이 문서 줄의 번호다.bigint필수identityPK
tax_document_id이 줄이 속한 증빙 문서다.bigint필수FK tax_documents.id
order_item_id이 문서 줄이 가리키는 주문 줄이다.bigint필수FK order_items.id
supply_amount그 주문 줄에서 이 문서에 담는 공급가다.bigint필수
vat_amount그 줄 금액에 11로 나눈 몫을 절사한 부가세다.bigint필수
amount그 주문 줄에서 이 문서에 담는 부가세 포함 금액이다.bigint필수
created_at이 행을 만든 시각이다.timestamptz필수now()

payment_notice_mails

만기 안내로 보내는 이메일이다.

칸설명타입비움기본키
id이 안내 메일의 번호다.bigint필수identityPK
customer_id이 안내의 계정 고객이다.bigint필수FK customers.id
service_id안내하는 서비스다. 부모와 자식은 메일을 한 통으로 합치지 않는다.bigint필수FK services.id
triggerauto 는 기준일에 맞춰 만든 메일이고, manual 은 다시 보낸 메일이다.text필수
anchor_on서비스 기준일이다. next_due_at 의 서울 날짜이고, 그 시각이 없으면 expires_at 의 날짜다.date필수
offset_days자동 메일은 기준일에서 30, 7, 1, 0, -1 일이다. 0은 당일, -1은 다음 날이다. 수동은 비운다.integer가능
to_address받는 이메일이다. 계정 메일은 넣을 때의 고객 이메일이고, 등록인 이메일이 다르면 그 소문자 주소로 한 통을 더 만든다.text필수
subject서비스 표시와 기준일 YYYY-MM-DD 가 들어 있는 제목이다.text필수
body누구의 어느 서비스가 어느 날 끝나는지 적은 본문이다. 연장 금액을 정할 수 있으면 그 금액도 적는다.text필수
statusqueued, sent, failed, skipped 중 하나다. 보내기 직전 대상이 아니면 skipped 로 두고 보내지 않는다.text필수
sent_at메일을 보낸 시각이다. skipped 이면 비운다.timestamptz가능
last_error발송에 실패했을 때의 오류 글자다.text가능
resend_of_id다시 보내며 제목과 본문을 복사한 원본 메일이다. 원본은 sent 또는 failed 다.bigint가능FK payment_notice_mails.id
created_at이 행을 만든 시각이다.timestamptz필수now()
quoted_amount그 아침에 자동 연장 줄을 만들 수 있으면 그 줄의 금액이고, 아니면 비운다.bigint가능
uq_auto_payment_notice (service_id, anchor_on, offset_days, to_address) where "trigger" = 'auto'

감사

audit_events

인트라넷에서 행을 추가하거나 고치거나 지운 기록이다.

칸설명타입비움기본키
id이 감사 행의 번호다.bigint필수identityPK
occurred_at그 변경 트랜잭션이 시작한 시각이다.timestamptz필수
request_id같은 요청의 감사 행을 묶는 글자다.text가능
actor_kindcustomer, staff, system 중 누가 바꿨는지다. 행위자 설정을 비우면 system 이다.text필수
actor_customer_id고객이 바꿨으면 그 고객이다.bigint가능FK customers.id
actor_label세션을 열 때 복사한 직원 이름이다. 이후 직원 이름이 바뀌어도 이 글자는 그대로다.text가능
actioninsert, update, delete 중 하나다.text필수
table_name바뀐 표의 이름이다.text필수
row_pk바뀐 행의 기본키만 담은 JSON 이다.jsonb필수
changed_columns이번 변경에서 값이 있거나 달라진 칸의 이름 목록이다.text[]필수
before바꾸기 전 행이다. 비밀 칸은 [redacted] 로 남긴다. 추가면 비운다.jsonb가능
after바꾼 뒤 행이다. 비밀 칸은 [redacted] 로 남긴다. 삭제는 비운다.jsonb가능
created_at이 감사 행을 기록한 시각이다.timestamptz필수now()
actor_staff_id직원이 바꿨으면 그 직원이다. 고객이나 시스템 변경은 비운다.bigint가능FK staff.id