Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

Problem Software development is hard

Slide 3

Slide 3 text

Hm…but maybe Databases are hard?

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Forever in the 70s Install Connect SQL vs. ORM

Slide 6

Slide 6 text

SELECT title, Actors.name AS actor_name, (SELECT avg(score) FROM Movie_Reviews WHERE movie_id = Movie.id) AS rating FROM Movie LEFT JOIN Movie_Actors ON Movie.id = Movie_Actors.movie_id LEFT JOIN Person AS Actors ON Movie_Actors.person_id = Person.id WHERE 'Zendaya' IN ( SELECT Person.name FROM Movie_Actors INNER JOIN Person ON Movie_Actors.person_id = Person.id WHERE Movie_Actors.movie_id = Movie.id)

Slide 7

Slide 7 text

SELECT title, Actors.name AS actor_name, (SELECT avg(score) FROM Movie_Reviews WHERE movie_id = Movie.id) AS rating FROM Movie LEFT JOIN Movie_Actors ON Movie.id = Movie_Actors.movie_id LEFT JOIN Person AS Actors ON Movie_Actors.person_id = Person.id WHERE 'Zendaya' IN ( SELECT Person.name FROM Movie_Actors INNER JOIN Person ON Movie_Actors.person_id = Person.id WHERE Movie_Actors.movie_id = Movie.id) select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name; select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name;

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

“Stockholm syndrome” was fi rst used by the media in 1973 when four hostages were taken during a bank robbery in Stockholm, Sweden. The hostages defended their captors after being released and would not agree to testify in court against them.

Slide 10

Slide 10 text

“Async” Python Core Dev Yury Selivanov

Slide 11

Slide 11 text

uvloop & asyncpg

Slide 12

Slide 12 text

Co-founder and CEO EdgeDB

Slide 13

Slide 13 text

Make you want to learn
 about EdgeDB Goal

Slide 14

Slide 14 text

EdgeDB Install & deploy Data model Schema Query language Client APIs

Slide 15

Slide 15 text

$ curl 
 ––proto '=https' ––tlsv1.2 –sSf 
 https://sh.edgedb.com | sh A FEW SECONDS LATER $ edgedb ––help Install

Slide 16

Slide 16 text

Python Design principles Flexibility Expressiveness

Slide 17

Slide 17 text

EdgeDB Design principles Flexibility Expressiveness

Slide 18

Slide 18 text

EdgeDB A “Pythonic”
 database

Slide 19

Slide 19 text

Data model

Slide 20

Slide 20 text

Data model

Slide 21

Slide 21 text

Data model

Slide 22

Slide 22 text

Data model

Slide 23

Slide 23 text

Data model

Slide 24

Slide 24 text

Data model

Slide 25

Slide 25 text

Schema

Slide 26

Slide 26 text

Schema

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

😨

Slide 32

Slide 32 text

Schema

Slide 33

Slide 33 text

Schema

Slide 34

Slide 34 text

Schema Strict First-class Indexes, constraints,
 annotations, introspection

Slide 35

Slide 35 text

Query language SELECT title, Actors.name AS actor_name, (SELECT avg(score) FROM Movie_Reviews WHERE movie_id = Movie.id) AS rating FROM Movie LEFT JOIN Movie_Actors ON Movie.id = Movie_Actors.movie_id LEFT JOIN Person AS Actors ON Movie_Actors.person_id = Person.id WHERE 'Zendaya' IN ( SELECT Person.name FROM Movie_Actors INNER JOIN Person ON Movie_Actors.person_id = Person.id WHERE Movie_Actors.movie_id = Movie.id) select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name; select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name;

Slide 36

Slide 36 text

select Movie { title } SELECT title FROM Movie EdgeQL SQL 36 Query Example

Slide 37

Slide 37 text

select Movie { title, actors: { name }, } SELECT title FROM Movie EdgeQL SQL 37 Query Example

Slide 38

Slide 38 text

select Movie { title, actors: { name }, } SELECT title, Actors.name AS actor_name FROM Movie LEFT JOIN Movie_Actors ON Movie.id = Movie_Actors.movie_id LEFT JOIN Person AS Actors ON Movie_Actors.person_id = Person.id EdgeQL SQL 38 [ { "title": "The Matrix", "actors": [ {"name": "Keanu Reeves"}, {"name": "Hugo Weaving"}, ] } ] [ { "title": "The Matrix", "actor_name": "Keanu Reeves", }, { "title": "The Matrix", "actor_name": "Hugo Weaving", }, ... ] Query Example

Slide 39

Slide 39 text

select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } SELECT title, Actors.name AS actor_name FROM Movie LEFT JOIN Movie_Actors ON Movie.id = Movie_Actors.movie_id LEFT JOIN Person AS Actors ON Movie_Actors.person_id = Person.id EdgeQL SQL 39 Query Example

Slide 40

Slide 40 text

select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } SELECT title, Actors.name AS actor_name, (SELECT avg(score) FROM Movie_Reviews WHERE movie_id = Movie.id) AS rating FROM Movie LEFT JOIN Movie_Actors ON Movie.id = Movie_Actors.movie_id LEFT JOIN Person AS Actors ON Movie_Actors.person_id = Person.id EdgeQL SQL 40 Query Example

Slide 41

Slide 41 text

select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name EdgeQL SQL 41 SELECT title, Actors.name AS actor_name, (SELECT avg(score) FROM Movie_Reviews WHERE movie_id = Movie.id) AS rating FROM Movie LEFT JOIN Movie_Actors ON Movie.id = Movie_Actors.movie_id LEFT JOIN Person AS Actors ON Movie_Actors.person_id = Person.id Query Example

Slide 42

Slide 42 text

select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name SELECT title, Actors.name AS actor_name, (SELECT avg(score) FROM Movie_Reviews WHERE movie_id = Movie.id) AS rating FROM Movie LEFT JOIN Movie_Actors ON Movie.id = Movie_Actors.movie_id LEFT JOIN Person AS Actors ON Movie_Actors.person_id = Person.id WHERE 'Zendaya' IN ( SELECT Person.name FROM Movie_Actors INNER JOIN Person ON Movie_Actors.person_id = person.id 
 WHERE Movie_Actors.movie_id = Movie.id ) EdgeQL SQL 42 Query Example

Slide 43

Slide 43 text

EdgeQL SQL 43 select Movie { title, actors: { name } order by @credits_order limit 5, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name SELECT title, Actors.name AS actor_name, (SELECT avg(score) FROM Movie_Reviews WHERE movie_id = Movie.id) AS rating FROM Movie LEFT JOIN Movie_Actors ON Movie.id = Movie_Actors.movie_id LEFT JOIN Person AS Actors ON Movie_Actors.person_id = Person.id WHERE 'Zendaya' IN ( SELECT Person.name FROM Movie_Actors INNER JOIN Person ON Movie_Actors.person_id = person.id 
 WHERE Movie_Actors.movie_id = Movie.id ) Query Example

Slide 44

Slide 44 text

SELECT title, Actors.name AS actor_name, (SELECT avg(score) FROM Movie_Reviews WHERE movie_id = Movie.id) AS rating FROM Movie CROSS JOIN LATERAL ( SELECT name FROM Movie_Actors INNER JOIN Person ON Movie_Actors.person_id = Person.id WHERE Movie_Actors.movie_id = Movie.id ORDER BY Movie_Actors.credits_order FETCH FIRST 5 ROWS ONLY ) AS Actors WHERE 'Zendaya' IN ( SELECT Person.name FROM Movie_Actors INNER JOIN Person ON Movie_Actors.person_id = person.id WHERE Movie_Actors.movie_id = Movie.id ) EdgeQL SQL 44 select Movie { title, actors: { name } order by @credits_order limit 5, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name Query Example

Slide 45

Slide 45 text

EdgeQL with movie_actor_names := {"Robert Downey Jr.", "Chris Evans"}, actors := (select Person filter .name in movie_actor_names), avengers := (insert Movie { title := "Avengers", actors := actors }), endgame := (insert Movie { title := "Avengers: Endgame", actors := actors }), account := (select Account filter .login = $login) update 
 account 
 set { 
 watch_list += {avengers, endgame} 
 }

Slide 46

Slide 46 text

EdgeQL Strict Composable Easy to pick up GraphQL+SQL on steroids

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

Client APIs select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name; Fast Safe Zero-con fi g Easy Async or Sync

Slide 49

Slide 49 text

Client APIs

Slide 50

Slide 50 text

Client APIs

Slide 51

Slide 51 text

Client APIs

Slide 52

Slide 52 text

Client APIs

Slide 53

Slide 53 text

WHY select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name; So that you write
 fast code fast
 while having 
 fun.

Slide 54

Slide 54 text

select Movie { title, actors: { name }, rating := math::mean(.reviews.score) } filter "Zendaya" in .actors.name; @1st1 on twitter edgedb.com We are hiring.