# EZ DB

This package provides simple interfaces for working with basic key-value document storage in your Go application.

## System requirements

- [Go v1.21](https://go.dev/dl/)

## Basic usage

The primary interface in EZ DB is `Collection[T]` which reflects a single key-value store. This is analogous to tables in RDBMS, collections in NoSQL databases etc.

Collections use a generic type `T` to specify the document type. You can use this to enforce a document schema. This example creates a collection which only accepts `Student` documents:

```go
package main

import "github.com/annybs/ezdb"

type Student struct {
	Name string
	Age int
}

var db = ezdb.Memory[Student](nil)

func main() {
	db.Open()
	db.Put("annie", Student{Name: "Annie", Age: "32"})
	db.Close()
}
```

## Marshaling data

Some database backends require marshaling and unmarshaling data. The `DocumentMarshaler[T1, T2]` interface allows you to use whatever marshaler suits your needs or the requirements of your chosen database.

The following marshalers are included in EZ DB:

- `JSON[T]` marshals your data `T` to `[]byte` using [encoding/json](https://pkg.go.dev/encoding/json)

## Supported databases

The following databases are included in EZ DB:

- `LevelDB[T]` is [fast key-value storage](https://github.com/google/leveldb) on disk
- `Memory[T]` is essentially a wrapper for `map[string]T`. It can be provided another Collection to use as a persistence backend

## Limitations

EZ DB is intended for simple document storage and can work with any addressable data represented as `T` in your Go app.

This makes it unsuited for working with unaddressable types, such as byte arrays, particularly when a document marshaler is involved.

If you want more control beyond what EZ DB offers, it's best to just use the appropriate database software and connector for your needs.

## License

See [LICENSE.md](./LICENSE.md)