# Schema

In ZipponDB, you use structures, or structs for short, and not tables to organize how your data is stored and manipulated. A struct has a name like `User` and members like `name` and `age`.

## Create a Schema

ZipponDB use a seperate file to declare all structs to use in the database.

Here an example of a file:
```lua
User (
    name: str,
    email: str,
    best_friend: User,
)
```

Note that `best_friend` is a link to another `User`.

Here is a more advanced example with multiple structs:
```lua
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: `[]` before the type means an array of this type.***

## Migration to a new schema - Not yet implemented

In the future, you will be able to update the schema, such as adding a new member to a struct, and update the database. For the moment, you can't change the schema once it's initialized.

## Commands

`schema init path/to/schema.file`: Init the database using a schema file.

`schema describe`: Print the schema use by the currently selected database.
