SurrealDB: Version 1.0 Just Released! Next Gen SQL Database?
Introducing the Future of Database Management: Version 1.0 Just Released! π Is this the Next Gen SQL Database You've Been Waiting For? π
Explaining why SurrealDB through historical context
First, let's delve into why SurrealDB stands out in contrast to widely-used databases.
From physical paper to digital paper
- Relational (Table): SQL
- Document: NoSQL
- Graph
Relational databases π
SQL is like a puzzle. You plan, create, and assemble pieces to get your answer, often requiring multiple pieces for each solution.
price_list
id | price |
---|---|
1 | 1.7 |
2 | 1.5 |
3 | 22.99 |
fruit_box
id | fruit | quantity |
---|---|---|
1 | Apple | 5 |
2 | Orange | 3 |
3 | Durian | 1000 |
select * from fruit_box
select fruit from fruit_box
select fruit, price from fruit_box fb
inner join price_list pl on fb.id=pl.id
- The first query retrieves all data from the
fruit_box
table. - The second query retrieves only the
fruit
column from thefruit_box
table. - The third query combines data from both the
fruit_box
andprice_list
tables, showing the fruit names and their associated prices where there is a matchingid
in both tables.
SQL is like a puzzle. You plan, create, and assemble pieces to get your answer, often requiring multiple pieces for each solution.
Document π
I prefer a straightforward approach. Instead of solving a puzzle each time, I'd rather create a comprehensive document with all the needed information. Then, I can simply read that document to find the answers I seek.
db={
"fruit_box": [
{
"_id": 1,
"fruit": "Apple",
"quantity": 5
},
{
"_id": 2,
"fruit": "Orange",
"quantity": 3
},
{
"_id": 3,
"fruit": "Durian",
"quantity": 1000
},
]
}
"price_list": [
{
"_id": 1,
"price": 1.7,
},
{
"_id": 2,
"price": 1.5,
},
{
"_id": 3,
"price": 22.99,
},
]
db.fruit_box.find()
db.fruit_box.find({}, {fruit: 1, _id: 0})
db.fruit_box.aggregate([{
"$lookup": {
"from": "price_list",
"localField": "_id",
"foreignField": "_id",
"as": "Result"
}
}])
Graph πΈοΈ
Similar to a social network, you map out who knows what and how they're connected. Then, you navigate through the network, asking until you find what you need.
(1:fruit_box {fruit:"Apple",quantity:5})
(2:fruit_box {fruit:"Orange",quantity:3})
(3:fruit_box {fruit:"Durian",quantity:1000})
(1:price_list {price:1.7})
(2:price_list {price:1.5})
(3:price_list {price:22.99})
match (f:fruit_box)
return f
match (f:fruit_box)
return f.fruit
match (f:fruit_box)-[:lookup]->(p:price_list)
return f.fruit, p.price
NewSQL - SurrealQL
select fruit,
->lookup->price_list.price as price
from fruit_box
SurrealQL simplifies the complexity, particularly regarding table relationships. Additionally, if you insert data into a non-existent table, SurrealDB will generate the table automatically.
Nice Features and small size
SurrealDB offers a wealth of features, and its version 1.0.0 Docker image is exceptionally compact at just 17.5 MB, thanks to its Rust-based architecture. In comparison, Postgresql's image size exceeds 80 MB.
When using SurrealDB within a web browser, the WebAssembly library provides support for connecting to a remote database via HTTP or WebSockets. It also allows for data persistence using IndexedDB in the browser. You have the flexibility to choose between a schemafull or schemaless approach. You can store unstructured nested data with any columns or selectively limit data storage to specific columns or fields. This means you can start quickly without the need to define every column and transition to a schema-full approach once your data model is established.
Oh and did I mention in SurrealQL, comments can be written in a number of different ways.
/* In SurrealQL, comments can be written as single-line or multi-line comments,
and comments can be used and interspersed within statements. */
SELECT * FROM /* get all users */ user;
# There are a number of ways to use single-line comments
SELECT * FROM user;
// Alternatively using two forward-slash characters
SELECT * FROM user;
-- Another way is to use two dash characters
SELECT * FROM user;
Top comments (0)