Repository navigation
Expand file tree
/
Copy pathdatabase-schema.sql
More file actions
196 lines (173 loc) · 5.98 KB
/
Copy pathdatabase-schema.sql
File metadata and controls
196 lines (173 loc) · 5.98 KB
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
-- Nlib API - PostgreSQL Database Schema
-- Execute this script to create all necessary tables for the Nlib API
-- Create main nx table with all metadata
CREATE TABLE IF NOT EXISTS nx (
tid VARCHAR(16) PRIMARY KEY,
name TEXT,
publisher TEXT,
developer TEXT,
release_date VARCHAR(10),
category TEXT,
languages TEXT,
nsu_id BIGINT,
number_of_players INTEGER,
rating_content TEXT,
rights_id VARCHAR(32),
region VARCHAR(10),
is_demo INTEGER DEFAULT 0,
console VARCHAR(10) DEFAULT 'nx',
type VARCHAR(20) DEFAULT 'base',
version INTEGER DEFAULT 0,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Create index on tid for faster lookups
CREATE INDEX IF NOT EXISTS idx_nx_tid ON nx(tid);
-- Create index on updated_at for recent queries
CREATE INDEX IF NOT EXISTS idx_nx_updated_at ON nx(updated_at DESC);
-- Create index on region for filtering
CREATE INDEX IF NOT EXISTS idx_nx_region ON nx(region);
-- Create description tables for each language
CREATE TABLE IF NOT EXISTS nx_en (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nx_ja (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nx_es (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nx_de (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nx_fr (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nx_nl (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nx_pt (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nx_it (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nx_zh (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nx_ko (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nx_ru (
tid VARCHAR(16) PRIMARY KEY,
intro TEXT,
description TEXT,
FOREIGN KEY (tid) REFERENCES nx(tid) ON DELETE CASCADE
);
-- Create ctr table for 3DS game data
-- Region: uppercase ISO / market codes (JP, US, EU, FR, DE, GB, FREE, …)
-- Category may be nested (e.g. extras/hb)
-- catalog_* / market: links from 3dsdb data/title_catalog.json (cross-region + related)
CREATE TABLE IF NOT EXISTS ctr (
tid VARCHAR(16) PRIMARY KEY,
uid VARCHAR(32),
name TEXT,
formal_name TEXT,
description TEXT,
release_date_on_eshop VARCHAR(10),
product_code VARCHAR(32),
platform_name TEXT,
region VARCHAR(50),
genres TEXT, -- JSON array stored as TEXT
features TEXT, -- JSON array stored as TEXT
languages TEXT, -- JSON array stored as TEXT
rating_system TEXT, -- JSON object stored as TEXT
version VARCHAR(20),
disclaimer TEXT,
descriptors TEXT, -- JSON array stored as TEXT
category VARCHAR(64) DEFAULT 'base',
publisher TEXT,
smdh TEXT, -- JSON object stored as TEXT
catalog_id VARCHAR(64), -- e.g. game/CTR:KPF
catalog_role VARCHAR(16), -- base | update | dlc | demo | extra
market VARCHAR(10), -- product-code letter market
region_conflict BOOLEAN DEFAULT FALSE,
source_hash VARCHAR(40), -- git blob SHA of meta.json (change detection)
source_path TEXT,
synced_at TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_ctr_tid ON ctr(tid);
CREATE INDEX IF NOT EXISTS idx_ctr_category ON ctr(category);
CREATE INDEX IF NOT EXISTS idx_ctr_updated_at ON ctr(updated_at DESC);
CREATE INDEX IF NOT EXISTS idx_ctr_region ON ctr(region);
CREATE INDEX IF NOT EXISTS idx_ctr_source_hash ON ctr(source_hash);
CREATE INDEX IF NOT EXISTS idx_ctr_synced_at ON ctr(synced_at DESC);
CREATE INDEX IF NOT EXISTS idx_ctr_publisher ON ctr(publisher);
CREATE INDEX IF NOT EXISTS idx_ctr_catalog_id ON ctr(catalog_id);
CREATE INDEX IF NOT EXISTS idx_ctr_catalog_role ON ctr(catalog_role);
CREATE INDEX IF NOT EXISTS idx_ctr_market ON ctr(market);
-- Title families from 3dsdb data/title_catalog.json
CREATE TABLE IF NOT EXISTS ctr_catalog (
id VARCHAR(64) PRIMARY KEY,
kind VARCHAR(32) NOT NULL,
platform VARCHAR(8) NOT NULL,
serial VARCHAR(16) NOT NULL,
name TEXT,
regions TEXT,
markets TEXT,
counts TEXT,
releases TEXT,
catalog_version INTEGER,
source_hash VARCHAR(40),
synced_at TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_ctr_catalog_kind ON ctr_catalog(kind);
CREATE INDEX IF NOT EXISTS idx_ctr_catalog_platform ON ctr_catalog(platform);
CREATE INDEX IF NOT EXISTS idx_ctr_catalog_serial ON ctr_catalog(serial);
CREATE INDEX IF NOT EXISTS idx_ctr_catalog_updated_at ON ctr_catalog(updated_at DESC);
-- Create sync_log table to track updates
CREATE TABLE IF NOT EXISTS sync_log (
id SERIAL PRIMARY KEY,
synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
games_count INTEGER,
status VARCHAR(50),
source VARCHAR(100)
);
-- Create index on sync_log for recent queries
CREATE INDEX IF NOT EXISTS idx_sync_log_synced_at ON sync_log(synced_at DESC);
-- Display table information
SELECT 'Tables created successfully!' AS status;
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name;