Home > DB > πŸ’Ύ[Database] Primary Key 생성 μ „λž΅ - μœ λ‹ˆν¬ μ •λ ¬ 숫자

πŸ’Ύ[Database] Primary Key 생성 μ „λž΅ - μœ λ‹ˆν¬ μ •λ ¬ 숫자
Database Primary Key DBMS

β€œπŸ’Ύ[Database] Primary Key 생성 μ „λž΅ - μœ λ‹ˆν¬ μ •λ ¬ μˆ«μžβ€

🍎 Intro.

  • PK(Primary Key)λ₯Ό 생성할 λ•Œ, 각 IDκ°€ κ³ μœ ν•˜λ©΄μ„œλ„ μƒμ„±λœ μˆœμ„œλŒ€λ‘œ 정렬이 κ°€λŠ₯ν•˜λ„λ‘ λ§Œλ“œλŠ” λ°©μ‹μž…λ‹ˆλ‹€.
  • 이 방식은 숫자 기반 ID(예: Snowflake, Sonyflake, TikTok ID λ“±)λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±λœ μˆœμ„œλŒ€λ‘œ μ •λ ¬ κ°€λŠ₯ν•˜λ„λ‘ μ„€κ³„λœ 것이 νŠΉμ§•μž…λ‹ˆλ‹€.

βœ…1️⃣ μœ λ‹ˆν¬ μ •λ ¬ 숫자 방식이 ν•„μš”ν•œ 이유.

βœ…1️⃣ μœ λ‹ˆν¬ μ •λ ¬ 숫자 λ°©μ‹μ˜ μž₯점.

  • μƒμ„±λœ μˆœμ„œλŒ€λ‘œ μ •λ ¬ κ°€λŠ₯ ➞ 졜근 데이터λ₯Ό μ‰½κ²Œ 쑰회 κ°€λŠ₯.
  • μˆ«μžν˜• IDμ΄λ―€λ‘œ 인덱싱 μ„±λŠ₯이 우수 ➞ UUID보닀 빠름.
  • 닀쀑 μ„œλ²„ ν™˜κ²½(λΆ„μ‚° μ‹œμŠ€ν…œ)μ—μ„œλ„ κ³ μœ μ„± 보μž₯ κ°€λŠ₯.
  • λŒ€λŸ‰ νŠΈλž˜ν”½ μ²˜λ¦¬μ— 적합.

❌2️⃣ κΈ°μ‘΄ 숫자 기반 PK(AUTO_INCREMENT)의 문제점.

  • 단일 μ„œλ²„ ν™˜κ²½μ—μ„œλŠ” 문제 μ—†μ§€λ§Œ, 닀쀑 μ„œλ²„(λΆ„μ‚° ν™˜κ²½)μ—μ„œλŠ” 좩돌 κ°€λŠ₯μ„± 있음.
  • IDκ°€ 예츑 κ°€λŠ₯ν•˜μ—¬ λ³΄μ•ˆμƒ 취약함 ➞ κ³΅κ²©μžκ°€ νŠΉμ • IDλ₯Ό μΆ”μΈ‘ν•  수 있음.
  • λŒ€λŸ‰ νŠΈλž˜ν”½ μ²˜λ¦¬μ— μ ν•©ν•˜μ§€ μ•ŠμŒ.(μˆ«μžκ°€ 순차적으둜 μ¦κ°€ν•˜λ©΄μ„œ μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯)

βœ…2️⃣ μœ λ‹ˆν¬ μ •λ ¬ 숫자 λ°©μ‹μ˜ μ’…λ₯˜.

μ „λž΅ 예제 길이 νŠΉμ§•
Snowflake (Twitter 방식) 146789123456789012 19자 μ‹œκ°„ 기반 μ •λ ¬ κ°€λŠ₯, μ„±λŠ₯ μ΅œμ ν™”.
Sonyflake (Go μ–Έμ–΄ 기반) 404168231342172160 19자 Snowflake보닀 더 빠름.
TikTok ID 720615963569438720 18~19자 Snowflake λ³€ν˜•, κΈ€λ‘œλ²Œ μ„œλΉ„μŠ€ μ‚¬μš©.
Flake ID (Custom 방식) 1706745678123456 16자 Snowflakeλ₯Ό λ‹¨μˆœν™”ν•œ 버전

βœ…3️⃣ μœ λ‹ˆν¬ μ •λ ¬ 숫자 λ°©μ‹μ˜ 예제 μ½”λ“œ

πŸ› οΈ1️⃣ Snowflake(Twitterμ—μ„œ κ°œλ°œν•œ λΆ„μ‚° ID)

πŸ“Œ Snowflakeλž€?

  • Twitterμ—μ„œ λŒ€λŸ‰μ˜ νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ κ°œλ°œν•œ ID 생성 μ•Œκ³ λ¦¬μ¦˜.
  • 64λΉ„νŠΈ μ •μˆ˜ (19자리)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •λ ¬ κ°€λŠ₯.
  • μ‹œκ°„ 정보 + μ„œλ²„ 정보 + μ‹œν€€μŠ€ 번호둜 IDλ₯Ό 생성.

πŸ“ Snowflake ID ꡬ쑰

λΉ„νŠΈ 수 μ„€λͺ…
1λΉ„νŠΈ μ˜ˆμ•½(항상 0)
41λΉ„νŠΈ νƒ€μž„μŠ€νƒ¬ν”„(ν˜„μž¬ μ‹œκ°„ κΈ°μ€€)
10λΉ„νŠΈ μ„œλ²„ ID λ˜λŠ” 데이터센터 ID
12λΉ„νŠΈ μ‹œν€€μŠ€ 번호 (같은 λ°€λ¦¬μ΄ˆ λ‚΄μ—μ„œ 증가)

πŸ“Œ Snowflake ID Java κ΅¬ν˜„.

import java.time.Instant;

public class Snowflake {
    private static final long EPOCH = 1640995200000L; // κΈ°μ€€ μ‹œκ°„(2022-01-01 00:00:00)
    private static final long MACHINE_ID = 1L;
    private static final long SEQUENCE_BITS = 12L;
    
    private long lastTimestamp = -1L;
    private long sequence = 0L;
    
    public synchronized long nextId() {
        long timestamp = Instant.now().toEpochMilli();
        if (timestamp == lastTimestamp) {
            sequence = (sequence + 1) & ((1 << SEQUENCE_BITS) - 1);
            if (sequence == 0) {
                while (timestamp <= lastTimestamp) {
                    timestamp = Instant.now().toEpochMilli();
                }
            }
        } else {
            sequence = 0;
        }
        lastTimestamp = timestamp;
        return ((timestamp - EPOCH) << (64 - 41)) | (MACHINE_ID << (64 - 41 - 10)) | sequence;
    }
}

βœ… Snowflake ID νŠΉμ§•.

  • μ‹œκ°„ 기반 IDμ΄λ―€λ‘œ μžλ™ μ •λ ¬ κ°€λŠ₯.
  • 19자리 μ •μˆ˜(BIGINT)둜 μ €μž₯ κ°€λŠ₯.
  • 닀쀑 μ„œλ²„ ν™˜κ²½μ—μ„œλ„ 좩돌 μ—†μŒ.

πŸ› οΈ2️⃣ Sonyflake(Go μ–Έμ–΄ 기반의 λΉ λ₯Έ ID 생성)

πŸ“Œ Sonyflakeλž€?

  • Snowflake보닀 λ‹¨μˆœν•˜κ³  λΉ λ₯Έ ID 생성 μ•Œκ³ λ¦¬μ¦˜.
  • μ‹œκ°„. 정보 + λ¨Έμ‹  ID + μ‹œν€€μŠ€ 번호둜 ꡬ성.

πŸ“Œ Sonyflake ID Java κ΅¬ν˜„.

import java.time.Instant;

public class Sonyflake {
    private static final long EPOCH = 1640995200000L; // κΈ°μ€€ μ‹œκ°„(2022-01-01 00:00:00)
    private static final long MACHINE_ID = 1L;
    private static final long SEQUENCE_BITS = 8L;
    
    private long lastTimestamp = -1L;
    private long sequence = 0L;
    
    public synchronized long nextId() {
        long timestamp = Instant.now().toEpochMilli();
        if (timestamp == lastTimestamp) {
            sequence = (sequence + 1) & ((1 << SEQUENCE_BITS) - 1);
            if (sequence == 0) {
                while (timestamp <= lastTimestamp) {
                    timestamp = Instant.now().toEpochMilli();
                }
            }
        } else {
            sequence = 0;
        }
        lastTimestamp = timestamp;
        return ((timestamp - EPOCH) << (64 - 39)) | (MACHINE_ID << (64 - 39 - 8)) | sequence;
    }
}

βœ… Sonyflake의 μž₯점.

  • Snowflake보닀 더 λΉ λ₯΄κ³  κ²½λŸ‰.
  • λΉ„νŠΈ 연산을 μ΅œμ ν™”ν•˜μ—¬ μ„±λŠ₯ ν–₯상.
  • κ°„λ‹¨ν•œ ꡬ쑰둜 μ„œλ²„μ—μ„œ μ‰½κ²Œ μ‚¬μš© κ°€λŠ₯.

πŸ› οΈ3️⃣ TikTok ID (Snowflake λ³€ν˜•)

πŸ“Œ TikTok IDλž€?

  • Snowflake κΈ°λ°˜μ΄μ§€λ§Œ μ‹œν€€μŠ€ λ²ˆν˜Έκ°€ 더 크고, κΈ€λ‘œλ²Œ μ‚¬μš©μ— μ΅œμ ν™”λ¨.
  • 데이터센터 ID, λ¨Έμ‹  ID 등을 μ΅œμ ν™”ν•˜μ—¬ μ‚¬μš©.

πŸ“Œ TikTok ID Java κ΅¬ν˜„

public class TikTokIdGenerator {
    private static final long START_TIMESTAMP = 1420070400000L; // 2015-01-01 00:00:00
    private static final long SEQUENCE_BITS = 12L;
    private static final long MACHINE_ID = 1L;
    
    private long lastTimestamp = -1L;
    private long sequence = 0L;

    public synchronized long nextId() {
        long timestamp = System.currentTimeMillis();
        if (timestamp == lastTimestamp) {
            sequence = (sequence + 1) & ((1 << SEQUENCE_BITS) - 1);
            if (sequence == 0) {
                while (timestamp <= lastTimestamp) {
                    timestamp = System.currentTimeMillis();
                }
            }
        } else {
            sequence = 0;
        }
        lastTimestamp = timestamp;
        return ((timestamp - START_TIMESTAMP) << (64 - 41)) | (MACHINE_ID << (64 - 41 - 10)) | sequence;
    }
}

βœ… TikTok ID의 νŠΉμ§•.

  • Snowflake보닀 더 μœ μ—°ν•œ ꡬ쑰.
  • λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œ κ³ μœ μ„± μœ μ§€.

βœ…4️⃣ μœ λ‹ˆν¬ μ •λ ¬ μˆ«μžγ… λ°©μ‹μ˜ 비ꡐ.

μ „λž΅ 예제 길이 νŠΉμ§•
Snowflake 146789123456789012 19자 μ‹œκ°„ 기반 μ •λ ¬ κ°€λŠ₯, μ„±λŠ₯ μ΅œμ ν™”
Sonyflake 404168231342172160 19자 Snowflake보닀 더 빠름.
TikTok ID 720615963569438720 18 ~ 19자 Snowflake λ³€ν˜•, κΈ€λ‘œλ²Œ μ„œλΉ„μŠ€ μ‚¬μš©
Flake ID 1706745678123456 16자 Snowflakeλ₯Ό λ‹¨μˆœν™”ν•œ 버전

βœ…5️⃣ κ²°λ‘ ..

  • Snowflake, Sonyflake, TikTok ID 같은 μœ λ‹ˆν¬ μ •λ ¬ 숫자 방식은 κ³ μœ μ„±κ³Ό μ •λ ¬ κ°€λŠ₯성을 λ™μ‹œμ— 제곡.
  • UUID보닀 인덱싱 μ„±λŠ₯이 μš°μˆ˜ν•˜λ©°, λŒ€λŸ‰ νŠΈλž˜ν”½μ—μ„œλ„ μ•ˆμ •μ .
  • κ³ μ„±λŠ₯ μ‹œμŠ€ν…œ, 금육 μ„œλΉ„μŠ€, 둜그 μ €μž₯ 등에 적합.