Data Schema & Neon
Questi contenuti non sono ancora disponibili nella tua lingua.
ποΈ Data Schema & Neon
Section titled βποΈ Data Schema & NeonβLiving Document - Questo schema riflette la struttura del database PostgreSQL su Neon.tech.
π― Overview
Section titled βπ― OverviewβDatabase Provider: Neon.tech (Serverless PostgreSQL)
PostgreSQL Version: 17
Cluster Name: blacktrails
Project ID: patient-queen-89181819
Region: AWS EU-Central-1
Architecture Philosophy
Section titled βArchitecture PhilosophyβBlackTrails uses a single-cluster, multi-schema architecture:
- β
One Cluster:
blacktrails(cost-effective, unified management) - β
Two Branches:
main(production),dev(development) - β Eight Schemas: Logical domain separation (auth, in1, elements, finance, library, ai, system, organization)
- β pgvector Enabled: For semantic search and RAG (Retrieval-Augmented Generation)
πΏ Branch Strategy
Section titled βπΏ Branch StrategyβMain Branch (Production)
Section titled βMain Branch (Production)βBranch: mainEndpoint: ep-fancy-dust-ag0l0r9nPurpose: Production environmentDatabase: blacktrailsConnection String:
DATABASE_URL=postgresql://[user]:[password]@ep-fancy-dust-ag0l0r9n-pooler.c-2.eu-central-1.aws.neon.tech/blacktrails?sslmode=requireDev Branch (Development)
Section titled βDev Branch (Development)βBranch: devEndpoint: ep-weathered-scene-ag4iuf4pPurpose: Testing & developmentDatabase: blacktrailsConnection String:
DATABASE_URL_DEV=postgresql://[user]:[password]@ep-weathered-scene-ag4iuf4p-pooler.c-2.eu-central-1.aws.neon.tech/blacktrails?sslmode=requireποΈ Schema Architecture
Section titled βποΈ Schema Architectureβblacktrails (database)βββ π auth # Users, Sessions, Roles, Tokensβββ π² in1 # Rhama Generation (IN-1) + Emotional Alchemy Detectionβββ π elements # Booking System (Property Management)βββ π° finance # Transactions, Invoices, Stripeβββ π library # Knowledge Base (Docs + Embeddings for RAG)βββ π€ ai # AI Chats, Messages, Errors (Future)βββ π§ system # Audit Logs, Migrations, Healthβββ π’ organization # Multi-tenant (Future)π Entity-Relationship Diagram (Textual)
Section titled βπ Entity-Relationship Diagram (Textual)βββββββββββββββββ auth.users βββββββββββββββββββ β β β β β βββββββββββ΄βββββββββββββββββββ β βββββββββ΄βββββββ ββββββββββββ΄βββββββββ auth.roles β β auth.sessions ββββββββββββββββ ββββββββββββββββββββ
β ββββββββββββββββββββββββββββββ β ββββββββββββββββ βββββββββββββββββββββ in1.rhamas β β elements.bookingsββ (alchemy) β β ββββββββββββββββ ββββββββββββββββββββ β ββββββββββββββββββββ β elements.rooms β ββββββββββββββββββββ β ββββββββββββββββββββ β finance.trans... β ββββββββββββββββββββ
βββββββββββββββββββ βββββββββββββββββββββββββ library.docs ββββββββ library.embeddings ββββββββββββββββββββ ββββββββββββββββββββββββ β pgvector (RAG)π SCHEMA: auth
Section titled βπ SCHEMA: authβPurpose: Authentication, authorization, user management
auth.users
Section titled βauth.usersβCREATE TABLE users ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), email VARCHAR(255) UNIQUE NOT NULL, fantasy_name VARCHAR(100), -- IN-1 display name full_name VARCHAR(255), -- Real name (optional) avatar_url TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, last_login TIMESTAMP);Indexes:
idx_users_emailonemail(login lookup)
auth.roles
Section titled βauth.rolesβCREATE TABLE roles ( id SERIAL PRIMARY KEY, user_id UUID REFERENCES users(id) ON DELETE CASCADE, product_code VARCHAR(20) NOT NULL, -- 'in1', 'elements', 'gcore' role_name VARCHAR(20) NOT NULL, -- 'admin', 'manager', 'user' created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(user_id, product_code));Indexes:
idx_roles_useronuser_ididx_roles_productonproduct_code
auth.auth_tokens
Section titled βauth.auth_tokensβCREATE TABLE auth_tokens ( token VARCHAR(255) PRIMARY KEY, user_id UUID REFERENCES users(id) ON DELETE CASCADE, expires_at TIMESTAMP NOT NULL, used BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);Indexes:
idx_tokens_useronuser_id
π² SCHEMA: in1
Section titled βπ² SCHEMA: in1βPurpose: IN-1 Rhama generation (conversational AI poetry with emotional alchemy)
in1.rhamas β CURRENT (Production Active)
Section titled βin1.rhamas β CURRENT (Production Active)βCREATE TABLE rhamas ( id SERIAL PRIMARY KEY, user_id UUID REFERENCES users(id) ON DELETE SET NULL, session_id VARCHAR(255), prompt_text TEXT NOT NULL, -- User conversation (full context) rhama_text TEXT NOT NULL, -- Generated Rhama (3-4 lines poetry) emotion VARCHAR(50), -- Alchemy detection: "[ALCHEMY: Emotion | State]" -- Examples: "Tristezza | Piombo", "Gioia | Oro" tree_planted BOOLEAN DEFAULT FALSE, tree_id VARCHAR(100), -- Tree planting service ID (future) language VARCHAR(5) DEFAULT 'it', -- 'it' or 'en' created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);Indexes:
idx_rhamas_useronuser_id(user history)idx_rhamas_sessiononsession_id(anonymous tracking)idx_rhamas_emotiononemotion(alchemy analytics)idx_rhamas_languageonlanguage(i18n queries)idx_rhamas_createdoncreated_at(time-series analysis)
Special Features:
- Alchemy Detection: The
emotionfield stores the full alchemy tag[ALCHEMY: Emozione | Stato]where:- Piombo (Lead): Pain, blockage, darkness, blind emotions
- Transition: Movement, crossing, active change
- Oro (Gold): Peace, gratitude, acceptance, awareness
- Soul Card Integration: Used by
/in1/soul-cardendpoint to calculate collective emotional state color mixing - Baseline State Preservation: Captures emotional state from FIRST turn, not final turn of conversation
in1.haikus (Legacy - Read Only)
Section titled βin1.haikus (Legacy - Read Only)β-- DEPRECATED: Old table name, kept for data migration-- No longer used by application (2025-12-21+)-- Scheduled for archival: Q1 2026π SCHEMA: elements
Section titled βπ SCHEMA: elementsβPurpose: Room booking system (hotels, B&Bs)
elements.bookings
Section titled βelements.bookingsβCREATE TABLE bookings ( id SERIAL PRIMARY KEY, user_id UUID REFERENCES users(id) ON DELETE SET NULL, guest_name VARCHAR(255), guest_email VARCHAR(255), room_id VARCHAR(50) NOT NULL, check_in DATE NOT NULL, check_out DATE NOT NULL, guests_count INTEGER DEFAULT 1, total_price DECIMAL(10, 2), status VARCHAR(20) DEFAULT 'confirmed', -- pending, confirmed, cancelled source VARCHAR(20) DEFAULT 'direct', -- direct, booking, airbnb notes TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);Indexes:
idx_bookings_useronuser_ididx_bookings_dateson(check_in, check_out)idx_bookings_statusonstatus
elements.rooms
Section titled βelements.roomsβCREATE TABLE rooms ( id VARCHAR(50) PRIMARY KEY, name VARCHAR(100) NOT NULL, description TEXT, max_guests INTEGER DEFAULT 2, price_per_night DECIMAL(10, 2), active BOOLEAN DEFAULT TRUE);π° SCHEMA: finance
Section titled βπ° SCHEMA: financeβPurpose: Financial transactions, invoices, Stripe webhooks
finance.transactions
Section titled βfinance.transactionsβCREATE TABLE transactions ( id SERIAL PRIMARY KEY, user_id UUID REFERENCES users(id), booking_id INTEGER REFERENCES bookings(id), amount DECIMAL(10, 2) NOT NULL, currency VARCHAR(3) DEFAULT 'EUR', type VARCHAR(50) NOT NULL, -- payment, refund, payout status VARCHAR(50) DEFAULT 'pending', -- pending, completed, failed payment_method VARCHAR(50), -- card, bank_transfer, cash stripe_payment_intent_id VARCHAR(255), metadata JSONB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);Indexes:
idx_transactions_useronuser_ididx_transactions_bookingonbooking_ididx_transactions_statusonstatus
π SCHEMA: library (RAG System)
Section titled βπ SCHEMA: library (RAG System)βPurpose: Knowledge base, document embeddings, semantic search
Extensions Required
Section titled βExtensions RequiredβCREATE EXTENSION IF NOT EXISTS vector; -- pgvectorlibrary.documents
Section titled βlibrary.documentsβCREATE TABLE documents ( id SERIAL PRIMARY KEY, slug VARCHAR(255) UNIQUE NOT NULL, title VARCHAR(500) NOT NULL, category VARCHAR(100), -- filosofia, progetti, algoritmi, legal content TEXT NOT NULL, content_hash VARCHAR(64) NOT NULL, -- MD5 hash for change detection public BOOLEAN DEFAULT FALSE, author VARCHAR(255), tags TEXT[], metadata JSONB, -- Frontmatter fields last_updated TIMESTAMP DEFAULT NOW(), created_at TIMESTAMP DEFAULT NOW());Indexes:
idx_documents_slugonslugidx_documents_categoryoncategoryidx_documents_publiconpublicidx_documents_hashoncontent_hash
library.embeddings
Section titled βlibrary.embeddingsβCREATE TABLE embeddings ( id SERIAL PRIMARY KEY, document_id INTEGER REFERENCES documents(id) ON DELETE CASCADE, chunk_index INTEGER NOT NULL, -- Position in document chunk_text TEXT NOT NULL, embedding vector(1536), -- OpenAI text-embedding-ada-002 created_at TIMESTAMP DEFAULT NOW());
-- Vector similarity index (IVFFlat for cosine similarity)CREATE INDEX idx_embeddings_vector ON embeddings USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);Indexes:
idx_embeddings_documentondocument_ididx_embeddings_vectoronembedding(vector similarity)
π€ RAG Query Pattern
Section titled βπ€ RAG Query PatternβHow It Works
Section titled βHow It Worksβ-
Document Ingestion:
- Markdown files in
library/public/are synced tolibrary.documentsviascripts/sync-library.js - Content is chunked (500-1000 tokens per chunk)
- Each chunk is embedded using OpenAIβs
text-embedding-ada-002model - Embeddings are stored in
library.embeddings
- Markdown files in
-
Semantic Search:
- User query is embedded using the same model
- Vector similarity search finds the top-K most relevant chunks
- Chunks are ranked by cosine similarity
-
Context Injection:
- Top chunks are injected into AI prompt context
- AI generates response grounded in documentation
Example RAG Query
Section titled βExample RAG Queryβ-- Find top 5 similar document chunksSELECT d.title, d.slug, e.chunk_text, 1 - (e.embedding <=> $1::vector) AS similarityFROM library.embeddings eJOIN library.documents d ON d.id = e.document_idWHERE d.public = trueORDER BY e.embedding <=> $1::vectorLIMIT 5;Parameters:
$1::vector= Query embedding (1536-dimensional vector)
Returns:
title: Document titleslug: Document URL slugchunk_text: Relevant text chunksimilarity: Cosine similarity score (0-1, higher = more similar)
π§ SCHEMA: system
Section titled βπ§ SCHEMA: systemβPurpose: Audit logs, migrations, health checks
system.audit_logs
Section titled βsystem.audit_logsβCREATE TABLE audit_logs ( id SERIAL PRIMARY KEY, user_id UUID REFERENCES users(id), action VARCHAR(100) NOT NULL, -- login, logout, create, update, delete resource_type VARCHAR(100), -- user, booking, haiku resource_id VARCHAR(255), ip_address INET, user_agent TEXT, metadata JSONB, created_at TIMESTAMP DEFAULT NOW());Indexes:
idx_audit_useronuser_ididx_audit_actiononactionidx_audit_resourceon(resource_type, resource_id)idx_audit_createdoncreated_at DESC
π Key Metrics Queries
Section titled βπ Key Metrics QueriesβTotal Rhamas Generated
Section titled βTotal Rhamas GeneratedβSELECT COUNT(*) FROM in1.haikus;Bookings by Status
Section titled βBookings by StatusβSELECT status, COUNT(*)FROM elements.bookingsGROUP BY status;Storage per Schema
Section titled βStorage per SchemaβSELECT schemaname, SUM(pg_total_relation_size(schemaname||'.'||tablename)) / 1024 / 1024 AS size_mbFROM pg_tablesWHERE schemaname IN ('auth', 'in1', 'elements', 'finance', 'library', 'system')GROUP BY schemanameORDER BY size_mb DESC;RAG Document Count
Section titled βRAG Document CountβSELECT public, COUNT(*) as countFROM library.documentsGROUP BY public;IN-1 Alchemy Distribution (Soul Card Data)
Section titled βIN-1 Alchemy Distribution (Soul Card Data)β-- Today's Emotional StatesSELECT CASE WHEN emotion LIKE '%(Piombo)%' THEN 'π Piombo' WHEN emotion LIKE '%(Transition)%' THEN 'π Transition' WHEN emotion LIKE '%(Oro)%' THEN 'π Oro' ELSE 'β Other' END as alchemy_state, COUNT(*) as count, ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) as percentageFROM in1.rhamasWHERE created_at >= CURRENT_DATE AND emotion IS NOT NULLGROUP BY alchemy_stateORDER BY count DESC;IN-1 Language Distribution
Section titled βIN-1 Language DistributionβSELECT language, COUNT(*) as total_rhamas, COUNT(DISTINCT session_id) as unique_sessionsFROM in1.rhamasGROUP BY languageORDER BY total_rhamas DESC;π€ Agent Update Instructions
Section titled βπ€ Agent Update InstructionsβAI Assistant: Quando lo schema del database cambia (nuove tabelle, colonne, indici), esegui:
# 1. Analizza il nuovo schemaread_file E:\BLACKTRAILS-PLATFORM\db\schema.sqlread_file E:\BLACKTRAILS-PLATFORM\docs\DATABASE.md
# 2. Aggiorna questo file mantenendo:# - Diagrammi ER testuali aggiornati# - Nuove tabelle con definizioni SQL# - Query RAG pattern se cambiano# - Key metrics queries aggiornate
# 3. NON includere password reali (usa ${DATABASE_URL})
# 4. Commit con messaggio:git commit -m "docs(truth): update data schema"Last Auto-Update: 2025-12-21
Next Review: On schema migration
Maintainer: BlackTrails AI Agent
Neon Dashboard: console.neon.tech/projects/patient-queen-89181819