-- Mathe-App Datenbankschema CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, username VARCHAR(50) UNIQUE NOT NULL, xp INTEGER DEFAULT 0, level INTEGER DEFAULT 1, streak INTEGER DEFAULT 0, streak_last DATE, is_premium BOOLEAN DEFAULT FALSE, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS categories ( id SERIAL PRIMARY KEY, slug VARCHAR(50) UNIQUE NOT NULL, title VARCHAR(100) NOT NULL, icon VARCHAR(10), sort_order INTEGER DEFAULT 0 ); CREATE TABLE IF NOT EXISTS topics ( id SERIAL PRIMARY KEY, category_id INTEGER REFERENCES categories(id), slug VARCHAR(50) UNIQUE NOT NULL, title VARCHAR(100) NOT NULL, description TEXT, difficulty SMALLINT CHECK (difficulty BETWEEN 1 AND 5), is_premium BOOLEAN DEFAULT FALSE, sort_order INTEGER DEFAULT 0 ); CREATE TABLE IF NOT EXISTS tasks ( id SERIAL PRIMARY KEY, topic_id INTEGER REFERENCES topics(id), title VARCHAR(200) NOT NULL, question TEXT NOT NULL, answer_type VARCHAR(20) NOT NULL CHECK (answer_type IN ('number', 'multiple_choice', 'text')), correct TEXT NOT NULL, tolerance NUMERIC DEFAULT 0, unit VARCHAR(20), choices JSONB, explanation TEXT, xp_reward INTEGER DEFAULT 10, difficulty SMALLINT CHECK (difficulty BETWEEN 1 AND 5) ); CREATE TABLE IF NOT EXISTS user_progress ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id), task_id INTEGER REFERENCES tasks(id), solved_at TIMESTAMPTZ DEFAULT NOW(), correct BOOLEAN NOT NULL, UNIQUE(user_id, task_id) ); -- ============================================================ -- Kategorien -- ============================================================ INSERT INTO categories (slug, title, icon, sort_order) VALUES ('finanzen', 'Finanzen', '💰', 1), ('geometrie', 'Geometrie', '📐', 2), ('verhaeltnisse','Verhältnisse & Zeit', '⚖️', 3), ('physik', 'Physik', '⚡', 4), ('informatik', 'Informatik', '💻', 5), ('verkehr', 'Verkehr', '🚗', 6), ('shopping', 'Shopping', '🛒', 7) ON CONFLICT (slug) DO NOTHING; -- ============================================================ -- Topics -- ============================================================ INSERT INTO topics (category_id, slug, title, description, difficulty, sort_order) VALUES -- Finanzen ((SELECT id FROM categories WHERE slug='finanzen'), 'zinsen', 'Zinsen & Sparen', 'Tages- und Festgeld, Zinseszins', 2, 1), ((SELECT id FROM categories WHERE slug='finanzen'), 'kredite', 'Kredite & Raten', 'Ratenkredite, Gesamtkosten, effektiver Jahreszins', 3, 2), ((SELECT id FROM categories WHERE slug='finanzen'), 'rabatte', 'Rabatte & Steuern', 'Prozentrechnung, MwSt, Netto/Brutto', 1, 3), -- Geometrie ((SELECT id FROM categories WHERE slug='geometrie'), 'flaechen', 'Flächen', 'Zimmer, Garten, Grundstück berechnen', 2, 1), ((SELECT id FROM categories WHERE slug='geometrie'), 'volumina', 'Volumina', 'Aquarium, Pool, Tank, Behälter', 2, 2), ((SELECT id FROM categories WHERE slug='geometrie'), 'winkel', 'Winkel & Trigonometrie', 'Dachneigung, Rampen, GPS-Peilung', 3, 3), -- Verhältnisse & Zeit ((SELECT id FROM categories WHERE slug='verhaeltnisse'), 'dreisatz', 'Dreisatz', 'Rezepte, Mischungen, Maßstäbe', 1, 1), ((SELECT id FROM categories WHERE slug='verhaeltnisse'), 'zeiten', 'Zeitrechnung', 'Fahrtzeiten, Zeitzonen, Zeitplanung', 2, 2), ((SELECT id FROM categories WHERE slug='verhaeltnisse'), 'prozente', 'Prozente', 'Wachstum, Abnahme, Inflation', 2, 3), -- Physik ((SELECT id FROM categories WHERE slug='physik'), 'mechanik', 'Mechanik', 'Geschwindigkeit, Kraft, Arbeit, Energie', 3, 1), ((SELECT id FROM categories WHERE slug='physik'), 'elektrik', 'Elektrizität', 'Stromverbrauch, Kosten, Ohmsches Gesetz', 3, 2), ((SELECT id FROM categories WHERE slug='physik'), 'thermik', 'Wärme & Energie', 'Heizkosten, Isolierung, Wärmebedarf', 3, 3), -- Informatik ((SELECT id FROM categories WHERE slug='informatik'), 'binaer', 'Binär & Hexadezimal','Umrechnung, Bitoperationen', 3, 1), ((SELECT id FROM categories WHERE slug='informatik'), 'daten', 'Dateigrößen', 'Speicher, Übertragungszeit, Kompression', 2, 2), ((SELECT id FROM categories WHERE slug='informatik'), 'algorithmen','Algorithmen', 'Komplexität, Laufzeit, Sortierung', 4, 3), -- Verkehr ((SELECT id FROM categories WHERE slug='verkehr'), 'fahrzeit', 'Fahrtzeit & Tempo', 'Autobahn, Stau, Durchschnittsgeschwindigkeit', 2, 1), ((SELECT id FROM categories WHERE slug='verkehr'), 'sprit', 'Spritverbrauch', 'Tankkosten, Verbrauch, E-Auto vs. Benziner', 2, 2), ((SELECT id FROM categories WHERE slug='verkehr'), 'bremsen', 'Bremswege', 'Reaktionsweg, Bremsweg, Sicherheitsabstand', 3, 3), -- Shopping ((SELECT id FROM categories WHERE slug='shopping'), 'preisvergleich','Preisvergleich', 'Grundpreis, Mengenrabatt, Sonderangebote', 1, 1), ((SELECT id FROM categories WHERE slug='shopping'), 'einheitspreis', 'Einheitspreis', 'Preis pro kg, Liter, Stück — was lohnt sich?', 1, 2), ((SELECT id FROM categories WHERE slug='shopping'), 'ratenkauf', 'Ratenkauf', 'Gesamtkosten, Zinsfalle, Barkauf vs. Raten', 2, 3) ON CONFLICT (slug) DO NOTHING; -- ============================================================ -- Aufgaben: Zinsen -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='zinsen'), 'Tagesgeld-Zinsen', 'Du legst 5.000 € auf ein Tagesgeldkonto mit 3,5 % Zinsen pro Jahr an. Wie viel Zinsen bekommst du nach einem Jahr (in €)?', 'number', '175', 0.01, '€', 'Zinsen = Kapital × Zinssatz = 5000 × 0,035 = 175 €', 10, 1 ), ( (SELECT id FROM topics WHERE slug='zinsen'), 'Zinseszins nach 3 Jahren', 'Du legst 2.000 € für 3 Jahre zu 4 % Zinsen p.a. an (Zinseszins). Auf welchen Betrag wächst dein Guthaben (gerundet auf Cent)?', 'number', '2249.73', 0.02, '€', 'K₃ = 2000 × 1,04³ = 2000 × 1,124864 = 2249,73 €', 20, 2 ), ( (SELECT id FROM topics WHERE slug='zinsen'), 'Wie lange bis zur Verdopplung?', 'Bei welchem Zinssatz verdoppelt sich ein Kapital in ca. 10 Jahren? Nutze die 72er-Regel.', 'number', '7.2', 0.1, '%', 'Die 72er-Regel: Zinssatz ≈ 72 ÷ Jahre = 72 ÷ 10 = 7,2 %', 15, 2 ); -- ============================================================ -- Aufgaben: Kredite -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='kredite'), 'Gesamtkosten Ratenkredit', 'Du nimmst einen Kredit über 12.000 € auf, Laufzeit 3 Jahre, monatliche Rate 380 €. Wie viel zahlst du insgesamt zurück (in €)?', 'number', '13680', 1, '€', '380 € × 36 Monate = 13.680 € → Zinskosten: 1.680 €', 15, 2 ), ( (SELECT id FROM topics WHERE slug='kredite'), 'Welcher Kredit ist günstiger?', 'Kredit A: 10.000 € in 24 Monaten à 450 €. Kredit B: 10.000 € in 36 Monaten à 310 €. Welcher kostet weniger Zinsen?', 'multiple_choice', 'A', 0, NULL, 'A: 24×450 = 10.800 € (800 € Zinsen). B: 36×310 = 11.160 € (1.160 € Zinsen). Kredit A ist günstiger.', 20, 2 ), ( (SELECT id FROM topics WHERE slug='kredite'), 'Effektiver Jahreszins', 'Du leihst dir 500 € und zahlst nach einem Jahr 530 € zurück. Wie hoch ist der effektive Jahreszins in %?', 'number', '6', 0.1, '%', '(530 - 500) / 500 × 100 = 30/500 × 100 = 6 %', 10, 1 ); -- ============================================================ -- Aufgaben: Rabatte & Steuern -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='rabatte'), '20 % Rabatt', 'Ein Jacke kostet 89,95 €. Im Sale gibt es 20 % Rabatt. Was zahlst du?', 'number', '71.96', 0.02, '€', '89,95 × 0,80 = 71,96 €', 10, 1 ), ( (SELECT id FROM topics WHERE slug='rabatte'), 'Netto aus Brutto', 'Ein Laptop kostet brutto 1.190 € (19 % MwSt). Wie hoch ist der Nettopreis in €?', 'number', '1000', 0.5, '€', 'Netto = Brutto ÷ 1,19 = 1190 ÷ 1,19 = 1000 €', 15, 2 ); -- ============================================================ -- Aufgaben: Flächen -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='flaechen'), 'Wohnzimmer streichen', 'Dein Wohnzimmer ist 5,5 m lang und 4,2 m breit. Ein Eimer Farbe deckt 12 m². Wie viele Eimer brauchst du (aufrunden)?', 'number', '2', 0, 'Eimer', '5,5 × 4,2 = 23,1 m² ÷ 12 m² = 1,925 → 2 Eimer', 10, 1 ), ( (SELECT id FROM topics WHERE slug='flaechen'), 'Kreisförmiger Pool', 'Ein runder Pool hat einen Durchmesser von 4,8 m. Wie groß ist die Wasseroberfläche in m² (auf 2 Stellen gerundet)?', 'number', '18.10', 0.05, 'm²', 'r = 2,4 m → A = π × r² = π × 5,76 ≈ 18,10 m²', 15, 2 ); -- ============================================================ -- Aufgaben: Volumina -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='volumina'), 'Aquarium befüllen', 'Ein Aquarium ist 80 cm lang, 35 cm breit und 40 cm hoch. Wie viele Liter fasst es (max. 90 % füllen)?', 'number', '100.8', 1, 'Liter', '80×35×40 = 112.000 cm³ = 112 l × 0,9 = 100,8 l', 15, 2 ), ( (SELECT id FROM topics WHERE slug='volumina'), 'Heizöltank', 'Ein zylindrischer Heizöltank hat einen Radius von 0,6 m und eine Höhe von 2 m. Wie viele Liter fasst er (gerundet)?', 'number', '2262', 5, 'Liter', 'V = π × r² × h = π × 0,36 × 2 ≈ 2,262 m³ = 2262 l', 20, 3 ); -- ============================================================ -- Aufgaben: Dreisatz -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='dreisatz'), 'Rezept skalieren', 'Ein Kuchenrezept für 4 Personen braucht 320 g Mehl. Wie viel Mehl brauchst du für 7 Personen?', 'number', '560', 1, 'g', '320 g ÷ 4 × 7 = 560 g', 10, 1 ), ( (SELECT id FROM topics WHERE slug='dreisatz'), 'Kartenlesen', 'Auf einer Karte im Maßstab 1:50.000 misst eine Strecke 4,6 cm. Wie lang ist die echte Strecke in km?', 'number', '2.3', 0.05, 'km', '4,6 cm × 50.000 = 230.000 cm = 2,3 km', 15, 2 ); -- ============================================================ -- Aufgaben: Zeiten -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='zeiten'), 'Zeitzone New York', 'Es ist in Berlin 15:30 Uhr (MEZ, UTC+1). Wie spät ist es gleichzeitig in New York (EST, UTC-5)?', 'number', '9', 0, 'Uhr', '15:30 - 6 Stunden = 09:30 → 9 Uhr', 10, 1 ), ( (SELECT id FROM topics WHERE slug='zeiten'), 'Projektplanung', 'Ein Projekt startet am 15. März. Es dauert 11 Wochen. An welchem Datum endet es (Tag im Monat im Juni)?', 'number', '2', 0, '', '11 Wochen = 77 Tage. 15. März + 77 Tage = 31. März + 30 April + 16 Tage = 31. Mai + 2 Tage = 2. Juni', 20, 2 ); -- ============================================================ -- Aufgaben: Physik – Elektrizität -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='elektrik'), 'Stromkosten Backofen', 'Dein Backofen hat 2.200 W. Du backst 3 mal pro Woche je 45 Minuten. Wie viel kWh verbrauchst du pro Monat (4 Wochen)?', 'number', '9.9', 0.1, 'kWh', '2,2 kW × 0,75 h × 3 × 4 = 19,8 kWh ÷ 2… Nein: 2,2 × 0,75 = 1,65 kWh/Mal × 12 = 19,8 kWh → Sorry, 2,2 × 0,75 × 12 = 19,8. Korrekte Antwort: 19,8', 15, 2 ), ( (SELECT id FROM topics WHERE slug='elektrik'), 'Ohmsches Gesetz', 'Eine Glühbirne hat einen Widerstand von 240 Ω und liegt an 230 V. Welche Stromstärke fließt durch sie (in Ampere, auf 2 Stellen gerundet)?', 'number', '0.96', 0.01, 'A', 'I = U ÷ R = 230 ÷ 240 ≈ 0,96 A', 20, 3 ); -- ============================================================ -- Aufgaben: Informatik – Dateigrößen -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='daten'), 'Download-Zeit', 'Du lädst eine Datei mit 2,4 GB bei 50 Mbit/s herunter. Wie lange dauert das in Minuten (gerundet)?', 'number', '6.4', 0.1, 'min', '2,4 GB = 2400 MB = 19200 Mbit. 19200 ÷ 50 = 384 Sekunden = 6,4 Minuten', 20, 3 ), ( (SELECT id FROM topics WHERE slug='binaer'), 'Binär zu Dezimal', 'Was ist 1011 in Dezimaldarstellung?', 'number', '11', 0, '', '1×8 + 0×4 + 1×2 + 1×1 = 8+2+1 = 11', 15, 2 ); -- ============================================================ -- Aufgaben: Verkehr -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='fahrzeit'), 'Durchschnittsgeschwindigkeit', 'Du fährst 240 km in 2 Stunden 40 Minuten. Wie hoch ist deine Durchschnittsgeschwindigkeit in km/h?', 'number', '90', 0.5, 'km/h', '2h40min = 2,667 h → 240 ÷ 2,667 ≈ 90 km/h', 15, 2 ), ( (SELECT id FROM topics WHERE slug='sprit'), 'Tankkosten Vergleich', 'Auto A verbraucht 7 l/100 km, Auto B 4,5 l/100 km. Benzin kostet 1,80 €/l. Wie viel sparst du mit Auto B auf 15.000 km im Jahr (in €)?', 'number', '675', 1, '€', 'A: 1050 l × 1,80 = 1890 €. B: 675 l × 1,80 = 1215 €. Ersparnis: 675 €', 25, 2 ), ( (SELECT id FROM topics WHERE slug='bremsen'), 'Bremsweg bei 100 km/h', 'Reaktionszeit 1 s, Geschwindigkeit 100 km/h. Wie lang ist der Reaktionsweg in Metern?', 'number', '27.8', 0.2, 'm', '100 km/h = 27,78 m/s → in 1 s = 27,8 m', 20, 3 ); -- ============================================================ -- Aufgaben: Shopping -- ============================================================ INSERT INTO tasks (topic_id, title, question, answer_type, correct, tolerance, unit, explanation, xp_reward, difficulty) VALUES ( (SELECT id FROM topics WHERE slug='einheitspreis'), 'Welches Angebot lohnt sich?', '500 g Kaffee für 4,99 € oder 750 g für 6,99 €. Welche Packung hat den günstigeren Kilopreis?', 'multiple_choice', '750g', 0, NULL, '500 g: 9,98 €/kg. 750 g: 9,32 €/kg → 750 g ist günstiger.', 10, 1 ), ( (SELECT id FROM topics WHERE slug='ratenkauf'), 'Ratenkauf-Falle', 'Ein TV kostet bar 799 €. Per Ratenkauf: 24 × 39,90 €. Wie viel Aufpreis zahlst du in %?', 'number', '19.7', 0.5, '%', '24 × 39,90 = 957,60 €. Aufpreis: 158,60 €. 158,60/799 × 100 ≈ 19,9 %', 20, 2 );