Home
>
DB
>
πΎ[Database] Primary Key μμ± μ λ΅ - μ λν¬ μ λ ¬ λ¬Έμμ΄
Database
Primary Key
DBMS
βπΎ[Database] Primary Key μμ± μ λ΅ - μ λν¬ μ λ ¬ λ¬Έμμ΄β
π Intro.
-
Primary Key(PK)λ₯Ό μμ±ν λ, κ° IDκ° κ³ μ νλ©΄μλ μμ±λ μμλλ‘ μ λ ¬μ΄ κ°λ₯νλλ‘ λ§λλ λ°©μμ
λλ€.
- μ΄ λ°©μμ UUIDμ²λΌ μΆ©λ μλ κ³ μ μ±μ μ μ§νλ©΄μλ, μ λ ¬μ΄ κ°λ₯νλλ‘ μκ° κΈ°λ°μ μμλ₯Ό ν¬ν¨νλ κ²μ΄ ν΅μ¬μ
λλ€.
β
1οΈβ£ μ λν¬ μ λ ¬ λ¬Έμμ΄ λ°©μμ΄ νμν μ΄μ .
- κΈ°μ‘΄μ PK μμ± λ°©μμλ λͺ κ°μ§ λ¬Έμ μ μ΄ μμ΅λλ€.
β1οΈβ£ UUIDμ λ¬Έμ μ .
- UUIDλ μΆ©λ μμ΄ μ λν¬νμ§λ§, μ λ ¬μ΄ λΆκ°λ₯ν©λλ€.
- IDκ° λλ€νκ² μμ±λκΈ° λλ¬Έμ μ΅κ·Ό λ°μ΄ν° μ λ ¬μ΄ μ΄λ ΅μ΅λλ€.
-
λ¬Έμμ΄ κΈΈμ΄κ° κΈΈκ³ μΈλ±μ± μ±λ₯ μ ν κ°λ₯μ±μ΄ μμ΅λλ€.
β2οΈβ£ AUTO_INCREMENT(μ«μ μ¦κ° λ°©μ)μ λ¬Έμ μ .
- μ¬λ¬ μλ²(λΆμ° νκ²½)μμ μ¬μ©νλ©΄ μ€λ³΅ λ°μ κ°λ₯μ±μ΄ μμ΅λλ€.
- IDκ° μμΈ‘ κ°λ₯νμ¬ λ³΄μμ μ·¨μ½μ μ΄ μ‘΄μ¬ν©λλ€.
β
μ λν¬ μ λ ¬ λ¬Έμμ΄ λ°©μμ΄ ν΄κ²°νλ λ¬Έμ .
- UUIDμ²λΌ κ³ μ νμ§λ§, μκ°μμΌλ‘ μ λ ¬μ΄ κ°λ₯ν©λλ€.
- μλ²κ° μ¬λ¬ κ°μ¬λ μ€λ³΅λμ§ μμ΅λλ€ (λΆμ° νκ²½μμλ μμ μ ).
- IDκ° μΌμ ν ν¨ν΄μ κ°μ§λ―λ‘, μΈλ±μ± μ±λ₯μ΄ λ μ’μ΅λλ€.
β
2οΈβ£ μ λν¬ μ λ ¬ λ¬Έμμ΄ λ°©μ μ’
λ₯
μ λ΅ |
μμ |
κΈΈμ΄ |
νΉμ§ |
KSUID |
0ujsswThIGTUYm2K8FjOOfXtY1K |
27μ |
UUIDλ³΄λ€ μ§§κ³ , μκ° μ λ ¬ κ°λ₯ |
ULID |
01F8MECHZX3TBXYN5RRTG1X3J6 |
26μ |
UUIDλ³΄λ€ μ§§κ³ , μμ± μμλλ‘ μ λ ¬ κ°λ₯ |
Sonyflake |
404168231342172160 |
19μ |
Snowflakeμ μ μ¬, λΉ λ₯Έ μλ |
Short UUID + Timestamp |
20250131235959-8f9c7d3a |
κ°λ³ |
λ μ§ κΈ°λ°μΌλ‘ μ λ ¬ κ°λ₯ |
- κ° λ°©μμ μκ° μ λ³΄κ° ν¬ν¨λμ΄ μμ±λ μμλλ‘ μ λ ¬μ΄ κ°λ₯νλλ‘ μ€κ³λμ΄ μμ΅λλ€.
β
3οΈβ£ μ λν¬ μ λ ¬ λ¬Έμμ΄ λ°©μμ μμ μ½λ.
π οΈ1οΈβ£ ULID(Universally Unique Lexicographically Sortable Identifier)
- ULIDλ UUIDλ³΄λ€ μ§§κ³ , μμ± μμλλ‘ μ λ ¬μ΄ κ°λ₯ν ID λ°©μμ
λλ€.
π ULID νΉμ§.
- UUIDλ³΄λ€ 10μ μ λ 짧μ (26μ)
- μμ±λ μμλλ‘ μ λ ¬ κ°λ₯ (μκ° μ 보 ν¬ν¨)
- URL-safe (νΉμλ¬Έμκ° μμ)
- λμλ¬Έμ κ΅¬λΆ (Base32 μ¬μ©)
π Spring Bootμμ ULID μ¬μ©νκΈ°.
- ULIDλ₯Ό μ¬μ©νλ €λ©΄ ulid λΌμ΄λΈλ¬λ¦¬λ₯Ό μΆκ°ν΄μΌ ν©λλ€.
1οΈβ£ Maven λλ Gradleμ λΌμ΄λΈλ¬λ¦¬ μΆκ°.
<dependency>
<groupId>de.huxhorn.sulky</groupId>
<artifactId>de.huxhorn.sulky.ulid</artifactId>
<version>8.3.0</version>
</dependency>
2οΈβ£ ULID κΈ°λ° ID μμ±.
import de.huxhorn.sulky.ulid.ULID;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
@Entity
@Table(name = "article")
public class Article {
@Id
@Column(name = "article_id", updatable = false, nullable = false, length = 26)
private String articleId;
private String title;
private String content;
@PrePersist
public void generateId() {
ULID ulid = new ULID();
this.articleId = ulid.nextULID(); // ULID μμ±
}
}
β
ULIDμ μ£Όμ μ₯μ .
- nextULID()λ₯Ό νΈμΆν λλ§λ€ μλ‘μ΄, μ λ ¬ κ°λ₯ν κ³ μ IDκ° μμ±λ¨.
- μκ° μ λ ¬μ΄ κ°λ₯νμ¬ ORDER BY article_id ASCλ‘ μ΅κ·Ό λ°μ΄ν°λ₯Ό μ½κ² μ‘°ν κ°λ₯.
π οΈ2οΈβ£ KSUID(K-Sortable Unique ID)
- KSUIDλ ULIDμ λΉμ·νμ§λ§, λ κΈ΄ ID(27μ)λ₯Ό μ¬μ©νλ©° UUIDλ³΄λ€ μ λ ¬μ΄ μ½μ΅λλ€.
π KSUIDμ νΉμ§.
- μκ° κΈ°λ° μ λ ¬ κΈ°λ₯.
- UUIDλ³΄λ€ μ§§κ³ μ½κΈ° μ¬μ.
- κ³ μ μ±μ΄ 보μ₯λ¨,
π Spring Bootμμ KSUID μ μ©.
1οΈβ£ Maven λλ Gradleμ λΌμ΄λΈλ¬λ¦¬ μΆκ°.
<dependency>
<groupId>com.github.ksuid</groupId>
<artifactId>ksuid</artifactId>
<version>1.0.0</version>
</dependency>
2οΈβ£ KSUID κΈ°λ° ID μμ±.
import com.github.ksuid.Ksuid;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
@Entity
@Table(name = "article")
public class Article {
@Id
@Column(name = "article_id", updatable = false, nullable = false, length = 27)
private String articleId;
private String title;
private String content;
@PrePersist
public void generateId() {
this.articleId = Ksuid.newKsuid().toString(); // KSUID μμ±
}
}
β
KSUIDμ μ£Όμ μ₯μ
- newKsuid().toString()μ νΈμΆν λλ§λ€ μλ‘μ΄, μ λ ¬ κ°λ₯ν κ³ μ IDκ° μμ±λ¨.
- UUIDλ³΄λ€ μ§§κ³ , λ λΉ λ¦.
- μ λ ¬μ΄ κ°λ₯νμ¬ μ΅κ·Ό λ°μ΄ν° μ‘°νκ° μ½λ€.
π οΈ3οΈβ£ Short UUID + Timestamp (컀μ€ν
λ°©μ)
- λ§μ½ μ§μ UUIDλ₯Ό μ§§κ² λ³ννκ³ , μκ° μ 보μ μ‘°ν©νμ¬ κ³ μ ν μ λ ¬ λ¬Έμμ΄μ λ§λ€ μλ μμ΅λλ€.
π Short UUID + Timestampμ νΉμ§.
- λ μ§ κΈ°λ°μΌλ‘ μ λ ¬ κ°λ₯
- UUIDλ³΄λ€ μ§§κ³ , κ°λ
μ±μ΄ μ’μ
- νΉμ λΉμ¦λμ€ λ‘μ§μ λ§κ² 컀μ€ν
κ°λ₯
π Javaμμ Short UUID + Timestamp μ μ©
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
public class CustomIdGenerator {
public static String generateId() {
String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
String shortUUID = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 8);
return timestamp + "-" + shortUUID;
}
public static void main(String[] args) {
System.out.println(generateId()); // μ: 20250201093045-8f9c7d3a
}
}
β
μ΄ λ°©μμ μ₯μ
- μ λ ¬ κΈ°λ₯ (λ μ§ κΈ°λ°)
- UUIDλ³΄λ€ μ§§κ³ κ°λ
μ±μ΄ μ’μ
- UUIDμ μΆ©λ λ°©μ§ κΈ°λ₯μ μ μ§
β
4οΈβ£ μ λν¬ μ λ ¬ λ¬Έμμ΄ λ°©μμ λΉκ΅
μ λ΅ |
μμ |
κΈΈμ΄ |
νΉμ§ |
ULID |
01F8MECHZX3TBXYN5RRTG1X3J6 |
26μ |
UUIDλ³΄λ€ μ§§κ³ , μμ± μμλλ‘ μ λ ¬ κ°λ₯ |
KSUID |
0ujsswThIGTUYm2K8FjOOfXtY1K |
27μ |
UUIDλ³΄λ€ μ§§κ³ , μκ° μ λ ¬ κ°λ₯ |
Short UUID + Timestame |
20250201093045-8f9c7d3a |
κ°λ³ |
λ μ§ κΈ°λ°μΌλ‘ μ λ ¬ κ°λ₯ |
β
5οΈβ£ κ²°λ‘ .
- UUIDλ μ λ ¬μ΄ μ΄λ ΅κ³ κΈΈλ€.
- ULID, KSUID κ°μ λ°©μμ μ λν¬νλ©΄μλ μμ±λ μμλλ‘ μ λ ¬ κ°λ₯.
- Short UUID + Timestampλ μ§μ 컀μ€ν
νμ¬ μ¬μ©ν μλ μμ.