Skip to content

R Database Integration Best Practices

Objective: Master senior-level R database integration patterns for production systems. When you need to connect R to databases, when you want to ensure data integrity and performance, when you need enterprise-grade database patternsโ€”these best practices become your weapon of choice.

Core Principles

  • Connection Management: Efficiently manage database connections
  • Data Integrity: Ensure data consistency and reliability
  • Performance: Optimize database queries and operations
  • Security: Implement security best practices
  • Scalability: Design for horizontal and vertical scaling

Database Connections

Connection Pooling

# R/01-database-connections.R

#' Create database connection pool
#'
#' @param db_config Database configuration
#' @return Database connection pool
create_database_connection_pool <- function(db_config) {
  pool <- list(
    config = create_pool_config(db_config),
    connections = create_pool_connections(db_config),
    management = create_pool_management(db_config)
  )

  return(pool)
}

#' Create pool configuration
#'
#' @param db_config Database configuration
#' @return Pool configuration
create_pool_config <- function(db_config) {
  pool_config <- list(
    min_size = db_config$min_size %||% 5,
    max_size = db_config$max_size %||% 20,
    idle_timeout = db_config$idle_timeout %||% 3600,
    validation_query = db_config$validation_query %||% "SELECT 1"
  )

  return(pool_config)
}

#' Create pool connections
#'
#' @param db_config Database configuration
#' @return Pool connections
create_pool_connections <- function(db_config) {
  connections <- list(
    postgresql = create_postgresql_connections(db_config),
    mysql = create_mysql_connections(db_config),
    sqlite = create_sqlite_connections(db_config),
    oracle = create_oracle_connections(db_config)
  )

  return(connections)
}

#' Create PostgreSQL connections
#'
#' @param db_config Database configuration
#' @return PostgreSQL connections
create_postgresql_connections <- function(db_config) {
  postgresql_connections <- c(
    "# PostgreSQL Connections",
    "library(DBI)",
    "library(pool)",
    "library(RPostgreSQL)",
    "",
    "# Create connection pool",
    "pool <- dbPool(",
    "  drv = RPostgreSQL::PostgreSQL(),",
    "  dbname = \"rdatabase\",",
    "  host = \"localhost\",",
    "  port = 5432,",
    "  user = \"ruser\",",
    "  password = \"rpassword\",",
    "  minSize = 5,",
    "  maxSize = 20,",
    "  idleTimeout = 3600",
    ")",
    "",
    "# Get connection from pool",
    "conn <- poolCheckout(pool)",
    "",
    "# Use connection",
    "result <- dbGetQuery(conn, \"SELECT * FROM users\")",
    "",
    "# Return connection to pool",
    "poolReturn(conn)"
  )

  return(postgresql_connections)
}

#' Create MySQL connections
#'
#' @param db_config Database configuration
#' @return MySQL connections
create_mysql_connections <- function(db_config) {
  mysql_connections <- c(
    "# MySQL Connections",
    "library(DBI)",
    "library(pool)",
    "library(RMySQL)",
    "",
    "# Create connection pool",
    "pool <- dbPool(",
    "  drv = RMySQL::MySQL(),",
    "  dbname = \"rdatabase\",",
    "  host = \"localhost\",",
    "  port = 3306,",
    "  user = \"ruser\",",
    "  password = \"rpassword\",",
    "  minSize = 5,",
    "  maxSize = 20,",
    "  idleTimeout = 3600",
    ")",
    "",
    "# Get connection from pool",
    "conn <- poolCheckout(pool)",
    "",
    "# Use connection",
    "result <- dbGetQuery(conn, \"SELECT * FROM users\")",
    "",
    "# Return connection to pool",
    "poolReturn(conn)"
  )

  return(mysql_connections)
}

#' Create SQLite connections
#'
#' @param db_config Database configuration
#' @return SQLite connections
create_sqlite_connections <- function(db_config) {
  sqlite_connections <- c(
    "# SQLite Connections",
    "library(DBI)",
    "library(RSQLite)",
    "",
    "# Create connection",
    "conn <- dbConnect(RSQLite::SQLite(), \"rdatabase.db\")",
    "",
    "# Use connection",
    "result <- dbGetQuery(conn, \"SELECT * FROM users\")",
    "",
    "# Close connection",
    "dbDisconnect(conn)"
  )

  return(sqlite_connections)
}

#' Create Oracle connections
#'
#' @param db_config Database configuration
#' @return Oracle connections
create_oracle_connections <- function(db_config) {
  oracle_connections <- c(
    "# Oracle Connections",
    "library(DBI)",
    "library(ROracle)",
    "",
    "# Create connection",
    "conn <- dbConnect(",
    "  ROracle::Oracle(),",
    "  username = \"ruser\",",
    "  password = \"rpassword\",",
    "  dbname = \"rdatabase\"",
    ")",
    "",
    "# Use connection",
    "result <- dbGetQuery(conn, \"SELECT * FROM users\")",
    "",
    "# Close connection",
    "dbDisconnect(conn)"
  )

  return(oracle_connections)
}

Connection Management

# R/01-database-connections.R (continued)

#' Create connection management
#'
#' @param db_config Database configuration
#' @return Connection management
create_connection_management <- function(db_config) {
  management <- list(
    lifecycle = create_connection_lifecycle(db_config),
    monitoring = create_connection_monitoring(db_config),
    error_handling = create_connection_error_handling(db_config)
  )

  return(management)
}

#' Create connection lifecycle
#'
#' @param db_config Database configuration
#' @return Connection lifecycle
create_connection_lifecycle <- function(db_config) {
  lifecycle <- c(
    "# Connection Lifecycle",
    "library(DBI)",
    "library(pool)",
    "",
    "# Create connection pool",
    "pool <- dbPool(",
    "  drv = RPostgreSQL::PostgreSQL(),",
    "  dbname = \"rdatabase\",",
    "  host = \"localhost\",",
    "  port = 5432,",
    "  user = \"ruser\",",
    "  password = \"rpassword\",",
    "  minSize = 5,",
    "  maxSize = 20,",
    "  idleTimeout = 3600",
    ")",
    "",
    "# Get connection from pool",
    "conn <- poolCheckout(pool)",
    "",
    "# Use connection",
    "result <- dbGetQuery(conn, \"SELECT * FROM users\")",
    "",
    "# Return connection to pool",
    "poolReturn(conn)",
    "",
    "# Close pool when done",
    "poolClose(pool)"
  )

  return(lifecycle)
}

#' Create connection monitoring
#'
#' @param db_config Database configuration
#' @return Connection monitoring
create_connection_monitoring <- function(db_config) {
  monitoring <- c(
    "# Connection Monitoring",
    "library(DBI)",
    "library(pool)",
    "",
    "# Create connection pool with monitoring",
    "pool <- dbPool(",
    "  drv = RPostgreSQL::PostgreSQL(),",
    "  dbname = \"rdatabase\",",
    "  host = \"localhost\",",
    "  port = 5432,",
    "  user = \"ruser\",",
    "  password = \"rpassword\",",
    "  minSize = 5,",
    "  maxSize = 20,",
    "  idleTimeout = 3600",
    ")",
    "",
    "# Monitor pool status",
    "pool_status <- function() {",
    "  list(",
    "    total_connections = pool$total_connections,",
    "    active_connections = pool$active_connections,",
    "    idle_connections = pool$idle_connections",
    "  )",
    "}",
    "",
    "# Get pool status",
    "status <- pool_status()",
    "print(status)"
  )

  return(monitoring)
}

#' Create connection error handling
#'
#' @param db_config Database configuration
#' @return Connection error handling
create_connection_error_handling <- function(db_config) {
  error_handling <- c(
    "# Connection Error Handling",
    "library(DBI)",
    "library(pool)",
    "",
    "# Create connection pool with error handling",
    "pool <- dbPool(",
    "  drv = RPostgreSQL::PostgreSQL(),",
    "  dbname = \"rdatabase\",",
    "  host = \"localhost\",",
    "  port = 5432,",
    "  user = \"ruser\",",
    "  password = \"rpassword\",",
    "  minSize = 5,",
    "  maxSize = 20,",
    "  idleTimeout = 3600",
    ")",
    "",
    "# Safe database operation",
    "safe_db_operation <- function(operation) {",
    "  tryCatch({",
    "    conn <- poolCheckout(pool)",
    "    result <- operation(conn)",
    "    poolReturn(conn)",
    "    return(result)",
    "  }, error = function(e) {",
    "    if (exists(\"conn\")) poolReturn(conn)",
    "    stop(paste(\"Database operation failed:\", e$message))",
    "  })",
    "}",
    "",
    "# Use safe operation",
    "result <- safe_db_operation(function(conn) {",
    "  dbGetQuery(conn, \"SELECT * FROM users\")",
    "})"
  )

  return(error_handling)
}

Query Optimization

Query Performance

# R/02-query-optimization.R

#' Create query optimization
#'
#' @param query_config Query configuration
#' @return Query optimization
create_query_optimization <- function(query_config) {
  optimization <- list(
    indexing = create_indexing_strategies(query_config),
    query_planning = create_query_planning(query_config),
    caching = create_query_caching(query_config)
  )

  return(optimization)
}

#' Create indexing strategies
#'
#' @param query_config Query configuration
#' @return Indexing strategies
create_indexing_strategies <- function(query_config) {
  indexing <- c(
    "# Indexing Strategies",
    "library(DBI)",
    "library(pool)",
    "",
    "# Create indexes for common queries",
    "create_indexes <- function(conn) {",
    "  # Create index on user_id",
    "  dbExecute(conn, \"CREATE INDEX IF NOT EXISTS idx_users_id ON users(id)\")",
    "  ",
    "  # Create index on email",
    "  dbExecute(conn, \"CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)\")",
    "  ",
    "  # Create composite index",
    "  dbExecute(conn, \"CREATE INDEX IF NOT EXISTS idx_users_status_created ON users(status, created_at)\")",
    "  ",
    "  # Create partial index",
    "  dbExecute(conn, \"CREATE INDEX IF NOT EXISTS idx_users_active ON users(id) WHERE status = 'active'\")",
    "}",
    "",
    "# Create indexes",
    "conn <- poolCheckout(pool)",
    "create_indexes(conn)",
    "poolReturn(conn)"
  )

  return(indexing)
}

#' Create query planning
#'
#' @param query_config Query configuration
#' @return Query planning
create_query_planning <- function(query_config) {
  query_planning <- c(
    "# Query Planning",
    "library(DBI)",
    "library(pool)",
    "",
    "# Analyze query performance",
    "analyze_query <- function(conn, query) {",
    "  # Get query plan",
    "  plan <- dbGetQuery(conn, paste(\"EXPLAIN ANALYZE\", query))",
    "  ",
    "  # Print plan",
    "  print(plan)",
    "  ",
    "  # Return plan",
    "  return(plan)",
    "}",
    "",
    "# Analyze query",
    "conn <- poolCheckout(pool)",
    "plan <- analyze_query(conn, \"SELECT * FROM users WHERE status = 'active'\")",
    "poolReturn(conn)"
  )

  return(query_planning)
}

#' Create query caching
#'
#' @param query_config Query configuration
#' @return Query caching
create_query_caching <- function(query_config) {
  query_caching <- c(
    "# Query Caching",
    "library(DBI)",
    "library(pool)",
    "library(memoise)",
    "",
    "# Create cached query function",
    "cached_query <- memoise(function(conn, query) {",
    "  dbGetQuery(conn, query)",
    "}, cache = cache_memory())",
    "",
    "# Use cached query",
    "conn <- poolCheckout(pool)",
    "result <- cached_query(conn, \"SELECT * FROM users\")",
    "poolReturn(conn)"
  )

  return(query_caching)
}

Data Validation

# R/02-query-optimization.R (continued)

#' Create data validation
#'
#' @param validation_config Validation configuration
#' @return Data validation
create_data_validation <- function(validation_config) {
  validation <- list(
    schema_validation = create_schema_validation(validation_config),
    data_quality = create_data_quality_checks(validation_config),
    constraints = create_data_constraints(validation_config)
  )

  return(validation)
}

#' Create schema validation
#'
#' @param validation_config Validation configuration
#' @return Schema validation
create_schema_validation <- function(validation_config) {
  schema_validation <- c(
    "# Schema Validation",
    "library(DBI)",
    "library(pool)",
    "",
    "# Validate table schema",
    "validate_schema <- function(conn, table_name, expected_schema) {",
    "  # Get actual schema",
    "  actual_schema <- dbGetQuery(conn, paste(\"SELECT * FROM information_schema.columns WHERE table_name = '\", table_name, \"'\"))",
    "  ",
    "  # Compare schemas",
    "  if (nrow(actual_schema) != nrow(expected_schema)) {",
    "    stop(\"Schema mismatch: different number of columns\")",
    "  }",
    "  ",
    "  # Check column types",
    "  for (i in 1:nrow(expected_schema)) {",
    "    expected_col <- expected_schema[i, ]",
    "    actual_col <- actual_schema[actual_schema$column_name == expected_col$column_name, ]",
    "    ",
    "    if (nrow(actual_col) == 0) {",
    "      stop(paste(\"Column not found:\", expected_col$column_name))",
    "    }",
    "    ",
    "    if (actual_col$data_type != expected_col$data_type) {",
    "      stop(paste(\"Column type mismatch for\", expected_col$column_name, \": expected\", expected_col$data_type, \"got\", actual_col$data_type))",
    "    }",
    "  }",
    "  ",
    "  return(TRUE)",
    "}",
    "",
    "# Validate schema",
    "conn <- poolCheckout(pool)",
    "validate_schema(conn, \"users\", expected_schema)",
    "poolReturn(conn)"
  )

  return(schema_validation)
}

#' Create data quality checks
#'
#' @param validation_config Validation configuration
#' @return Data quality checks
create_data_quality_checks <- function(validation_config) {
  data_quality <- c(
    "# Data Quality Checks",
    "library(DBI)",
    "library(pool)",
    "",
    "# Check data quality",
    "check_data_quality <- function(conn, table_name) {",
    "  # Check for null values",
    "  null_counts <- dbGetQuery(conn, paste(\"SELECT COUNT(*) as null_count FROM\", table_name, \"WHERE column_name IS NULL\"))",
    "  ",
    "  # Check for duplicates",
    "  duplicate_counts <- dbGetQuery(conn, paste(\"SELECT COUNT(*) as duplicate_count FROM (SELECT column_name, COUNT(*) FROM\", table_name, \"GROUP BY column_name HAVING COUNT(*) > 1) as duplicates\"))",
    "  ",
    "  # Check for outliers",
    "  outliers <- dbGetQuery(conn, paste(\"SELECT * FROM\", table_name, \"WHERE column_name > (SELECT AVG(column_name) + 3 * STDDEV(column_name) FROM\", table_name, \")\"))",
    "  ",
    "  # Return quality report",
    "  list(",
    "    null_counts = null_counts,",
    "    duplicate_counts = duplicate_counts,",
    "    outliers = outliers",
    "  )",
    "}",
    "",
    "# Check data quality",
    "conn <- poolCheckout(pool)",
    "quality_report <- check_data_quality(conn, \"users\")",
    "poolReturn(conn)"
  )

  return(data_quality)
}

#' Create data constraints
#'
#' @param validation_config Validation configuration
#' @return Data constraints
create_data_constraints <- function(validation_config) {
  data_constraints <- c(
    "# Data Constraints",
    "library(DBI)",
    "library(pool)",
    "",
    "# Create data constraints",
    "create_constraints <- function(conn) {",
    "  # Create check constraint",
    "  dbExecute(conn, \"ALTER TABLE users ADD CONSTRAINT check_status CHECK (status IN ('active', 'inactive', 'pending'))\")",
    "  ",
    "  # Create unique constraint",
    "  dbExecute(conn, \"ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email)\")",
    "  ",
    "  # Create foreign key constraint",
    "  dbExecute(conn, \"ALTER TABLE orders ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(id)\")",
    "  ",
    "  # Create not null constraint",
    "  dbExecute(conn, \"ALTER TABLE users ALTER COLUMN email SET NOT NULL\")",
    "}",
    "",
    "# Create constraints",
    "conn <- poolCheckout(pool)",
    "create_constraints(conn)",
    "poolReturn(conn)"
  )

  return(data_constraints)
}

Data Pipelines

ETL Processes

# R/03-data-pipelines.R

#' Create ETL processes
#'
#' @param etl_config ETL configuration
#' @return ETL processes
create_etl_processes <- function(etl_config) {
  etl <- list(
    extraction = create_data_extraction(etl_config),
    transformation = create_data_transformation(etl_config),
    loading = create_data_loading(etl_config)
  )

  return(etl)
}

#' Create data extraction
#'
#' @param etl_config ETL configuration
#' @return Data extraction
create_data_extraction <- function(etl_config) {
  extraction <- c(
    "# Data Extraction",
    "library(DBI)",
    "library(pool)",
    "library(dplyr)",
    "",
    "# Extract data from source",
    "extract_data <- function(conn, query) {",
    "  # Get data from database",
    "  data <- dbGetQuery(conn, query)",
    "  ",
    "  # Convert to tibble",
    "  data <- as_tibble(data)",
    "  ",
    "  # Add metadata",
    "  attr(data, \"extracted_at\") <- Sys.time()",
    "  attr(data, \"source\") <- \"database\"",
    "  ",
    "  return(data)",
    "}",
    "",
    "# Extract data",
    "conn <- poolCheckout(pool)",
    "data <- extract_data(conn, \"SELECT * FROM users\")",
    "poolReturn(conn)"
  )

  return(extraction)
}

#' Create data transformation
#'
#' @param etl_config ETL configuration
#' @return Data transformation
create_data_transformation <- function(etl_config) {
  transformation <- c(
    "# Data Transformation",
    "library(DBI)",
    "library(pool)",
    "library(dplyr)",
    "library(lubridate)",
    "",
    "# Transform data",
    "transform_data <- function(data) {",
    "  # Clean data",
    "  data <- data %>%",
    "    filter(!is.na(email)) %>%",
    "    mutate(email = tolower(email)) %>%",
    "    mutate(created_at = as.Date(created_at))",
    "  ",
    "  # Add derived columns",
    "  data <- data %>%",
    "    mutate(age = year(Sys.Date()) - year(birth_date)) %>%",
    "    mutate(is_active = status == 'active')",
    "  ",
    "  # Add metadata",
    "  attr(data, \"transformed_at\") <- Sys.time()",
    "  ",
    "  return(data)",
    "}",
    "",
    "# Transform data",
    "transformed_data <- transform_data(data)"
  )

  return(transformation)
}

#' Create data loading
#'
#' @param etl_config ETL configuration
#' @return Data loading
create_data_loading <- function(etl_config) {
  loading <- c(
    "# Data Loading",
    "library(DBI)",
    "library(pool)",
    "",
    "# Load data to destination",
    "load_data <- function(conn, data, table_name) {",
    "  # Create table if not exists",
    "  if (!dbExistsTable(conn, table_name)) {",
    "    dbCreateTable(conn, table_name, data)",
    "  }",
    "  ",
    "  # Insert data",
    "  dbWriteTable(conn, table_name, data, append = TRUE)",
    "  ",
    "  # Add metadata",
    "  attr(data, \"loaded_at\") <- Sys.time()",
    "  ",
    "  return(TRUE)",
    "}",
    "",
    "# Load data",
    "conn <- poolCheckout(pool)",
    "load_data(conn, transformed_data, \"users_processed\")",
    "poolReturn(conn)"
  )

  return(loading)
}

Data Synchronization

# R/03-data-pipelines.R (continued)

#' Create data synchronization
#'
#' @param sync_config Sync configuration
#' @return Data synchronization
create_data_synchronization <- function(sync_config) {
  sync <- list(
    incremental_sync = create_incremental_sync(sync_config),
    full_sync = create_full_sync(sync_config),
    conflict_resolution = create_conflict_resolution(sync_config)
  )

  return(sync)
}

#' Create incremental sync
#'
#' @param sync_config Sync configuration
#' @return Incremental sync
create_incremental_sync <- function(sync_config) {
  incremental_sync <- c(
    "# Incremental Sync",
    "library(DBI)",
    "library(pool)",
    "library(dplyr)",
    "",
    "# Incremental sync",
    "incremental_sync <- function(source_conn, target_conn, table_name, last_sync) {",
    "  # Get changes since last sync",
    "  changes <- dbGetQuery(source_conn, paste(\"SELECT * FROM\", table_name, \"WHERE updated_at > '\", last_sync, \"'\"))",
    "  ",
    "  # Apply changes to target",
    "  for (i in 1:nrow(changes)) {",
    "    row <- changes[i, ]",
    "    ",
    "    # Check if record exists",
    "    exists <- dbGetQuery(target_conn, paste(\"SELECT COUNT(*) FROM\", table_name, \"WHERE id = \", row$id))",
    "    ",
    "    if (exists > 0) {",
    "      # Update existing record",
    "      dbExecute(target_conn, paste(\"UPDATE\", table_name, \"SET column_name = '\", row$column_name, \"' WHERE id = \", row$id))",
    "    } else {",
    "      # Insert new record",
    "      dbExecute(target_conn, paste(\"INSERT INTO\", table_name, \"(id, column_name) VALUES (\", row$id, \", '\", row$column_name, \"')\"))",
    "    }",
    "  }",
    "  ",
    "  return(TRUE)",
    "}",
    "",
    "# Incremental sync",
    "source_conn <- poolCheckout(source_pool)",
    "target_conn <- poolCheckout(target_pool)",
    "incremental_sync(source_conn, target_conn, \"users\", last_sync)",
    "poolReturn(source_conn)",
    "poolReturn(target_conn)"
  )

  return(incremental_sync)
}

#' Create full sync
#'
#' @param sync_config Sync configuration
#' @return Full sync
create_full_sync <- function(sync_config) {
  full_sync <- c(
    "# Full Sync",
    "library(DBI)",
    "library(pool)",
    "",
    "# Full sync",
    "full_sync <- function(source_conn, target_conn, table_name) {",
    "  # Get all data from source",
    "  data <- dbGetQuery(source_conn, paste(\"SELECT * FROM\", table_name))",
    "  ",
    "  # Clear target table",
    "  dbExecute(target_conn, paste(\"TRUNCATE TABLE\", table_name))",
    "  ",
    "  # Insert all data",
    "  dbWriteTable(target_conn, table_name, data, append = TRUE)",
    "  ",
    "  return(TRUE)",
    "}",
    "",
    "# Full sync",
    "source_conn <- poolCheckout(source_pool)",
    "target_conn <- poolCheckout(target_pool)",
    "full_sync(source_conn, target_conn, \"users\")",
    "poolReturn(source_conn)",
    "poolReturn(target_conn)"
  )

  return(full_sync)
}

#' Create conflict resolution
#'
#' @param sync_config Sync configuration
#' @return Conflict resolution
create_conflict_resolution <- function(sync_config) {
  conflict_resolution <- c(
    "# Conflict Resolution",
    "library(DBI)",
    "library(pool)",
    "",
    "# Resolve conflicts",
    "resolve_conflicts <- function(source_conn, target_conn, table_name) {",
    "  # Get conflicts",
    "  conflicts <- dbGetQuery(source_conn, paste(\"SELECT * FROM\", table_name, \"WHERE updated_at > (SELECT updated_at FROM\", table_name, \"WHERE id = \", table_name, \".id)\"))",
    "  ",
    "  # Resolve conflicts using last-write-wins",
    "  for (i in 1:nrow(conflicts)) {",
    "    row <- conflicts[i, ]",
    "    ",
    "    # Update target with source data",
    "    dbExecute(target_conn, paste(\"UPDATE\", table_name, \"SET column_name = '\", row$column_name, \"' WHERE id = \", row$id))",
    "  }",
    "  ",
    "  return(TRUE)",
    "}",
    "",
    "# Resolve conflicts",
    "source_conn <- poolCheckout(source_pool)",
    "target_conn <- poolCheckout(target_pool)",
    "resolve_conflicts(source_conn, target_conn, \"users\")",
    "poolReturn(source_conn)",
    "poolReturn(target_conn)"
  )

  return(conflict_resolution)
}

Security and Authentication

Database Security

# R/04-security-authentication.R

#' Create database security
#'
#' @param security_config Security configuration
#' @return Database security
create_database_security <- function(security_config) {
  security <- list(
    authentication = create_authentication(security_config),
    authorization = create_authorization(security_config),
    encryption = create_encryption(security_config)
  )

  return(security)
}

#' Create authentication
#'
#' @param security_config Security configuration
#' @return Authentication
create_authentication <- function(security_config) {
  authentication <- c(
    "# Database Authentication",
    "library(DBI)",
    "library(pool)",
    "library(httr)",
    "",
    "# Authenticate user",
    "authenticate_user <- function(username, password) {",
    "  # Validate credentials",
    "  if (validate_credentials(username, password)) {",
    "    # Generate JWT token",
    "    token <- generate_jwt_token(username)",
    "    ",
    "    # Return token",
    "    return(token)",
    "  } else {",
    "    stop(\"Invalid credentials\")",
    "  }",
    "}",
    "",
    "# Validate credentials",
    "validate_credentials <- function(username, password) {",
    "  # Check against database",
    "  conn <- poolCheckout(pool)",
    "  result <- dbGetQuery(conn, paste(\"SELECT COUNT(*) FROM users WHERE username = '\", username, \"' AND password = '\", password, \"'\"))",
    "  poolReturn(conn)",
    "  ",
    "  return(result > 0)",
    "}",
    "",
    "# Generate JWT token",
    "generate_jwt_token <- function(username) {",
    "  # Create JWT payload",
    "  payload <- list(",
    "    username = username,",
    "    exp = as.numeric(Sys.time()) + 3600",
    "  )",
    "  ",
    "  # Sign token",
    "  token <- jwt_sign(payload, secret_key)",
    "  ",
    "  return(token)",
    "}"
  )

  return(authentication)
}

#' Create authorization
#'
#' @param security_config Security configuration
#' @return Authorization
create_authorization <- function(security_config) {
  authorization <- c(
    "# Database Authorization",
    "library(DBI)",
    "library(pool)",
    "",
    "# Check user permissions",
    "check_permissions <- function(username, resource, action) {",
    "  # Get user permissions",
    "  conn <- poolCheckout(pool)",
    "  permissions <- dbGetQuery(conn, paste(\"SELECT * FROM user_permissions WHERE username = '\", username, \"' AND resource = '\", resource, \"' AND action = '\", action, \"'\"))",
    "  poolReturn(conn)",
    "  ",
    "  return(nrow(permissions) > 0)",
    "}",
    "",
    "# Authorize database operation",
    "authorize_operation <- function(username, operation) {",
    "  # Check if user can perform operation",
    "  if (check_permissions(username, \"database\", operation)) {",
    "    return(TRUE)",
    "  } else {",
    "    stop(\"Unauthorized operation\")",
    "  }",
    "}",
    "",
    "# Use authorization",
    "username <- \"user1\"",
    "if (authorize_operation(username, \"read\")) {",
    "  # Perform read operation",
    "  result <- dbGetQuery(conn, \"SELECT * FROM users\")",
    "}"
  )

  return(authorization)
}

#' Create encryption
#'
#' @param security_config Security configuration
#' @return Encryption
create_encryption <- function(security_config) {
  encryption <- c(
    "# Database Encryption",
    "library(DBI)",
    "library(pool)",
    "library(openssl)",
    "",
    "# Encrypt sensitive data",
    "encrypt_data <- function(data, key) {",
    "  # Encrypt data",
    "  encrypted <- aes_encrypt(data, key)",
    "  ",
    "  return(encrypted)",
    "}",
    "",
    "# Decrypt sensitive data",
    "decrypt_data <- function(encrypted_data, key) {",
    "  # Decrypt data",
    "  decrypted <- aes_decrypt(encrypted_data, key)",
    "  ",
    "  return(decrypted)",
    "}",
    "",
    "# Store encrypted data",
    "store_encrypted_data <- function(conn, table_name, data, key) {",
    "  # Encrypt sensitive columns",
    "  data$password <- encrypt_data(data$password, key)",
    "  data$ssn <- encrypt_data(data$ssn, key)",
    "  ",
    "  # Store in database",
    "  dbWriteTable(conn, table_name, data, append = TRUE)",
    "  ",
    "  return(TRUE)",
    "}",
    "",
    "# Retrieve and decrypt data",
    "retrieve_encrypted_data <- function(conn, table_name, key) {",
    "  # Get data from database",
    "  data <- dbGetQuery(conn, paste(\"SELECT * FROM\", table_name))",
    "  ",
    "  # Decrypt sensitive columns",
    "  data$password <- decrypt_data(data$password, key)",
    "  data$ssn <- decrypt_data(data$ssn, key)",
    "  ",
    "  return(data)",
    "}"
  )

  return(encryption)
}

TL;DR Runbook

Quick Start

# 1. Create database connection pool
pool <- create_database_connection_pool(db_config)

# 2. Create query optimization
optimization <- create_query_optimization(query_config)

# 3. Create data validation
validation <- create_data_validation(validation_config)

# 4. Create ETL processes
etl <- create_etl_processes(etl_config)

# 5. Create data synchronization
sync <- create_data_synchronization(sync_config)

# 6. Create database security
security <- create_database_security(security_config)

Essential Patterns

# Complete database integration
create_database_integration <- function(integration_config) {
  # Create connection pool
  pool <- create_database_connection_pool(integration_config$db_config)

  # Create query optimization
  optimization <- create_query_optimization(integration_config$query_config)

  # Create data validation
  validation <- create_data_validation(integration_config$validation_config)

  # Create ETL processes
  etl <- create_etl_processes(integration_config$etl_config)

  # Create data synchronization
  sync <- create_data_synchronization(integration_config$sync_config)

  # Create database security
  security <- create_database_security(integration_config$security_config)

  return(list(
    pool = pool,
    optimization = optimization,
    validation = validation,
    etl = etl,
    sync = sync,
    security = security
  ))
}

This guide provides the complete machinery for implementing database integration for R applications. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise database systems.