File size: 1,550 Bytes
aa9892b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-- 단말 ↔ μ‚¬μš©μž λ§€ν•‘ (μ–΄λ·°μ¦ˆ μ˜μ‹¬ κ²€μΆœ, 2026-05-06).
--
-- λ°°κ²½: device_daily_usage 의 last_user_id λŠ” λ§ˆμ§€λ§‰ 1개 κ³„μ •λ§Œ μ €μž₯ν•˜μ—¬
-- 동일 λ‹¨λ§μ˜ 닀쀑 계정 μ‚¬μš© 좔적이 μ•ˆ 됨. 별도 λ§€ν•‘ ν…Œμ΄λΈ”λ‘œ (단말,
-- μ‚¬μš©μž) unique 쑰합을 λˆ„μ  β†’ admin ν™”λ©΄μ—μ„œ "이 단말이 N개 κ³„μ •μœΌλ‘œ
-- 접속" 톡계 κ°€λŠ₯.
--
-- μ •μ±…:
--   - PK = (client_ip, device_fp, user_id) 3 컬럼 unique
--   - upsert μ‹œ last_seen_at κ°±μ‹ , total_credits_used λˆ„μ 
--   - admin λͺ¨λ‹ˆν„°λ§μš© β€” 일반 μ‚¬μš©μž 영ν–₯ μ—†μŒ

CREATE TABLE IF NOT EXISTS public.device_user_links (
    client_ip TEXT NOT NULL,
    device_fp TEXT NOT NULL,
    user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
    first_seen_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    last_seen_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    total_credits_used INTEGER NOT NULL DEFAULT 0,
    PRIMARY KEY (client_ip, device_fp, user_id)
);

-- 단말별 μ‚¬μš©μž 수 μ§‘κ³„μš©
CREATE INDEX IF NOT EXISTS idx_device_user_links_device
    ON public.device_user_links (client_ip, device_fp);

-- μ‚¬μš©μžλ³„ 단말 수 μ§‘κ³„μš© (μ—­λ°©ν–₯)
CREATE INDEX IF NOT EXISTS idx_device_user_links_user
    ON public.device_user_links (user_id);

-- 졜근 ν™œλ™ μ •λ ¬μš©
CREATE INDEX IF NOT EXISTS idx_device_user_links_seen
    ON public.device_user_links (last_seen_at DESC);

ALTER TABLE public.device_user_links ENABLE ROW LEVEL SECURITY;
-- μ •μ±… λ―Έμ„€μ • = μ„œλΉ„μŠ€ 둀만 톡과. μ‚¬μš©μž 직접 SELECT λΆˆκ°€.