Home
>
DB
>
πΎ[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οΈβ£ μ λν¬ μ λ ¬ μ«μ λ°©μμ μμ μ½λ
π 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λ³΄λ€ μΈλ±μ± μ±λ₯μ΄ μ°μνλ©°, λλ νΈλν½μμλ μμ μ .
- κ³ μ±λ₯ μμ€ν
, κΈμ΅ μλΉμ€, λ‘κ·Έ μ μ₯ λ±μ μ ν©.