• Open Source
  • Simple to Use
  • Batteries Included

The next generation database

EdgeDB combines the simplicity of a NoSQL database with relational model’s powerful querying, strictness, consistency, and performance.

Download Alpha 1

Why EdgeDB?

EdgeDBNoSQL document DBRelational Database
Low entry barrier++
Efficient and Advanced Queries++
Data Consistency Guarantees+varies+
Built-in schema migration+
GraphQL+
Semi-structured Data++varies

Designed For the Future

EdgeDB is designed to support modern and emerging approaches to building highly reactive and flexible applications.

Thanks to its elegant data model and expressive query language, EdgeDB greatly simplifies working with complex application data.

EdgeQL

EdgeQL is the query language of EdgeDB. It is efficient, intuitive, and easy to learn.

EdgeQL supports fetching object hierarchies with arbitrary level of nesting, filtering, sorting and aggregation.

Plug and Play

EdgeDB supports a high-performance protocol for language bindings, as well as straightforward HTTP and GraphQL APIs.

Fully Introspective

In EdgeDB, schema structure and metadata are accessible in queries, and are intelligently reflected in language bindings.

Schema Migrations

EdgeDB has built-in support for schema migrations. This provides uniform migration experience regardless of the application language or framework.

Robust Architecture

EdgeDB is built on top of PostgreSQL, inheriting all its core strengths: ACID compliance, performance, and reliability.

Showcase

# This is an abstract object containing
# text.
abstract type Text {
  required property body -> str {
    # Maximum length of text is 10000
    # characters.
    constraint max_len_value(10000);
  }
}

type User {
  required property name -> str;
}

abstract type Owned {
  # By default links are optional.
  required link owner -> User;
}

# UniquelyNamed is a an abstract type that
# enforces name uniqueness across all
# instances of its subtype.
abstract type UniquelyNamed {
  required property name -> str {
    delegated constraint exclusive;
  }
}

type Status extending UniquelyNamed;

type Priority extending UniquelyNamed;

# LogEntry is an Owned and a Text,
# so it will have all of their links
# and properties, in particular, the
# "owner" link and the "body" property.
type LogEntry extending Owned, Text {
  required property spent_time -> int64;
}

type Comment extending Text, Owned {
  required link issue -> Issue;
  link parent -> Comment;
}
# issue_num_t is defined as a concrete
# sequence type, used to generate
# sequential issue numbers.
scalar type issue_num_t extending sequence;

type Issue extending Owned, Text {
  required property title -> str;

  required property number -> issue_num_t {
    # The number values are automatically
    # generated, and are not supposed to be
    # directly writable.
    readonly := true;
  }

  property time_estimate -> int64;

  property start_date -> datetime {
    # The default value of start_date will be a
    # result of the EdgeQL expression above.
    default := (SELECT datetime_current());
  }

  property due_date -> datetime;

  required link status -> Status;

  link priority -> Priority;

  # The watchers link is mapped to User
  # type in many-to-many relation.
  multi link watchers -> User;

  multi link time_spent_log -> LogEntry {
    # Exclusive multi-link represents
    # a one-to-many relation.
    constraint exclusive;
  }

  multi link related_to -> Issue;
}