11-- database schema for sqlc code generation for archival PostgreSQL
22
3- CREATE TABLE sessions_archive (
3+ CREATE TABLE IF NOT EXISTS sessions_archive (
44 id UUID PRIMARY KEY ,
55 username TEXT NOT NULL ,
66 ip TEXT ,
@@ -14,18 +14,113 @@ CREATE TABLE sessions_archive (
1414 archived_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
1515);
1616
17- CREATE TABLE transactions_archive (
18- id UUID PRIMARY KEY ,
19- session_id UUID REFERENCES sessions_archive(id) ON DELETE CASCADE ,
20- action TEXT NOT NULL ,
21- resource TEXT NOT NULL ,
22- permissions TEXT NOT NULL ,
23- status TEXT CHECK (status IN (' success' , ' failure' , ' pending' )) NOT NULL ,
24- error TEXT ,
25- output TEXT ,
26- created_at TIMESTAMP NOT NULL
17+ CREATE TABLE IF NOT EXISTS transactions_archive (
18+ id UUID PRIMARY KEY ,
19+ session_id UUID NOT NULL ,
20+ timestamp TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
21+ operation VARCHAR (20 ) NOT NULL CHECK (operation IN (' getfacl' , ' setfacl' )),
22+ target_path TEXT NOT NULL ,
23+ entries JSONB NOT NULL DEFAULT ' []' ::jsonb,
24+ status VARCHAR (20 ) NOT NULL CHECK (status IN (' pending' , ' success' , ' failed' )),
25+ error_msg TEXT ,
26+ output TEXT ,
27+ executed_by VARCHAR (255 ) NOT NULL ,
28+ duration_ms BIGINT ,
29+ created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
2730);
2831
29- -- indexes
30- CREATE INDEX idx_transactions_session_id ON transactions_archive(session_id);
32+ -- * Indexing for Sessions * --
33+
34+ -- Primary lookup indexes
35+ CREATE INDEX IF NOT EXISTS idx_sessions_username ON sessions_archive(username);
36+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions_archive(status);
37+ CREATE INDEX IF NOT EXISTS idx_sessions_ip ON sessions_archive(ip);
38+
39+ -- Time-based indexes for chronological queries
40+ CREATE INDEX IF NOT EXISTS idx_sessions_created_at ON sessions_archive(created_at);
41+ CREATE INDEX IF NOT EXISTS idx_sessions_last_active_at ON sessions_archive(last_active_at);
42+ CREATE INDEX IF NOT EXISTS idx_sessions_expiry ON sessions_archive(expiry);
43+ CREATE INDEX IF NOT EXISTS idx_sessions_archived_at ON sessions_archive(archived_at);
44+
45+ -- Composite indexes for common query patterns
46+ CREATE INDEX IF NOT EXISTS idx_sessions_username_status ON sessions_archive(username, status);
47+ CREATE INDEX IF NOT EXISTS idx_sessions_username_created_at ON sessions_archive(username, created_at DESC );
48+ CREATE INDEX IF NOT EXISTS idx_sessions_username_last_active ON sessions_archive(username, last_active_at DESC );
49+ CREATE INDEX IF NOT EXISTS idx_sessions_status_created_at ON sessions_archive(status, created_at DESC );
50+ CREATE INDEX IF NOT EXISTS idx_sessions_status_archived_at ON sessions_archive(status, archived_at DESC );
51+
52+ -- Performance indexes for analytics and monitoring
53+ CREATE INDEX IF NOT EXISTS idx_sessions_completed_count ON sessions_archive(completed_count) WHERE completed_count > 0 ;
54+ CREATE INDEX IF NOT EXISTS idx_sessions_failed_count ON sessions_archive(failed_count) WHERE failed_count > 0 ;
55+ CREATE INDEX IF NOT EXISTS idx_sessions_user_agent ON sessions_archive(user_agent) WHERE user_agent IS NOT NULL ;
56+
57+ -- Specialized composite indexes for complex queries
58+ CREATE INDEX IF NOT EXISTS idx_sessions_username_ip ON sessions_archive(username, ip);
59+ CREATE INDEX IF NOT EXISTS idx_sessions_ip_created_at ON sessions_archive(ip, created_at DESC );
60+ CREATE INDEX IF NOT EXISTS idx_sessions_expiry_status ON sessions_archive(expiry, status);
61+
62+ -- Partial indexes for active sessions monitoring
63+ CREATE INDEX IF NOT EXISTS idx_sessions_active_last_active ON sessions_archive(last_active_at DESC )
64+ WHERE status = ' active' ;
65+ CREATE INDEX IF NOT EXISTS idx_sessions_expired_recent ON sessions_archive(expiry DESC )
66+ WHERE status = ' expired' ;
67+
68+ -- Performance indexes for user activity analysis
69+ CREATE INDEX IF NOT EXISTS idx_sessions_high_activity ON sessions_archive(username, completed_count DESC )
70+ WHERE completed_count > 10 ;
71+ CREATE INDEX IF NOT EXISTS idx_sessions_problematic ON sessions_archive(username, failed_count DESC )
72+ WHERE failed_count > 5 ;
73+
74+ -- Indexes for cleanup and maintenance operations
75+ CREATE INDEX IF NOT EXISTS idx_sessions_old_archived ON sessions_archive(archived_at)
76+ WHERE archived_at < NOW() - INTERVAL ' 90 days' ;
77+ CREATE INDEX IF NOT EXISTS idx_sessions_old_expired ON sessions_archive(expiry)
78+ WHERE status = ' expired' AND expiry < NOW() - INTERVAL ' 30 days' ;
79+
80+ -- Security and audit indexes
81+ CREATE INDEX IF NOT EXISTS idx_sessions_ip_count ON sessions_archive(ip, username, created_at)
82+ WHERE ip IS NOT NULL ;
83+ CREATE INDEX IF NOT EXISTS idx_sessions_concurrent_users ON sessions_archive(username, created_at, expiry)
84+ WHERE status = ' active' ;
85+
86+ -- * Indexing for Transactions * --
87+
88+ -- Primary lookup indexes
89+ CREATE INDEX IF NOT EXISTS idx_transactions_session_id ON transactions_archive(session_id);
90+ CREATE INDEX IF NOT EXISTS idx_transactions_status ON transactions_archive(status);
91+ CREATE INDEX IF NOT EXISTS idx_transactions_operation ON transactions_archive(operation);
92+
93+ -- Time-based indexes for chronological queries
94+ CREATE INDEX IF NOT EXISTS idx_transactions_timestamp ON transactions_archive(timestamp );
95+ CREATE INDEX IF NOT EXISTS idx_transactions_created_at ON transactions_archive(created_at);
96+
97+ -- Composite indexes for common query patterns
98+ CREATE INDEX IF NOT EXISTS idx_transactions_session_status ON transactions_archive(session_id, status);
99+ CREATE INDEX IF NOT EXISTS idx_transactions_session_operation ON transactions_archive(session_id, operation);
100+ CREATE INDEX IF NOT EXISTS idx_transactions_session_timestamp ON transactions_archive(session_id, timestamp DESC );
101+ CREATE INDEX IF NOT EXISTS idx_transactions_session_created_at ON transactions_archive(session_id, created_at DESC );
102+
103+ -- Performance indexes for filtering and analytics
104+ CREATE INDEX IF NOT EXISTS idx_transactions_target_path ON transactions_archive(target_path);
105+ CREATE INDEX IF NOT EXISTS idx_transactions_executed_by ON transactions_archive(executed_by);
106+ CREATE INDEX IF NOT EXISTS idx_transactions_duration ON transactions_archive(duration_ms) WHERE duration_ms IS NOT NULL ;
107+
108+ -- Specialized composite indexes for complex queries
109+ CREATE INDEX IF NOT EXISTS idx_transactions_session_path ON transactions_archive(session_id, target_path);
110+ CREATE INDEX IF NOT EXISTS idx_transactions_status_timestamp ON transactions_archive(status, timestamp DESC );
111+ CREATE INDEX IF NOT EXISTS idx_transactions_operation_timestamp ON transactions_archive(operation, timestamp DESC );
112+
113+ -- JSONB indexes for ACL entries queries (if you need to query within entries)
114+ CREATE INDEX IF NOT EXISTS idx_transactions_entries_gin ON transactions_archive USING GIN (entries);
115+
116+ -- Partial indexes for active/recent data (performance optimization)
117+ CREATE INDEX IF NOT EXISTS idx_transactions_recent_pending ON transactions_archive(session_id, timestamp DESC )
118+ WHERE status = ' pending' ;
119+ CREATE INDEX IF NOT EXISTS idx_transactions_recent_failed ON transactions_archive(session_id, timestamp DESC )
120+ WHERE status = ' failed' ;
121+
122+ -- Index for cleanup operations (if you periodically clean old records)
123+ CREATE INDEX IF NOT EXISTS idx_transactions_cleanup ON transactions_archive(created_at)
124+ WHERE created_at < NOW() - INTERVAL ' 30 days' ;
125+
31126CREATE INDEX idx_sessions_archive_time ON sessions_archive(archived_at DESC );
0 commit comments