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.