• 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.

Why EdgeDB?

EdgeDBNoSQL document DBRelational Database
Low entry barrier++
Efficient and Advanced Queries++
Data Consistency Guarantees+varies+
Built-in schema migration+
GraphQL & data frameworks+
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 and GraphQL

EdgeQL is the default language of EdgeDB. Conceptually it is a superset of GraphQL, which is supported directly as well.

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

Plug and Play

EdgeDB supports a high-performance protocol for language bindings, as well as a straightforward REST API.

Out of the box, EdgeDB provides excellent ORM-level bindings for Python and JavaScript. Both support coroutines and asynchronous code.

Fully Introspective

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

This enables rich metaprogramming capabilities, greatly assisting in building user interfaces.

Schema Evolution

EdgeDB treats data schema changes as a version control issue. Changes automatically generate formal diffs.

The integrity of schema state is thoroughly validated, and revisions are signed with a cryptographic hash.

Robust Architecture

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

Showcase

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

type User extending Named
# Named is a standard abstract base
# type, that provides a name link.

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

type Status extending Dictionary
# Dictionary is a subtype of Named from
# the standard library that enforces name
# uniqueness across all instances of its
# subtype.

type Priority extending Dictionary

type LogEntry extending Owned, Text:
  # 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.
  required property spent_time -> int

scalar type issue_num_t extending sequence
# issue_num_t is defined as a concrete
# sequence type, used to generate
# sequential issue numbers.

type Comment extending Text, Owned:
  required link issue -> Issue
  link parent -> Comment
type Issue extending Named, Owned, Text:

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

  property time_estimate -> int

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

  property due_date -> datetime

  required link status -> Status

  link priority -> Priority

  link watchers User:
    cardinality := '**'
    # The watchers link is mapped to User
    # type in many-to-many relation.
    # The default cardinality is *1 -- many-to-one.

  link time_spent_log -> LogEntry:
    cardinality := '1*'
    # 1* -- one-to-many cardinality.

  link related_to -> Issue:
    cardinality := '**'