| doc_id | DBS-ARCH-003 |
|---|---|
| doc_title | Database System Architecture |
| doc_version | 1.0.0 |
| doc_date | 2026-04-04 |
| doc_status | Released |
| project | database_system |
| category | ARCH |
Deferred to: The canonical SSOT for Database System Architecture is
docs/ARCHITECTURE.md. This advanced document covers implementation-detail aspects (multi-backend internals, connection pooling strategy, query builder patterns). Where facts conflict,docs/ARCHITECTURE.mdwins.
Version: 0.1.0.0 Last Updated: 2025-10-22 Language: English See also: docs/ARCHITECTURE.md (canonical SSOT)
- Overview
- Multi-Backend Architecture
- ORM Framework Design
- Connection Pooling Strategy
- Query Builder Patterns
- Transaction Management
- Integration with Ecosystem
- Performance Characteristics
- Security Architecture
- Async Operations
- Monitoring and Observability
Database System is a C++20 multi-backend database abstraction layer providing unified access to relational (PostgreSQL, MySQL, SQLite) and NoSQL (MongoDB, Redis) databases. The architecture emphasizes modularity, type safety, and performance while maintaining compatibility across different database backends.
- Multi-Backend Abstraction: Single unified interface for all database types
- Type Safety: C++20 concepts and template metaprogramming for compile-time validation
- Performance: Enterprise-grade connection pooling (10,000+ concurrent connections)
- Integration: Seamless integration with common_system (including ILogger and LOG_* macros) and thread_system
- Modularity: Pluggable backends with consistent API surface
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Application Layer β
β (User Code, Business Logic) β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ
β ORM Framework Layer β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Entity Mapping, Schema Management β β
β β C++20 Concepts, Metadata Generation β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ
β Security & Monitoring Layer β
β ββββββββββββββββββ βββββββββββββββββββββββββ β
β β Access Control β β Performance Monitor β β
β β Audit Logging β β Prometheus Export β β
β ββββββββββββββββββ βββββββββββββββββββββββββ β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ
β Query Builder Layer β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β SQL Builder, NoSQL Builder β β
β β Type-Safe Query Construction β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ
β Connection Pooling Layer β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Connection Acquisition/Release β β
β β Health Monitoring, Adaptive Sizing β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ
β Database Manager Layer β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Singleton Manager, Mode Switching β β
β β Transaction Coordination β β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββΌβββββββββββββ¬ββββββββββββββ
β β β β
βββββββββΌβββββββ ββββΌβββββββββ βββΌβββββββββββ ββΌβββββββββββ
β PostgreSQL β β MySQL β β SQLite β β MongoDB β
β Backend β β Backend β β Backend β β Backend β
ββββββββββββββββ βββββββββββββ ββββββββββββββ βββββββββββββ
β
βββββββββΌβββββββ
β Redis β
β Backend β
ββββββββββββββββ
All database backends implement the database_base abstract interface, ensuring consistent behavior across different database types.
namespace database {
class database_base {
public:
virtual ~database_base() = default;
// Core operations
virtual database_types database_type() = 0;
virtual bool connect(const std::string& connect_string) = 0;
virtual bool disconnect() = 0;
// Query execution
virtual bool execute_query(const std::string& query_string) = 0;
virtual database_result select_query(const std::string& query_string) = 0;
virtual unsigned int insert_query(const std::string& query_string) = 0;
virtual unsigned int update_query(const std::string& query_string) = 0;
virtual unsigned int delete_query(const std::string& query_string) = 0;
// Transaction support
virtual bool begin_transaction() = 0;
virtual bool commit_transaction() = 0;
virtual bool rollback_transaction() = 0;
};
}Location: database/postgres_manager.h, database/postgres_manager.cpp
Features:
- Full ACID transaction support
- JSONB for semi-structured data
- Array data types
- Common Table Expressions (CTEs)
- Prepared statements via libpqxx
- Advanced indexing (GIN, GiST)
Performance: Optimized for complex queries and high-concurrency OLTP workloads.
Location: database/backends/mysql/mysql_manager.h, mysql_manager.cpp
Features:
- InnoDB storage engine with ACID compliance
- Full-text search capabilities
- Prepared statements via mysqlclient
- Replication support
Performance: Excellent for read-heavy workloads and web applications.
Location: database/backends/sqlite/sqlite_manager.h, sqlite_manager.cpp
Features:
- Embedded database (no server required)
- WAL (Write-Ahead Logging) mode
- FTS5 full-text search
- In-memory database option
Performance: Ideal for embedded applications and development/testing.
Location: database/backends/mongodb/mongodb_manager.h, mongodb_manager.cpp
Features:
- Document-oriented storage
- Aggregation pipeline
- GridFS for large file storage
- Flexible schema
Performance: Optimized for document operations and horizontal scaling.
Location: database/backends/redis/redis_manager.h, redis_manager.cpp
Features:
- In-memory key-value store
- All data types (strings, lists, sets, hashes, sorted sets)
- Pub/Sub messaging
- Transactions via MULTI/EXEC
Performance: Sub-millisecond latency for cache and session management.
// Set backend based on use case
database_manager& db = database_manager::handle();
// OLTP applications: PostgreSQL
db.set_mode(database_types::postgres);
// Web applications: MySQL
db.set_mode(database_types::mysql);
// Embedded/testing: SQLite
db.set_mode(database_types::sqlite);
// Document storage: MongoDB
db.set_mode(database_types::mongodb);
// Caching/sessions: Redis
db.set_mode(database_types::redis);The ORM framework provides C++20 concepts-based entity mapping with automatic schema generation and type-safe query operations.
Entities are defined using C++20 concepts to enforce compile-time type safety:
namespace database::orm {
// Entity concept
template<typename T>
concept Entity = requires(T t) {
typename T::primary_key_type;
{ t.table_name() } -> std::convertible_to<std::string>;
{ t.get_metadata() } -> std::same_as<const entity_metadata&>;
};
// Field type concept
template<typename T>
concept FieldType = std::is_same_v<T, int32_t> ||
std::is_same_v<T, int64_t> ||
std::is_same_v<T, double> ||
std::is_same_v<T, std::string> ||
std::is_same_v<T, bool> ||
std::is_same_v<T, std::chrono::system_clock::time_point>;
}Field constraints are defined using bitwise flags:
enum class field_constraint {
none = 0,
primary_key = 1,
not_null = 2,
unique = 4,
auto_increment = 8,
index = 16,
foreign_key = 32,
default_now = 64
};
// Example usage
field_metadata id_field(
"id",
"int64_t",
field_constraint::primary_key | field_constraint::auto_increment
);The ORM framework automatically generates SQL DDL statements:
class entity_metadata {
public:
std::string create_table_sql() const;
std::vector<std::string> create_index_sql() const;
std::vector<std::string> create_foreign_key_sql() const;
};
// Generated SQL example
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_username ON users(username);ORM queries are type-checked at compile time:
template<Entity EntityType>
class query_builder {
public:
query_builder<EntityType>& where(
const std::string& field,
const std::string& op,
const database_value& value
);
query_builder<EntityType>& order_by(
const std::string& field,
sort_order order = sort_order::asc
);
std::optional<database_result> execute(database_base* db);
};Enterprise-grade connection pooling supports 10,000+ concurrent connections with adaptive sizing and health monitoring.
class connection_pool {
public:
// Configuration
struct config {
size_t min_connections = 2;
size_t max_connections = 20;
std::chrono::milliseconds acquire_timeout{5000};
std::chrono::milliseconds idle_timeout{30000};
std::chrono::milliseconds health_check_interval{60000};
bool enable_health_checks = true;
std::string connection_string;
};
private:
// Connection storage
std::queue<std::unique_ptr<database_base>> available_connections_;
std::vector<std::unique_ptr<database_base>> active_connections_;
// Thread synchronization
mutable std::mutex pool_mutex_;
std::condition_variable pool_condition_;
// Health monitoring
std::atomic<size_t> total_connections_{0};
std::atomic<size_t> active_count_{0};
};- Minimum Connections: Always maintain
min_connectionsready - Dynamic Expansion: Create new connections when all are busy
- Maximum Limit: Never exceed
max_connections - Automatic Shrinking: Close idle connections after
idle_timeout
// Health check performed every health_check_interval
bool is_connection_healthy(database_base* conn) {
return conn->execute_query("SELECT 1");
}
// Automatic recovery
if (!is_connection_healthy(conn)) {
close_connection(conn);
create_new_connection();
}- Connection Acquisition: 0.1ms average (20x faster than native)
- Pool Utilization: 95%+ efficiency under load
- Concurrent Connections: Tested up to 10,000 connections
- Memory Overhead: ~85KB per connection
Type-safe query construction with automatic SQL generation for different database backends.
// SQL query builder
auto result = db.create_query_builder(database_types::postgres)
.select({"id", "name", "email"})
.from("users")
.where("age", ">", database_value{int64_t(18)})
.where("status", "=", database_value{std::string("active")})
.order_by("created_at", sort_order::desc)
.limit(100)
.execute(&db);The same query builder interface generates backend-specific SQL:
PostgreSQL:
SELECT id, name, email FROM users
WHERE age > $1 AND status = $2
ORDER BY created_at DESC LIMIT 100;MySQL:
SELECT id, name, email FROM users
WHERE age > ? AND status = ?
ORDER BY created_at DESC LIMIT 100;SQLite:
SELECT id, name, email FROM users
WHERE age > ? AND status = ?
ORDER BY created_at DESC LIMIT 100;auto mongo_result = db.create_query_builder(database_types::mongodb)
.collection("users")
.find({{"status", database_value{std::string("active")}}})
.sort("created_at", -1)
.limit(100)
.execute(&db);auto redis_result = db.create_query_builder(database_types::redis)
.hset("user:123", {
{"name", "John Doe"},
{"email", "john@example.com"}
})
.execute(&db);- Parameterized queries for all user inputs
- Automatic escaping of special characters
- Raw SQL methods marked as unsafe and discouraged
ACID-compliant transaction support with distributed transaction coordination.
// Begin transaction
db.begin_transaction();
try {
db.execute_query("INSERT INTO accounts (id, balance) VALUES (1, 1000)");
db.execute_query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
db.execute_query("INSERT INTO transactions (from, amount) VALUES (1, 100)");
// Commit on success
db.commit_transaction();
} catch (const std::exception& e) {
// Rollback on failure
db.rollback_transaction();
throw;
}For operations spanning multiple databases:
namespace database::async {
class transaction_coordinator {
public:
// Two-phase commit protocol
std::string begin_distributed_transaction(
const std::vector<database_base*>& participants
);
bool commit_distributed_transaction(const std::string& tx_id);
void rollback_distributed_transaction(const std::string& tx_id);
};
}Support for standard SQL isolation levels (backend-dependent):
- READ UNCOMMITTED
- READ COMMITTED (default)
- REPEATABLE READ
- SERIALIZABLE
Result pattern for exception-free error handling:
#include <kcenon/database/config/feature_flags.h>
#if KCENON_HAS_COMMON_SYSTEM
#include <kcenon/common/patterns/result.h>
namespace database::adapters {
class common_system_database_adapter {
public:
common::Result<void> connect(const std::string& conn_string);
common::Result<database_result> execute_query(const std::string& query);
common::VoidResult begin_transaction();
common::VoidResult commit();
common::VoidResult rollback();
};
}
#endifError Code Range: -500 to -599 (centralized in common_system)
Async database operations using thread pools:
#include <kcenon/thread/core/thread_pool.h>
class async_database_service {
private:
std::shared_ptr<database_manager> db_;
std::shared_ptr<kcenon::thread::thread_pool> pool_;
public:
auto execute_query_async(const std::string& query)
-> std::future<common::Result<query_result>> {
return pool_->post([this, query](const auto&) {
return this->db_->execute_query(query);
});
}
};Comprehensive query logging using common_system's ILogger and LOG_* macros:
#include <kcenon/common/logging/log_macros.h>
class logging_database_manager : public database_manager {
public:
bool execute_query(const std::string& query) override {
LOG_DEBUG("Executing: {}", query);
auto start = std::chrono::steady_clock::now();
bool result = base_->execute_query(query);
auto duration = std::chrono::steady_clock::now() - start;
LOG_INFO("Query completed in {}ms", duration.count());
return result;
}
};| Metric | Value | Notes |
|---|---|---|
| Acquisition Time | 0.1ms | 20x faster than native drivers |
| Pool Efficiency | 95%+ | Under 10,000 concurrent connections |
| Memory per Connection | ~85KB | Includes overhead and metadata |
| Health Check Interval | 60s | Configurable, default 60 seconds |
PostgreSQL (Primary Backend):
- Simple SELECT: 1.2ms average
- Complex JOIN: 15ms average
- Bulk INSERT (1K rows): 45ms
- Transaction throughput: 5,000 TPS
MySQL:
- Simple SELECT: 1.5ms average
- Complex JOIN: 18ms average
- Bulk INSERT (1K rows): 52ms
SQLite:
- Simple SELECT: 0.8ms average
- Complex JOIN: 12ms average
- Bulk INSERT (1K rows): 38ms
MongoDB:
- Document find: 2.1ms average
- Aggregation pipeline: 25ms average
- Bulk insert (1K documents): 35ms
Redis:
- GET/SET: 0.3ms average
- HGETALL: 0.5ms average
- Bulk operations (1K): 28ms
- Baseline Memory: <50MB without connections
- With 100 connections: ~140MB
- With 1,000 connections: ~320MB
- With 10,000 connections: ~850MB
Horizontal Scaling:
- Distributed transactions across multiple databases
- Connection pooling per database instance
- Async operations for non-blocking I/O
Vertical Scaling:
- Thread pool sizing based on hardware cores
- Lock-free data structures where applicable
- Memory-efficient connection management
Application β Authentication β Authorization β Audit β Encryption
namespace database::security {
class credential_manager {
public:
void store_credentials(
const std::string& key,
const security_credentials& creds
);
std::optional<security_credentials> retrieve_credentials(
const std::string& key
);
std::string hash_password(const std::string& password);
};
enum class encryption_type {
none,
tls,
ssl,
aes256
};
}Role-Based Access Control for fine-grained permissions:
class access_control {
public:
enum class permission : uint32_t {
select = 1,
insert = 2,
update = 4,
delete_op = 8,
create_table = 16,
drop_table = 32,
admin = 0xFFFFFFFF
};
struct role {
std::string name;
permission permissions;
};
void create_role(const role& r);
void assign_role_to_user(const std::string& user, const std::string& role);
bool check_permission(const std::string& user, permission perm);
};Comprehensive security event logging:
#define AUDIT_LOG_ACCESS(user, session, operation, table, query, success, error) \
audit_logger::instance().log_access( \
user, session, operation, table, query, success, error)
class audit_logger {
public:
void log_access(
const std::string& user,
const std::string& session_id,
const std::string& operation,
const std::string& table,
const std::string& query_hash,
bool success,
const std::string& error_message
);
};C++20 coroutine support for non-blocking database operations.
namespace database::async {
class async_database {
public:
std::future<bool> execute_async(const std::string& query);
std::future<database_result> select_async(const std::string& query);
};
}template<typename T>
class database_awaitable {
public:
bool await_ready() const noexcept;
void await_suspend(std::coroutine_handle<> h);
T await_resume();
};
// Usage
database_awaitable<bool> create_user_async(const std::string& username) {
auto db = co_await async_db.connect_coro(connection_string);
auto result = co_await db.execute_coro(
"INSERT INTO users (username) VALUES ('" + username + "')"
);
co_return result;
}Real-time data streaming for event-driven architectures:
class stream_processor {
public:
void start_stream(stream_type type, const std::string& channel);
void register_event_handler(
const std::string& channel,
std::function<void(const stream_event&)> handler
);
};
// PostgreSQL NOTIFY/LISTEN
stream_processor processor(db);
processor.start_stream(stream_type::postgresql_notify, "user_changes");
processor.register_event_handler("user_changes", [](const stream_event& event) {
std::cout << "Data changed: " << event.payload << std::endl;
});Real-time metrics collection and analysis:
namespace database::monitoring {
class performance_monitor {
public:
struct performance_summary {
double queries_per_second;
std::chrono::microseconds avg_query_time;
double error_rate;
size_t total_queries;
size_t failed_queries;
};
void set_alert_thresholds(
double error_rate_threshold,
std::chrono::milliseconds latency_threshold
);
void register_alert_handler(
std::function<void(const performance_alert&)> handler
);
performance_summary get_performance_summary() const;
};
}Export metrics in Prometheus format:
class prometheus_exporter {
public:
prometheus_exporter(const std::string& endpoint, uint16_t port);
void export_metrics(const performance_summary& summary);
};
// Exported metrics
database_queries_total{status="success"} 50000
database_queries_total{status="failed"} 50
database_query_latency_seconds{quantile="0.5"} 0.0012
database_query_latency_seconds{quantile="0.99"} 0.0045
database_pool_active_connections 15
database_pool_idle_connections 5Connection and database health tracking:
struct pool_statistics {
size_t active_connections;
size_t available_connections;
size_t total_connections;
size_t wait_queue_size;
std::chrono::milliseconds avg_wait_time;
};
auto stats = db.get_pool_stats();The Database System architecture provides a robust, performant, and flexible foundation for enterprise database operations. Key architectural achievements include:
- Multi-Backend Support: Unified interface for 5 database types
- High Performance: 10,000+ concurrent connections with 0.1ms acquisition time
- Type Safety: C++20 concepts for compile-time validation
- Enterprise Features: ORM, security, monitoring, and async operations
- Ecosystem Integration: Seamless integration with common_system (including ILogger and LOG_* macros) and thread_system
This architecture supports diverse use cases from embedded applications to distributed enterprise systems while maintaining code quality, performance, and security standards.
Last Updated: 2025-10-22 Version: 0.1.0.0 Maintainer: kcenon@naver.com