● Base de datos de la plataforma Sofía

SofiaDB

Base de datos SQL embebida, hecha en casa. Cada app recibe su propia base privada, las transacciones son serializables y lo confirmado sobrevive a un corte de luz.

Qué es

Un archivo y su diario

Páginas de 8 KiB con suma de verificación y un diario de escritura previa (WAL). Lo confirmado está en disco antes de responder.

Serializable con reintento

Varios escritores a la vez sobre instantáneas (MVCC). Si dos transacciones chocan, una gana y el bloque transaccion { } de la otra se repite solo.

Privada por app

Una app que declara permiso datos recibe una base que ninguna otra app puede abrir. Los valores viajan siempre como parámetros: la inyección SQL no compila.

Copias y cifrado

Copia en caliente sin detener a nadie, cifrado por página y rotación de claves desde la consola con sofia datos.

Cómo se usa

Una reserva que no admite dos citas a la misma hora: todo el bloque se confirma junto o no se confirma nada.

permiso datos

fn reservar(prof: texto, hora: entero) -> texto {
    var r = "RESERVADA"
    intentar {
        transaccion {
            let choca = datos.entero($"SELECT count(*) FROM cita WHERE profesional = {prof} AND inicio = {hora}")
            si choca > 0 { fallar("HORA_OCUPADA") }
            datos.ejecutar($"INSERT INTO cita (profesional, inicio) VALUES ({prof}, {hora})")
        }
    } si falla e {
        r = e
    }
    devolver r
}

Lo medido

Pruebas de resistencia y bancos de rendimiento sobre archivos reales con fsync real.

0 perdidas

en 20 cortes forzados

Sobre 78 963 confirmaciones, ninguna se perdió. Recuperación entre 5 y 35 ms.

20 de 20

disputas con un solo ganador

Sesiones que compiten por la misma fila: siempre gana una y solo una.

4 316 318

operaciones en 4 horas

Cero errores y memoria estable: +0,17 % por hora.

46 s / 63 s

respaldo y restauración de 3,9 GB

15,3 millones de filas respaldadas en 46 s y restauradas en 63 s.

15,2 µs

p99 de búsqueda por índice

En una tabla de 1 000 000 de filas, con los datos en caché.

4 515/s

confirmaciones con 8 sesiones

Con confirmación en grupo: varias transacciones comparten un mismo fsync.

50 de 50

copias en caliente sanas

Con 6 sesiones escribiendo durante las copias; el diario no crece.

Documentación