-
Notifications
You must be signed in to change notification settings - Fork 50
Description
Hi @krotik!
EliasDB looks very promising to become a one-stop GraphQL-DB solution.
However, I think there are some points that could increase the current experience tremendously:
1. Better GraphQL API
For this, you might want to look at how Dgraph handles their GraphQL API.
The API should hide as much backend/query knowledge from the frontend-user as possible. Currently, when using GraphQL, the frontend developer has to have domain knowledge on eliasdb specific syntax like traversal arguments.
Most clients do not care about such power. They want to do the following:
- Filter by fields
- Order by fields
- Paginate
Thats pretty much all IMHO. More complex operations could of course be still available, but maybe optional.
Example GraphQL query:
query {
queryDatasets(filter: {owner: {in: ["Alice", "Bob"]}}) { // get all datasets whos owner is either alice or bob
owner
name
images(filter: {extension: {eq: "jpg"} }, first: 1) { // retrieve only the first jpg image of these datasets
filename
thumbnail
metadata(order: {asc: key}) { // order metadata alphabetically by their keys
key
value
}
}
}
}
The above query is 100% human readable and the client does not need to care about how the underlying DB traverses the graph.
2. Interface/Union Support
Interfaces and Unions are defined on the GraphQL standard. They are important as they reduce query complexity and boilerplate.
Example Query:
query {
queryFoldersOrFile {
name
... on File {
extension
}
... on Folder {
childs {
__typename
}
}
}
}
3. Bonus Points: Create Database From GraphQL Schema:
Again, this example comes from how dgraph handle things.
Given a GraphQL type schema, eliasdb could bootstrap its whole CRUD-API:
interface UUID {
id: String! @id //ids are automatically searchable
}
interface Timestamped {
createdAt: DateTime! @default(add: "now") //default values for different CRUD Actions
updatedAt: DateTime! @default(add: "now", update: "now")
}
interface Ownable {
owner: String!
}
type Dataset implements UUID & Timestamped & Ownable {
name: String! @index // build indices for search
images: [Image!]! @hasInverse(field: dataset, cascadeDelete: true) // type image has an inverse edge to Dataset, delete all images when a dataset is deleted
}
type Image implements UUID & Timestamped & Ownable {
filename: String! @index
extension: String! @index
dataset: Dataset! // inverse edge to dataset type required
}
Using the above Info you could completely bootstrap and layout an EliasDB instance and generate a GraphQL CRUD API as described as in 1.
Why not use Dgraph after all? Good Question. Here are the answers:
- Partially Licensed / not Open-Source
- Discontinued / Development has stalled
- Linux Only
- huuuuge Memory requirements
- Missing a lot of features that will not be developed because its discontinued.
But, Dgraph has made a lot of things right and was very close in becoming the GraphQL-DB no-code solution. So we could borrow a lot of concepts to make EliasDB better in that regard.
Happy to hear your thoughts about this!