181 lines
4.4 KiB
Markdown
181 lines
4.4 KiB
Markdown

|
|
|
|
# Introduction
|
|
|
|
ZipponDB is a relational database written entirely in Zig from stractch.
|
|
It use a custom query language named ZipponQL or ZiQL for short.
|
|
|
|
The first time you run ZipponDB, it will create a new ZipponDB directory and start the Zippon CLI.
|
|
From here, you can update the schema by running `schema update`, that use `schema.zipponschema` by default.
|
|
|
|
### Why Zippon ?
|
|
|
|
- Open-source and written 100% in Zig with 0 dependency
|
|
- Relational database
|
|
- Small, fast and implementable everywhere
|
|
|
|
# Declare a schema
|
|
|
|
ZipponDB need a schema to work. A schema is a way to define how your data will be store.
|
|
|
|
Compared to SQL, you can see it as a file where you declare all table name, columns name, data type and relationship.
|
|
|
|
But here you declare struct. A struct have a name and members. A member is one data or link and have a type associated. Here a simple example for a user:
|
|
|
|
```
|
|
User (
|
|
name: str,
|
|
email: str,
|
|
best_friend: User,
|
|
)
|
|
```
|
|
|
|
In this example each user have a name and email as a string. But also one best friend as a link.
|
|
|
|
Here a more advance example with multiple struct:
|
|
```
|
|
User {
|
|
name: str,
|
|
email: str,
|
|
friends: []User,
|
|
posts: []Post,
|
|
liked_posts: []Post,
|
|
comments: []Comment,
|
|
liked_coms: []Comment,
|
|
}
|
|
|
|
Post {
|
|
title: str,
|
|
image: str,
|
|
at: date,
|
|
from: User,
|
|
like_by: []User,
|
|
comments: []Comment,
|
|
}
|
|
|
|
Comment {
|
|
content: str,
|
|
at: date,
|
|
from: User,
|
|
like_by: []User,
|
|
of: Post,
|
|
}
|
|
```
|
|
|
|
Can be simplify to take less space but can require more complexe query:
|
|
|
|
```
|
|
User {
|
|
name: str,
|
|
email: str,
|
|
friends: []User,
|
|
posts: []Post,
|
|
comments: []Comment,
|
|
}
|
|
|
|
Post {
|
|
title: str,
|
|
image: str,
|
|
at: date,
|
|
like_by: []User,
|
|
comments: []Comment,
|
|
}
|
|
|
|
Comment {
|
|
content: str,
|
|
at: date,
|
|
like_by: []User,
|
|
}
|
|
```
|
|
|
|
Note: [] are list of value.
|
|
|
|
# ZipponQL
|
|
|
|
Zippon have it's own query language. Here the keys point to remember:
|
|
|
|
- {} Are filters
|
|
- [] Are how much; what data
|
|
- () Are new or updated data (Not already in file); Or to link condition between {}
|
|
- || Are additional options
|
|
- By default all member that are not link are return
|
|
- To return link or just some member, specify them between []
|
|
|
|
## Examples
|
|
| Command | Description |
|
|
| --- | --- |
|
|
| GRAB User | Get all users |
|
|
| GRAB User { name = 'Adrien' } | Get all users named Adrien |
|
|
| GRAB User [1; email] | Get one user's email |
|
|
| GRAB User \| ASCENDING name \| | Get all users ordered by name |
|
|
| GRAB User [name] { age > 10 AND name != 'Adrien' } \| DECENDING age \| | Get just the name of all users that are more than 10 years old and not named Adrien |
|
|
| GRAB User [1] { bestfriend = { name = 'Adrien' } } | Get one user that has a best friend named Adrien |
|
|
| GRAB User [10; friends [1]] { age > 10 } | Get one friend of the 10th user above 10 years old |
|
|
|
|
### Not yet implemented
|
|
| Command | Description |
|
|
| --- | --- |
|
|
| GRAB Message [100; comments [ date ] ] { .writter = { name = 'Adrien' }.bestfriend } | Get the date of 100 comments written by the best friend of a user named Adrien |
|
|
| GRAB User { IN Message { date > '12-01-2014' }.writter } | Get all users that sent a message after the 12th January 2014 |
|
|
| GRAB User { !IN Comment { }.writter } | Get all users that didn't write a comment |
|
|
| GRAB User { IN User { name = 'Adrien' }.friends } | Get all users that are friends with an Adrien |
|
|
| UPDATE User [1] { name = 'Adrien' } => ( email = 'new@email.com' ) | Update a user's email |
|
|
| REMOVE User { id = '000-000' } | Remove a user by ID |
|
|
| ADD User ( name = 'Adrien', email = 'email', age = 40 ) | Add a new user |
|
|
|
|
# Roadmap
|
|
|
|
v 0.1 - Base
|
|
[X] UUID
|
|
[X] CLI
|
|
[X] Tokenizers
|
|
[ ] Schema management
|
|
[ ] File management
|
|
[ ] Loging
|
|
[ ] Base Parser
|
|
|
|
v 0.2 - Usable
|
|
[ ] B-Tree
|
|
[ ] Relationships
|
|
[ ] Date
|
|
[ ] Docker
|
|
|
|
v 0.3 - QoL
|
|
[ ] Schema migration
|
|
[ ] Dump/Bump data
|
|
[ ] Recovery
|
|
|
|
v 0.4 - Usability
|
|
[ ] Server
|
|
[ ] Python interface
|
|
[ ] Go interface
|
|
|
|
v 0.5 - In memory
|
|
[ ] In memory option
|
|
[ ] Cache
|
|
|
|
v 0.6 - Performance
|
|
[ ] Transaction
|
|
[ ] Lock manager
|
|
[ ] Multi threading
|
|
|
|
v 0.7 - Safety
|
|
[ ] Auth
|
|
[ ] Metrics
|
|
|
|
v 0.8 - Advanced
|
|
[ ] Query optimizer
|
|
|
|
v 0.9 - Docs
|
|
[ ] ZiQL tuto
|
|
[ ] Deployment tuto
|
|
[ ] Code docs
|
|
|
|
v 1.0 - Web interface
|
|
[ ] Query builder
|
|
[ ] Tables
|
|
[ ] Schema visualization
|
|
[ ] Dashboard metrics
|
|
|
|
Let's see where it start explode ;)
|