Relational, analytical, time-series, vector, graph, and embedded database experiments for learning.
Last verified: 2026-06-21
If DuckDB or the Python DuckDB module is missing locally, enter the Nix shell:
nix developStart with a Dockerless SQLite workload lab before moving the same workload to DuckDB, Kuzu, LanceDB, InfluxDB, or Neo4j:
python3 projects/sqlite-workload-lab/app.py
python3 projects/sqlite-workload-lab/test_app.pyDuckDB analytics:
python3 projects/duckdb-analytics-lab/check_duckdb.py
uv run --with duckdb python projects/duckdb-analytics-lab/app.pySQLite stays as the always-available baseline; DuckDB is the first named analytical database hands-on.
Time-series, vector, and graph concepts without Docker:
python3 projects/multimodel-db-lab/app.py
python3 projects/multimodel-db-lab/test_app.pyUse this before moving the same ideas to InfluxDB, LanceDB/Chroma, Kuzu, or Neo4j.
Application repos should not become database catalogs. This repo keeps database experiments small, comparable, and runnable.
The rule is:
- prefer no-Docker embedded examples first
- use local files and generated sample data
- add server databases only when their real behavior matters
- document when a lightweight substitute is acceptable and when it is misleading
This repo is for choosing and understanding data stores by workload.
Every example should identify:
- write pattern
- read/query pattern
- indexing strategy
- data volume assumption
- local development setup
- backup/export story
- where the database is a good fit
- where it becomes the wrong tool
- SQL basics with H2 and SQLite-style embedded databases
- Analytical SQL with DuckDB
- Time-series modeling with DuckDB first, then InfluxDB 3 Core
- Vector search with LanceDB and Chroma
- Graph modeling with Kuzu first, then Neo4j
- Search and hybrid retrieval
- Choosing the right database for an app
- Backup, migration, indexing, and operational tradeoffs
examples/
relational-h2/
analytics-duckdb/
timeseries-duckdb/
timeseries-influxdb3/
vector-lancedb/
vector-chroma/
graph-kuzu/
graph-neo4j/
search-sqlite-fts/
docs/
2026-learning-items.md
database-selection.md
dockerless-strategy.md
repository-profile.md
timeseries-vector-graph-notes.md
Good default experiments:
- H2 for embedded relational Java tests
- DuckDB for local analytical SQL and time-series-shaped data
- LanceDB for embedded vector search
- Chroma for local vector retrieval experiments
- Kuzu for embedded graph/Cypher experiments, with a maintenance warning
Optional server experiments:
- InfluxDB 3 Core for real time-series ingest/query behavior
- Neo4j for production-style graph database behavior, Cypher tooling, vector indexes, and graph data science
- model the same small dataset in two stores
- write equivalent ingest and query examples
- measure readability before measuring speed
- document what each store makes easy
- document what each store hides or makes operationally expensive
- app-specific persistence code belongs in
learning-backend-ddd - retrieval application logic belongs in
learning-ai-python - MQTT/device ingestion examples can start in
learning-embedded-iotand land here when the storage comparison is the point - deployment and backup runbooks belong in
learning-platform-engineering
- Add DuckDB analytics and time-series-shaped examples with generated data.
- Add H2 as a Java integration-test fixture.
- Add LanceDB and Chroma examples with the same toy document set.
- Add Kuzu first, then Neo4j, for graph comparison.
- Add InfluxDB 3 Core only where server time-series behavior matters.
- DuckDB documentation: https://duckdb.org/docs/current/
- InfluxDB 3 Core documentation: https://docs.influxdata.com/influxdb3/core/
- LanceDB documentation: https://docs.lancedb.com/
- Chroma documentation: https://docs.trychroma.com/
- Neo4j documentation: https://neo4j.com/docs/
- Kuzu repository: https://github.com/kuzudb/kuzu
- H2 Database: https://www.h2database.com/html/main.html
0BSD. You can use, copy, modify, and distribute this project for almost any purpose.