SurrealDB: Version 1.0 Just Released! Next Gen SQL Database?
Tags: web, news
Published: 2024-02-07 08:40:04

## 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

<table>

  <thead>

    <tr>

      <th>id</th>

      <th>price</th>

    </tr>

  </thead>

  <tbody>

    <tr>

      <td>1</td>

      <td>1.7</td>

    </tr>

    <tr>

      <td>2</td>

      <td>1.5</td>

    </tr>

    <tr>

      <td>3</td>

      <td>22.99</td>

    </tr>

  </tbody>

</table>



fruit_box

<table>

  <thead>

    <tr>

      <th>id</th>

      <th>fruit</th>

      <th>quantity</th>

    </tr>

  </thead>

  <tbody>

    <tr>

      <td>1</td>

      <td>Apple</td>

      <td>5</td>

    </tr>

    <tr>

      <td>2</td>

      <td>Orange</td>

      <td>3</td>

    </tr>

    <tr>

      <td>3</td>

      <td>Durian</td>

      <td>1000</td>

    </tr>

  </tbody>

</table>



```sql
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 the _fruit_box_ table.
- The third query combines data from both the _fruit_box _and_ price_list_ tables, showing the fruit names and their associated prices where there is a matching **id** 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.

```json
db={
	"fruit_box": [
		{
			"_id": 1,
			"fruit": "Apple",
			"quantity": 5
		},
		{
			"_id": 2,
			"fruit": "Orange",
			"quantity": 3
		},
		{
			"_id": 3,
			"fruit": "Durian",
			"quantity": 1000
		},
	]
}
```

```json
"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;
```