๋ฉ”์ธ ์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
Sonamu๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ง€์›ํ•˜๋ฉฐ, ๊ฐ ํƒ€์ž…์€ PostgreSQL, TypeScript, JSON์—์„œ ์ ์ ˆํ•˜๊ฒŒ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

๊ณตํ†ต ์˜ต์…˜

๋ชจ๋“  ํ•„๋“œ ํƒ€์ž…์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.
์˜ต์…˜ํƒ€์ž…์„ค๋ช…๊ธฐ๋ณธ๊ฐ’
namestringํ•„๋“œ๋ช… (snake_case)ํ•„์ˆ˜
typestring๋ฐ์ดํ„ฐ ํƒ€์ž…ํ•„์ˆ˜
descstringํ•„๋“œ ์„ค๋ช…-
nullablebooleanNULL ํ—ˆ์šฉ ์—ฌ๋ถ€false
toFilterboolean๊ฒ€์ƒ‰ ํ•„ํ„ฐ๋ง ๊ฐ€๋Šฅ ์—ฌ๋ถ€false
dbDefaultstring๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ณธ๊ฐ’-
generatedGeneratedColumn๊ณ„์‚ฐ ์ปฌ๋Ÿผ ์„ค์ •-

Generated Column

๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ปฌ๋Ÿผ์ž…๋‹ˆ๋‹ค.
{
  "name": "full_name",
  "type": "string",
  "generated": {
    "type": "STORED",
    "expression": "first_name || ' ' || last_name"
  }
}
์˜ต์…˜:
  • type: STORED | VIRTUAL
    • STORED: ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ €์žฅ๋จ (์ธ๋ฑ์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ)
    • VIRTUAL: ์กฐํšŒ ์‹œ์—๋งŒ ๊ณ„์‚ฐ๋จ (๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ)
  • expression: SQL ํ‘œํ˜„์‹
  • VIRTUAL ํƒ€์ž…์€ ๋ฐฐ์—ด ํƒ€์ž…, json, vector์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค - generated์™€ dbDefault๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

์ˆซ์ž ํƒ€์ž…

integer / integer[]

32๋น„ํŠธ ์ •์ˆ˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
{
  "name": "age",
  "type": "integer",
  "desc": "๋‚˜์ด"
}
๋งคํ•‘:
  • PostgreSQL: integer
  • TypeScript: number
  • JSON: number
๋ฒ”์œ„: -2,147,483,648 ~ 2,147,483,647
์‚ฌ์šฉ ์˜ˆ์‹œ: ID, ๊ฐœ์ˆ˜, ๋‚˜์ด, ์ˆœ์„œ, ๋…„๋„

bigInteger / bigInteger[]

64๋น„ํŠธ ์ •์ˆ˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
{
  "name": "transaction_id",
  "type": "bigInteger",
  "desc": "๊ฑฐ๋ž˜ ID"
}
๋งคํ•‘:
  • PostgreSQL: bigint
  • TypeScript: bigint
  • JSON: bigint (๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”)
๋ฒ”์œ„: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
JavaScript์˜ Number.MAX_SAFE_INTEGER (2^53 - 1)๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฐ’์€ bigint๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ์ •ํ™•๋„๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

number / number[]

๋ถ€๋™์†Œ์ˆ˜์  ๋˜๋Š” ๊ณ ์ •์†Œ์ˆ˜์  ์ˆซ์ž ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
{
  "name": "price",
  "type": "number",
  "precision": 10,
  "scale": 2,
  "desc": "๊ฐ€๊ฒฉ"
}
๋งคํ•‘:
  • PostgreSQL: numeric(10, 2) (๊ธฐ๋ณธ๊ฐ’)
  • TypeScript: number
  • JSON: number
์ถ”๊ฐ€ ์˜ต์…˜:
  • precision: ์ „์ฒด ์ž๋ฆฟ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: ์—†์Œ = ๋ฌด์ œํ•œ)
  • scale: ์†Œ์ˆ˜์  ์ž๋ฆฟ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 0)
  • numberType: numeric | real | double precision (๊ธฐ๋ณธ๊ฐ’: numeric)
numberType ์„ ํƒ ๊ฐ€์ด๋“œ:
ํƒ€์ž…์ •๋ฐ€๋„๋ฉ”๋ชจ๋ฆฌ์‚ฌ์šฉ ์˜ˆ์‹œ
numeric์ •ํ™•ํ•จ (๊ถŒ์žฅ)๋งŽ์Œ๊ธˆ์•ก, ํ†ตํ™”
real๊ทผ์‚ฌ๊ฐ’ (6์ž๋ฆฌ)4 bytes๊ณผํ•™์  ๋ฐ์ดํ„ฐ
double precision๊ทผ์‚ฌ๊ฐ’ (15์ž๋ฆฌ)8 bytes์ขŒํ‘œ, ์ธก์ •๊ฐ’
๊ธˆ์•ก ์ฒ˜๋ฆฌ: precision: 10, scale: 2๋กœ ์„ค์ •ํ•˜๋ฉด ์ตœ๋Œ€ 99,999,999.99๊นŒ์ง€ ์ €์žฅ ๊ฐ€๋Šฅ

numeric / numeric[]

๊ณ ์ •๋ฐ€๋„ ์ˆซ์ž ํƒ€์ž…์ž…๋‹ˆ๋‹ค. TypeScript์—์„œ ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
{
  "name": "precise_amount",
  "type": "numeric",
  "precision": 20,
  "scale": 10,
  "desc": "์ดˆ์ •๋ฐ€ ๊ธˆ์•ก"
}
๋งคํ•‘:
  • PostgreSQL: numeric(20, 10)
  • TypeScript: string โš ๏ธ
  • JSON: string
์ถ”๊ฐ€ ์˜ต์…˜:
  • precision: ์ „์ฒด ์ž๋ฆฟ์ˆ˜
  • scale: ์†Œ์ˆ˜์  ์ž๋ฆฟ์ˆ˜
number vs numeric ์ฐจ์ด์ :
  • number: TypeScript์—์„œ number ํƒ€์ž… (์ •๋ฐ€๋„ ์†์‹ค ๊ฐ€๋Šฅ)
  • numeric: TypeScript์—์„œ string ํƒ€์ž… (์ •๋ฐ€๋„ ์œ ์ง€)
ํฐ ์ˆซ์ž๋‚˜ ๋งค์šฐ ์ •ํ™•ํ•œ ์†Œ์ˆ˜์  ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ numeric์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ฌธ์ž์—ด ํƒ€์ž…

string / string[]

๊ฐ€๋ณ€ ๊ธธ์ด ๋ฌธ์ž์—ด ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
{
  "name": "email",
  "type": "string",
  "length": 255,
  "zodFormat": "email",
  "desc": "์ด๋ฉ”์ผ"
}
๋งคํ•‘:
  • PostgreSQL: varchar(255) (length ์ง€์ • ์‹œ) ๋˜๋Š” text
  • TypeScript: string
  • JSON: string
์ถ”๊ฐ€ ์˜ต์…˜:
  • length: ์ตœ๋Œ€ ๊ธธ์ด (์ƒ๋žต ์‹œ text ํƒ€์ž… ์‚ฌ์šฉ)
  • zodFormat: Zod 4 String Format validation (์•„๋ž˜ ์ฐธ์กฐ)

zodFormat ์˜ต์…˜

zodFormat ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด BaseSchema ์ƒ์„ฑ ์‹œ Zod์˜ string format validation์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ:
{
  "name": "user_email",
  "type": "string",
  "zodFormat": "email",
  "desc": "์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ"
}
์ง€์› ํฌ๋งท:
์นดํ…Œ๊ณ ๋ฆฌํฌ๋งท์„ค๋ช…
๊ธฐ๋ณธemail์ด๋ฉ”์ผ ์ฃผ์†Œ ํ˜•์‹
uuidUUID ํ˜•์‹
urlURL ํ˜•์‹
httpUrlHTTP/HTTPS URL ํ˜•์‹
hostnameํ˜ธ์ŠคํŠธ๋ช… ํ˜•์‹
emoji์ด๋ชจ์ง€ ํ˜•์‹
jwtJWT ํ† ํฐ ํ˜•์‹
์ธ์ฝ”๋”ฉbase64Base64 ์ธ์ฝ”๋”ฉ
base64urlURL-safe Base64 ์ธ์ฝ”๋”ฉ
hex16์ง„์ˆ˜ ๋ฌธ์ž์—ด
IDnanoidNanoID ํ˜•์‹
cuidCUID ํ˜•์‹
cuid2CUID2 ํ˜•์‹
ulidULID ํ˜•์‹
๋„คํŠธ์›Œํฌipv4IPv4 ์ฃผ์†Œ
ipv6IPv6 ์ฃผ์†Œ
macMAC ์ฃผ์†Œ
cidrv4IPv4 CIDR ํ‘œ๊ธฐ๋ฒ•
cidrv6IPv6 CIDR ํ‘œ๊ธฐ๋ฒ•
ํ•ด์‹œhashMd5MD5 ํ•ด์‹œ
hashSha1SHA-1 ํ•ด์‹œ
hashSha256SHA-256 ํ•ด์‹œ
hashSha384SHA-384 ํ•ด์‹œ
hashSha512SHA-512 ํ•ด์‹œ
ISOisoDateISO 8601 ๋‚ ์งœ (YYYY-MM-DD)
isoTimeISO 8601 ์‹œ๊ฐ„ (HH:MM:SS)
isoDatetimeISO 8601 ๋‚ ์งœ์‹œ๊ฐ„
isoDurationISO 8601 ๊ธฐ๊ฐ„
length ์„ค์ • ๊ฐ€์ด๋“œ: - ์งง์€ ํ…์ŠคํŠธ (์ด๋ฆ„, ์ด๋ฉ”์ผ): 255 - ๊ธด ํ…์ŠคํŠธ (์„ค๋ช…, ๋‚ด์šฉ): ์ƒ๋žต (text ํƒ€์ž…) - ๊ณ ์ • ๊ธธ์ด (์šฐํŽธ๋ฒˆํ˜ธ, ์ „ํ™”๋ฒˆํ˜ธ): ์ •ํ™•ํ•œ ๊ธธ์ด ์ง€์ •
zodFormat๊ณผ uuid ํƒ€์ž…์˜ ์ฐจ์ด: - type: "uuid": PostgreSQL์˜ uuid ์ปฌ๋Ÿผ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉฐ, UUID ์ „์šฉ ์ธ๋ฑ์Šค ๋ฐ ํ•จ์ˆ˜ ํ™œ์šฉ ๊ฐ€๋Šฅ - type: "string" + zodFormat: "uuid": PostgreSQL์˜ text/varchar ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ API ๋ ˆ๋ฒจ์—์„œ๋งŒ UUID ํ˜•์‹ ๊ฒ€์ฆ

enum / enum[]

์—ด๊ฑฐํ˜• ํƒ€์ž…์ž…๋‹ˆ๋‹ค. Entity์˜ enums์— ์ •์˜๋œ ๊ฐ’๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
{
  "name": "role",
  "type": "enum",
  "id": "UserRole",
  "desc": "์‚ฌ์šฉ์ž ์—ญํ• "
}
๋งคํ•‘:
  • PostgreSQL: text
  • TypeScript: "admin" | "normal" (Enum ํ‚ค์˜ Union)
  • JSON: string
์ถ”๊ฐ€ ์˜ต์…˜:
  • id: Enum ํƒ€์ž… ID (Entity์˜ enums์— ์ •์˜ ํ•„์š”)
  • length: ๋ฌธ์ž์—ด ์ตœ๋Œ€ ๊ธธ์ด (์„ ํƒ ์‚ฌํ•ญ)
Enum ์ •์˜ ์˜ˆ์‹œ:
{
  "props": [
    {
      "name": "role",
      "type": "enum",
      "id": "UserRole"
    }
  ],
  "enums": {
    "UserRole": {
      "admin": "๊ด€๋ฆฌ์ž",
      "normal": "์ผ๋ฐ˜ ์‚ฌ์šฉ์ž"
    }
  }
}
๋” ์•Œ์•„๋ณด๊ธฐ - Enums - Enum ์ƒ์„ธ ๊ฐ€์ด๋“œ

๋…ผ๋ฆฌ ํƒ€์ž…

boolean / boolean[]

์ฐธ/๊ฑฐ์ง“ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
{
  "name": "is_active",
  "type": "boolean",
  "dbDefault": "true",
  "desc": "ํ™œ์„ฑํ™” ์—ฌ๋ถ€"
}
๋งคํ•‘:
  • PostgreSQL: boolean
  • TypeScript: boolean
  • JSON: boolean
๊ธฐ๋ณธ๊ฐ’ ์„ค์ •: dbDefault: "true" ๋˜๋Š” dbDefault: "false"

๋‚ ์งœ/์‹œ๊ฐ„ ํƒ€์ž…

date / date[]

๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์ €์žฅํ•˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
{
  "name": "created_at",
  "type": "date",
  "dbDefault": "CURRENT_TIMESTAMP",
  "desc": "์ƒ์„ฑ์ผ์‹œ"
}
๋งคํ•‘:
  • PostgreSQL: timestamptz (ํƒ€์ž„์กด ํฌํ•จ)
  • TypeScript: Date
  • JSON: string (ISO 8601 ํ˜•์‹)
์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’: - CURRENT_TIMESTAMP: ํ˜„์žฌ ์‹œ๊ฐ - CURRENT_DATE: ํ˜„์žฌ ๋‚ ์งœ (์‹œ๊ฐ„ 00:00:00)

UUID ํƒ€์ž…

uuid / uuid[]

๋ฒ”์šฉ ๊ณ ์œ  ์‹๋ณ„์ž(UUID) ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
{
  "name": "session_id",
  "type": "uuid",
  "dbDefault": "gen_random_uuid()",
  "desc": "์„ธ์…˜ ID"
}
๋งคํ•‘:
  • PostgreSQL: uuid
  • TypeScript: string
  • JSON: string
UUID ์ƒ์„ฑ: PostgreSQL์˜ gen_random_uuid() ํ•จ์ˆ˜๋ฅผ dbDefault๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…

json

JSON ํ˜•์‹์˜ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
{
  "name": "metadata",
  "type": "json",
  "id": "ProductMetadata",
  "nullable": true,
  "desc": "์ƒํ’ˆ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ"
}
๋งคํ•‘:
  • PostgreSQL: json
  • TypeScript: ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… (ProductMetadata)
  • JSON: any
์ถ”๊ฐ€ ์˜ต์…˜:
  • id: TypeScript ํƒ€์ž… ID (.types.ts์—์„œ ์ •์˜)
ํƒ€์ž… ์ •์˜ ์˜ˆ์‹œ:
{
  "name": "metadata",
  "type": "json",
  "id": "ProductMetadata"
}
JSON ํƒ€์ž…์€ ์ธ๋ฑ์‹ฑ์ด ์–ด๋ ต๊ณ  ์„ฑ๋Šฅ์ด ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์ฃผ ๊ฒ€์ƒ‰๋˜๋Š” ํ•„๋“œ๋Š” ๋ณ„๋„ ์ปฌ๋Ÿผ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

virtual

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์ง€ ์•Š๋Š” ๊ฐ€์ƒ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
{
  "name": "full_name",
  "type": "virtual",
  "id": "string",
  "virtualType": "code",
  "desc": "์ „์ฒด ์ด๋ฆ„"
}
๋งคํ•‘:
  • PostgreSQL: ์ €์žฅ๋˜์ง€ ์•Š์Œ
  • TypeScript: ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… (๋˜๋Š” string, number ๋“ฑ)
  • JSON: ํฌํ•จ๋จ (๊ณ„์‚ฐ ํ›„)
์ถ”๊ฐ€ ์˜ต์…˜:
  • id: TypeScript ํƒ€์ž… ID
  • virtualType: code | query (๊ธฐ๋ณธ๊ฐ’: code)
    • code: TypeScript ์ฝ”๋“œ๋กœ ๊ณ„์‚ฐ
    • query: SQL appendSelect๋กœ ๊ณ„์‚ฐ
virtualType ๋น„๊ต:
Model์—์„œ TypeScript ์ฝ”๋“œ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
// {entity}.model.ts
enhanceRow(row: User): User {
  return {
    ...row,
    full_name: `${row.first_name} ${row.last_name}`
  };
}
์žฅ์ : ๋ณต์žกํ•œ ๋กœ์ง ๊ตฌํ˜„ ๊ฐ€๋Šฅ, ์™ธ๋ถ€ API ํ˜ธ์ถœ ๊ฐ€๋Šฅ ๋‹จ์ : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ๋ฒจ ํ•„ํ„ฐ๋ง/์ •๋ ฌ ๋ถˆ๊ฐ€
virtualType ์„ ํƒ ๊ฐ€์ด๋“œ: - ๋‹จ์ˆœ ๋ฌธ์ž์—ด ์กฐํ•ฉ, ์ˆ˜์‹ ๊ณ„์‚ฐ โ†’ query - ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์™ธ๋ถ€ API ํ˜ธ์ถœ โ†’ code

Vector ํƒ€์ž…

vector / vector[]

๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ์„ ์ €์žฅํ•˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค. pgvector ํ™•์žฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
{
  "name": "embedding",
  "type": "vector",
  "dimensions": 1536,
  "desc": "ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ"
}
๋งคํ•‘:
  • PostgreSQL: vector(1536) (pgvector ํ™•์žฅ)
  • TypeScript: number[]
  • JSON: number[]
์ถ”๊ฐ€ ์˜ต์…˜:
  • dimensions: ๋ฒกํ„ฐ ์ฐจ์› (ํ•„์ˆ˜, ์˜ˆ: 1536)
Vector ๊ฒ€์ƒ‰ ์˜ˆ์‹œ:
// ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋กœ ๊ฒ€์ƒ‰
async searchSimilar(queryEmbedding: number[]) {
  return this.puri()
    .whereRaw("embedding <=> ?", [JSON.stringify(queryEmbedding)])
    .orderByRaw("embedding <=> ?", [JSON.stringify(queryEmbedding)])
    .limit(10)
    .many();
}
Vector ์ธ๋ฑ์Šค:
{
  "indexes": [
    {
      "type": "hnsw",
      "name": "posts_embedding_idx",
      "columns": [
        {
          "name": "embedding",
          "vectorOps": "vector_cosine_ops"
        }
      ],
      "m": 16,
      "efConstruction": 64
    }
  ]
}
๋” ์•Œ์•„๋ณด๊ธฐ - Vector Search - Vector ๊ฒ€์ƒ‰ ์ƒ์„ธ ๊ฐ€์ด๋“œ - pgvector - PostgreSQL vector ํ™•์žฅ

tsvector

PostgreSQL ์ „๋ฌธ ๊ฒ€์ƒ‰(Full-Text Search)์„ ์œ„ํ•œ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
{
  "name": "search_vector",
  "type": "tsvector",
  "generated": {
    "type": "STORED",
    "expression": "to_tsvector('english', title || ' ' || content)"
  }
}
๋งคํ•‘:
  • PostgreSQL: tsvector
  • TypeScript: string
  • JSON: string
์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค:
{
  "indexes": [
    {
      "type": "index",
      "name": "posts_search_vector_idx",
      "columns": [{ "name": "search_vector" }],
      "using": "gin"
    }
  ]
}
์ „๋ฌธ ๊ฒ€์ƒ‰: ์ž์—ฐ์–ด ํ…์ŠคํŠธ์˜ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰์— ์ตœ์ ํ™”๋œ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ํ˜•ํƒœ์†Œ ๋ถ„์„, ์–ด๊ฐ„ ์ถ”์ถœ ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Relation ํƒ€์ž…

๋‹ค๋ฅธ Entity์™€์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
{
  "type": "relation",
  "name": "user",
  "with": "User",
  "relationType": "BelongsToOne",
  "desc": "์ž‘์„ฑ์ž"
}
Relation ํƒ€์ž…:
  • BelongsToOne: N:1 ๊ด€๊ณ„
  • OneToOne: 1:1 ๊ด€๊ณ„
  • HasMany: 1:N ๊ด€๊ณ„
  • ManyToMany: N:M ๊ด€๊ณ„
๋” ์•Œ์•„๋ณด๊ธฐ - Relations - Relation ์ƒ์„ธ ๊ฐ€์ด๋“œ

ํƒ€์ž… ์„ ํƒ ๊ฐ€์ด๋“œ

์ˆซ์ž ์ €์žฅ

๋ฐ์ดํ„ฐํƒ€์ž…์ด์œ 
ID, ๋‚˜์ด, ๊ฐœ์ˆ˜integer์ผ๋ฐ˜์ ์ธ ์ •์ˆ˜
ํฐ ID, ํƒ€์ž„์Šคํƒฌํ”„bigIntegerํฐ ๋ฒ”์œ„ ํ•„์š”
๊ธˆ์•ก, ๊ฐ€๊ฒฉnumber (precision, scale)์ •ํ™•ํ•œ ์†Œ์ˆ˜์ 
๊ณผํ•™์  ์ธก์ •๊ฐ’number (numberType: real)๊ทผ์‚ฌ๊ฐ’ ํ—ˆ์šฉ
์ดˆ์ •๋ฐ€ ๊ณ„์‚ฐnumeric์ •๋ฐ€๋„ ์†์‹ค ๋ฐฉ์ง€

๋ฌธ์ž์—ด ์ €์žฅ

๋ฐ์ดํ„ฐํƒ€์ž…์ด์œ 
์ด๋ฆ„, ์ด๋ฉ”์ผstring (length: 255)์ผ๋ฐ˜์ ์ธ ํ…์ŠคํŠธ
์„ค๋ช…, ๋ณธ๋ฌธstring (length ์ƒ๋žต)๊ธด ํ…์ŠคํŠธ
์ƒํƒœ, ์—ญํ• enum์ œํ•œ๋œ ๊ฐ’ ๋ชฉ๋ก
UUID, ํ† ํฐuuid๊ณ ์œ  ์‹๋ณ„์ž

๋‚ ์งœ/์‹œ๊ฐ„ ์ €์žฅ

๋ฐ์ดํ„ฐํƒ€์ž…์„ค์ •
์ƒ์„ฑ์ผ์‹œdatedbDefault: "CURRENT_TIMESTAMP"
์ˆ˜์ •์ผ์‹œdate์—…๋ฐ์ดํŠธ ํŠธ๋ฆฌ๊ฑฐ ํ•„์š”
๋‚ ์งœ๋งŒdate์‹œ๊ฐ„์€ 00:00:00

๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ

๋ฐ์ดํ„ฐํƒ€์ž…์ด์œ 
์„ค์ •, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐjson๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ
๊ณ„์‚ฐ ํ•„๋“œvirtual์ €์žฅ ๋ถˆํ•„์š”
ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉvectorAI ๊ฒ€์ƒ‰
์ „๋ฌธ ๊ฒ€์ƒ‰tsvectorํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰

๋‹ค์Œ ๋‹จ๊ณ„

Relations

Entity ๊ฐ„ ๊ด€๊ณ„ ์ •์˜ํ•˜๊ธฐ

Enums

Enum ํƒ€์ž… ์‚ฌ์šฉํ•˜๊ธฐ

Indexes

์ธ๋ฑ์Šค๋กœ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ํ–ฅ์ƒํ•˜๊ธฐ

Vector Search

Vector ๊ฒ€์ƒ‰ ์„ค์ •ํ•˜๊ธฐ