WooriDB

WooriDB is a general-purpose, experimental time series database that indexes all entities' registries by DateTime. It is schemaless, key-value storage that uses its own query syntax, which is similar to SparQL and Crux's Datalog.

Key Features

Experimental Time Series Database

  • Indexed by DateTime: All entity registries are indexed by DateTime, making it highly suitable for time series data.
  • Schemaless and Key-Value Storage: Allows for flexible data modeling without the constraints of predefined schemas.

Unique Query Syntax

  • Custom Query Language: Uses a query syntax similar to SparQL and Crux's Datalog, providing powerful querying capabilities.
  • RON and JSON Support: By default, responses are in RON format, with optional JSON support via features.

Advanced Features

  • Hashing and Encryption: Supports hashing keys with the ENCRYPT keyword and checking hashed values with the CHECK keyword.
  • Entity Indexing: Entities are indexed by entity_name (Entity Tree), DateTime (Time Serial), and Uuid (Entity ID), allowing efficient data retrieval.
  • Large Number Handling: Can handle very large numbers using the P suffix, providing precise float representations.
  • Persistent Local Storage: Stores data persistently on local storage, with future plans for S3, Postgres, and DynamoDB support.

Security and Configuration

  • Authentication and Authorization: Uses session tokens for secure access control.
  • Environment Variable Configuration: Allows configuration via environment variables for flexibility and ease of deployment.

Community and Culture

The name Woori means "our" in Korean, reflecting the collaborative and community-driven nature of the project. Although initially developed by a single individual, the database is designed to be a collective effort, benefiting and supported by the community.

Inspirations

WooriDB is inspired by several notable projects and concepts:

Performance Benchmarks

Current Benchmarks

Tested on 2.3 GHz Intel Core i9 8-Core, 32 GB 2667 MHz DDR4

  • Entity Operations:
    • Create entity: 4.7 ms
    • Insert entity: 12.9 ms
    • Update set entity: 15.1 ms
    • Update content entity: 15.1 ms
    • Delete entity: 5.4 ms
    • Evict entity ID: 15.6 ms
    • Evict entity: 12.4 ms
  • Query Operations:
    • Select all (20 entities): 6.5 ms
    • Select all (10 entities): 6.0 ms
    • Select all (1 entity): 5.1 ms
    • History (10 registries): 5.5 ms
    • History (20 registries): 6.1 ms

WQL Performance

  • Create entity: 435 ns
  • Insert entity: 1.64 µs
  • Select all: 431 ns
  • Select with arguments: 657 ns

File Size

For approximately 10,000 entries per day, the file size is estimated to be 2.5 GB, which can be compressed to about 10% of this size.

Load Testing with Artillery.io

  • Insert:
    • Configured to handle 10 requests per second over 100 seconds.
  • Select:
    • Tested with 1,000 registries to measure response times.

Similar Projects