mirror of
https://github.com/harivansh-afk/url-shortner.git
synced 2026-04-16 00:03:05 +00:00
init db and docker
This commit is contained in:
commit
1a980a7a70
5 changed files with 178 additions and 0 deletions
43
db/init.sql
Normal file
43
db/init.sql
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
-- URL Shortener Database Schema
|
||||
|
||||
CREATE TABLE IF NOT EXISTS urls (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
short_code VARCHAR(10) UNIQUE NOT NULL,
|
||||
original_url TEXT NOT NULL,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
expires_at TIMESTAMP WITH TIME ZONE,
|
||||
click_count BIGINT DEFAULT 0,
|
||||
|
||||
-- Metadata
|
||||
user_agent TEXT,
|
||||
ip_address INET
|
||||
);
|
||||
|
||||
-- Index for fast lookups by short_code (most common query)
|
||||
CREATE INDEX idx_urls_short_code ON urls(short_code);
|
||||
|
||||
-- Index for cleanup of expired URLs
|
||||
CREATE INDEX idx_urls_expires_at ON urls(expires_at) WHERE expires_at IS NOT NULL;
|
||||
|
||||
-- Analytics table (for click tracking)
|
||||
CREATE TABLE IF NOT EXISTS clicks (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
short_code VARCHAR(10) NOT NULL,
|
||||
clicked_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
ip_address INET,
|
||||
user_agent TEXT,
|
||||
referer TEXT,
|
||||
country_code VARCHAR(2)
|
||||
);
|
||||
|
||||
-- Partition-friendly index (clicks will be high volume)
|
||||
CREATE INDEX idx_clicks_short_code ON clicks(short_code);
|
||||
CREATE INDEX idx_clicks_clicked_at ON clicks(clicked_at);
|
||||
|
||||
-- Function to increment click count (atomic)
|
||||
CREATE OR REPLACE FUNCTION increment_click_count(code VARCHAR(10))
|
||||
RETURNS VOID AS $$
|
||||
BEGIN
|
||||
UPDATE urls SET click_count = click_count + 1 WHERE short_code = code;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
Loading…
Add table
Add a link
Reference in a new issue