FQL for SQL users
This guide outlines major differences between traditional relational databases (RDBs) and Fauna. It also:
-
Maps traditional RDB concepts to Fauna
-
Translates common SQL queries to Fauna Query Language (FQL).
Major differences
The following table outlines major differences between traditional RDBs and Fauna.
Difference | Traditional RDB | Fauna |
---|---|---|
Data model |
Stores data in tables with rows and columns. |
Stores data as JSON documents in collections. |
Schema |
Requires upfront schema definition with a fixed data type for each column. |
Flexible schema model with optional field definitions and constraints. Schema migrations require zero downtime. |
Relationships |
Uses foreign keys and joins to connect data across tables. |
Uses references to create relationships between documents in different collections. |
Query language |
Uses SQL, which relies on various commands. |
Uses FQL, which has a Typescript-like syntax and relies on methods. |
Data definition |
Uses SQL to create databases, create tables, and alter tables. |
Uses Fauna Schema Language (FSL) to define, create, and update collections as schemas. You can manage schemas in the Fauna Dashboard or as |
Concepts
The following table maps common concepts from traditional RDBs to their equivalent in Fauna.
SQL | Fauna | Notes |
---|---|---|
Record / Row |
||
Column |
||
Table |
||
Database |
||
Primary key |
You can mimic some aspects of a primary key using a unique constraint and an index term. See Create a table. |
|
Index / Materialized Views |
Fauna indexes must be named. This encourages better readability and more predictable behavior. |
|
Foreign key |
||
Stored procedure |
||
Transactions |
Examples
The following examples compare basic operations in SQL and Fauna.
The SQL examples use the dept
(departments) and emp
(employees) tables:
SQL> DESC dept
Name Null? Type
----------------------------------------- --------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
ZIP NUMBER
SQL> DESC emp
Name Null? Type
----------------------------------------- --------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
The Fauna examples use the corresponding Dept
and Emp
collections. The
collections use the following schemas:
collection Dept {
deptno: Number
dname: String?
loc: String?
zip: Number?
unique [.deptno]
unique [.dname]
index byDeptNo {
terms [.deptno]
}
index byDeptName {
terms [.dname]
values [.deptno]
}
index sortedByDeptNoLowToHigh {
values [.deptno, .dname, .zip]
}
}
collection Emp {
empno: Number
ename: String?
job: String?
mgr: Number?
hiredate: Date?
sal: Number?
comm: Number?
deptno: Number?
index byDeptNo {
terms [.deptno]
}
index sortedBySalaryLowToHigh {
values [.sal, .deptno]
}
index sortedBySalaryHighToLow {
values [desc(.sal), .deptno]
}
}
Is this article helpful?
Tell Fauna how the article can be improved:
Visit Fauna's forums
or email docs@fauna.com
Thank you for your feedback!