Skip to content

Commit 73f0c38

Browse files
Completed changes transactions portion as well as added indexing for transactions and sessions
1 parent 006e6cc commit 73f0c38

File tree

1 file changed

+108
-13
lines changed

1 file changed

+108
-13
lines changed

db/schema.sql

Lines changed: 108 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
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+
31126
CREATE INDEX idx_sessions_archive_time ON sessions_archive(archived_at DESC);

0 commit comments

Comments
 (0)