https://qiita.com/iisaka51/items/45f23df873ea5be433c7
@iisaka51 (Goichi (Iisaka) Yukawa)
Rost
Datenbank
RocksDB
TiKV
surrealdb
Zuletzt aktualisiert am 15. Mai 2023
Eingestellt am 21. Januar 2023
Einleitung.
Dieses Dokument ist eine Zusammenfassung der SurrealDB, die im Juli 2022 veröffentlicht wurde.
Geschichte von SurrealDB
Sie befindet sich seit 2016 in der Entwicklung, obwohl sie erst seit kurzer Zeit öffentlich verfügbar ist
Feb 2016 Beginn der Entwicklung in GoLang
2017 Jul Beginn des Betriebs als SaaS-Backend-DB
2021 Okt. Entscheidung zur Veröffentlichung als Open Source, Neuentwicklung in Rust
2022 Jul Beta.1 veröffentlicht
2022 Aug Beta.5 veröffentlicht
2022 Okt Beta.8 veröffentlicht
SurrealDB Inc.
Nov 2021 SurrealDB Ltd. wird in London gegründet
Jan 2023 6 Millionen Dollar für DBaaS gesammelt
Hintergrund zu SurrealDB
Wichtige Trends
Datenbankabstraktion, Cloud, Serverless
Immer mehr Unternehmen setzen auf DBaaS
Laut einer Umfrage von MariaDB haben 61 % der Entwickler/Betreiber eine vollständige > Migration zu DBaaS abgeschlossen oder sind dabei, sie abzuschließen.
Wachsende Marktgröße von DBaaS
bis 2025 auf 24,8 Milliarden Dollar
Reichhaltiges Investitionsklima für DBaaS
SingleStore erhält 30 Mio. $ (2022/Okt.)
EdgeDB sammelt 15 Millionen Dollar ein (2022/Nov)
SurrealDB sammelt 6 Millionen Dollar ein (Jan 2023)
SurrealDBs Profil
Hacke's News Titelseite
Nr. 4 2022/Aug
Nr. 2 2022/Sep
Platzierung in GitHub Featured Repositories
2022/Aug
2022/Dez
GitHub-Stern
Von 180 Sternen auf 1500 Sterne in 48 Stunden
5.000 Sterne innerhalb von 3 Wochen nach der Veröffentlichung
10.000 Sterne innerhalb von 4 Wochen nach der Veröffentlichung
Nr. 1 auf der Hot List von Reddit für die Bereiche Proggrammierung und Rust
SurrealDB-Lizenz
Der SurrealDB-Quellcode steht unter der Business Software License 1.1
Das SDK und die Bibliotheken/Treiber stehen unter MIT
SurrealDB BSL erlaubt es Ihnen, SurrealDB auf einer unbegrenzten Anzahl von Knoten zu verwenden, solange Sie es nicht als kommerzielle DBaaS anbieten.
Kann in Produkte eingebettet werden
SurrealDB BSL ist für 4 Jahre gültig
Am 1. Januar 2026 läuft diese Beschränkung aus und der Code wird Open Source unter der aktuellen Apache License 2.0
Frei zur Nutzung für jeden Zweck
SurrealDB Eigenschaften
Implementiert in Rust
Widerstandsfähig gegen Segmentierungsfehler
Kreuzkompiliert
Relativ schnell im Vergleich zu anderen Sprachen
Geringes Gewicht: Binärgröße Linux 24MB, macOS: 44MB
Server und REPL-Client in einer Binärdatei
Einfache Installation
Unterstützt HTTP/Restful APIs
Unterstützt WebSockets
Backend-DBs: EchoDB, RocksDB, TiKV, FoundationDB, IndexedDB
Eigenschaften als Datenbank
Schema-los: kein Problem, ein Schema zu definieren
Verschiedene Speicherformate: Tabellen, Dokumente, Graphen, etc.
ACID-Transaktionen mit mehreren Zeilen und mehreren Tabellen
Record Link und gerichtete Graphenverbindungen
Kein JOIN erforderlich, intelligente Umgehung des N+1-Problems
Vordefinierte Analyseabfragen
Auswählen, Aggregieren, Gruppieren und Ordnen von Daten, wie sie geschrieben werden
Abfragen können mit eingebettetem JavaScript erweitert werden
Kann reguläre Ausdrücke in Abfragen schreiben (/regex/)
Unterstützt GeoJSON
Kann CRUD-Operationen parallel durchführen
SurrealDB Stärken
Differenzierende Funktionen zur gleichen Zeit
Benutzer können direkt über das Frontend darauf zugreifen
Die Datenbank kann für die Authentifizierung und Autorisierung richtig konfiguriert werden
Datensynchronisation in Echtzeit
Wenige Konkurrenten, wie z. B. Google Firestore
Einzigartige DB bei Verwendung vor Ort
Authentifizierung und Autorisierung auf der Datenbankseite...
Kann rollenbasierte Zugriffskontrolle bieten
Zugriffskontrolle basierend auf definierten Rollen wie Administrator, Redakteur, Betrachter, etc.
Schwachstellen von SurrealDB
Noch nicht veröffentlicht (Juli 2022).
Potenzielle Sicherheitslücken und Bugs können vorhanden sein
PostgreSQL wurde erstmals 1997 veröffentlicht, der Vorgänger Postgress 1989)
Die erste Ausgabe von MySQL wurde 1995 veröffentlicht.
MariaDB wurde erstmals 2009 veröffentlicht
MongoDB wurde erstmals 2009 veröffentlicht
Es sind nur wenige Informationen verfügbar.
Offizielle Dokumentation ist in Produktion
Im Zweifelsfall sollten Sie den Quellcode lesen
Nicht alle Funktionen sind implementiert worden
SurrealDB ist derzeit nicht profitabel: der DBaaS-Service wird 2023 verfügbar sein
Derzeit in Entwicklung befindliche Funktionen (in beta.9 noch unvollständig)
Multi-Node-Unterstützung im verteilten Modus
Replikation
Gesundheitsprüfungen
GraphQL
FULLTEXT - Volltext-Indizierung
LEARN-Felder
Automatische Konfiguration auf der Grundlage einer maschinellen Lernanalyse der angegebenen Felder
Versionierte temporäre Tabellen
Kann bei der Referenzierung von Daten 'in der Zeit zurückgehen
IDE-Code-Hervorhebung (Atom, VSCode, Vim...)
Die Freigabe der User I/F App ist als 1.x geplant
SurrealDB 2-Tier Architektur Übersicht
surrealdb_arch.png
SurrealDB Betriebsübersicht
surrealdb_dataflow.png
Quellcode.
Die Zahlen geben die Anzahl der Zeilen einschließlich der Kommentare an (SurrealDB 1.0.0-beta.8).
MariaDB 10.9 hat übrigens über 1,3 Millionen Zeilen (über 12.000 Zeilen allein für den Client).
|-- src // API-Schicht 4172
|-- net 1981
|-- cli 895
|-- rpc 174
...
|-- lib/src // BL-Schicht 32261
|-- sql 19030
|-- fnc 3524
...
|-- kvs 3286
|-- indexdb 220
|-- rocksdb 316
|-- tikv 269
...
SurrealDB implementiert erstaunlich wenige Funktionen
Verwenden Sie nom für das Parsen von Abfragen
Funktionen können verkettet werden, um Parser inkrementell aufzubauen
Verwendung von echodb für die Speicherung im Speicher (Tobie)
In-Memory KVS DB mit Multiversions-Gleichzeitigkeitskontrolle
Verwendung von storekey zum Speichern in KVS (Tobie)
Binäre Kodierung mit Erhaltung der Wörterbuchreihenfolge
Nützlich für die Erstellung sortierter KVS-Schlüssel
MsgPack und serde zur Serialisierung/Deserialisierung verwenden (rmp-serde)
Geo für GeoJSON-Parsing verwenden
Verwendung von RocksDB zur Verwendung lokaler Dateien als Datenspeicher
Verwendung von TiKV und FoundationDB für verteilte DB-Funktionalität
Elemente, die SurrealDB in KVS speichert
Metadaten
Tabellen, Indizes, Scopes und andere Strukturen
Daten.
Werte von Objekten, die von SurrealDB gehalten werden
Wie SurrealDB in KVS speichert
Map Rust Strukturen und MsgPack mit serde Bindungen
Einsparungen bei der Speichergröße
Effizienz der Serialisierung/Deserialisierung
Zwei Methoden des Zugriffs auf Daten in KVS
Schlüsselbasiert: einen bestimmten Schlüssel angeben und den Wert abrufen (schnell)
Scan: einen Bereich von Schlüsseln angeben und alle Werte abrufen (langsam)
Hierarchische Struktur wird in den Schlüsseln beibehalten
Namespace -> Datenbank -> Tabelle -> ID
SurrealDB konvertiert den hierarchischen Aufbau der Schlüssel in zu scannende Bereiche
Installation (einfach & schnell)
Linux.
$ curl -sSf https://install.surrealdb.com | sh
macOS
$ brew install surrealdb/tap/surreal
Windows.
PS C:\> iwr https://windows.surrealdb.com -useb | iex
Docker/Podmandocker
$ docker run --rm -p 8000:8000 surrealdb/surrealdb:latest start
$ podman run --rm -p 8000:8000 surrealdb/surrealdb:latest start
SurrealDB starten
Das erste Argument des Unterbefehls start ist das Ziel, in das die Daten geschrieben werden sollen.
Standard ist der Speicher
$ surreal start --user root --pass root memory
Andere Exportziele
file:///path/to/data.db Dateisystem (RocksDB)
rocksdb:///pfad/zu/daten.db RocksDB
tikv://endpoiint TiKV TiKV
fdb:[///path/to/clusterfile] FoundationDB (Neuaufbau erforderlich)
STRICT-Modus.
--strict Beginnen Sie mit der Angabe von Optionen.
NAMESPACE,, DATABASE müssen definiert sein oder es tritt ein Fehler auf
Fehler, wenn TABLE nicht definiert ist
Dump/Wiederherstellen
Dump in eine Datei mit dem Unterbefehl export
Wiederherstellen aus einer Datei mit dem Unterbefehl import
$ surreal export --conn http://dev00:8000 --ns test --db test dump.db
$ surreal import --conn http://dev00:8000 --ns test --db test dump.db
Verbindung über den CLI-Client herstellen
Führen Sie den Unterbefehl sql aus
$ surreal sql --conn http://dev00:8000 --ns test --db test --pretty
--user und --pass ROOT-Authentifizierung Benutzer/Passwort
--pretty zur Formatierung und Anzeige der JSON-Ausgabe
--ns NAMESPACE --db anweisen DATABASE
Wenn SurrealDB im STRICT-Modus ausgeführt wird, werden die Optionen -ns und -db ignoriert.
HTTP RESTful API
PATH TYPE Beschreibung.
/key/:table GET Ruft alle Datensätze in einer Tabelle aus einer Datenbank ab.
/key/:table/:id GET Abrufen eines bestimmten Datensatzes aus der Datenbank
/key/:table POST Erstellen eines Datensatzes in einer Tabelle in der Datenbank
/key/:table/:id POST Anlegen eines bestimmten Datensatzes in einer Tabelle in der Datenbank
/key/:table/:table DELETE Löschen aller Datensätze einer Tabelle aus der Datenbank
/key/:table/:id PUT Aktualisiert einen bestimmten Datensatz in der Datenbank
/key/:table/:id PATCH Ändert einen bestimmten Datensatz in der Datenbank
/key/:table/:id DELETE Löscht einen angegebenen Datensatz aus der Datenbank
HTTP RESTful API (Forts.)
PATH TYPE Beschreibung.
/version GET Gibt die SurrealDB-Version zurück
/signup POST Registrierung für die SCOPE-Authentifizierung
/signin POST Anmeldung mit SCOPE-Authentifizierung
/rpc POST Anfrage an WebSocket mit JON-RPC
/sql POST Erlaubt SurQL-Abfragen
/export GET Datenbankinhalte dumpen
/import POST Abfrageinhalte auf die Datenbank anwenden (wiederherstellen)
HTTP RESTful API (unvollständig)
PATH TYPE Beschreibung.
/sync GET Replikation
/health GET Zustandsprüfung der Datenbank
/status GET Rückgabestatus
Tabellendefinitionen in allgemeinem SQL
CREATE TABLE human (
id int, nickname text, nickname
Spitzname text,
Alter int,
PRIMARY KEY(id)
);
SurealDB ist schemaunabhängig
Keine Notwendigkeit, Tabellen oder Felder zu definieren
Beim Hinzufügen von Feldern sind keine Änderungen erforderlich
Wenn der Server im STRICT-Modus gestartet wird, sind zunächst Tabellendefinitionen erforderlich
CREATE human:freddie SET nickname="freddie", age=99 ;
CREATE human:brian SET nickname="brian", age=75, sex=true ;
ID == Tabellenname:UniqID Beachten Sie, dass die ID den Tabellennamen enthält.
Geben Sie den Feldtyp ohne Schema an
CREATE human:freddie SET
nickname = <string> "freddie",.
age = <int> 99 ;
Typen und Konvertierungen
bool, int, float, string, number, decimal, datetime, duration
Datums-/Zeit-Strings werden in ISO 8601 konvertiert: dasselbe gilt für die Umwandlung in <datetime>.
Wenn Sie eine datetime-Zeichenkette wie eine Zeichenkette behandeln wollen, verwenden Sie <string>.
SELECT * FROM "2023-01-01";.
SELECT * FROM <datetime> "2023-01-01";
SELECT * FROM <string> "2023-01-01T02:03:00Z" + "-test";
Schema definieren
DEFINE TABLE human SCHEMAFULL;
DEFINE FIELD nickname ON human TYPE string;
DEFINE FIELD Alter ON human TYPE int;
[re]define table as SCHMALESS
DEFINE TABLE human SCHEMALESS ;
DEFINE TABLE human SCHMAFULL; [re]define table as SCHMAFULL
DEFINE TABLE human SCHEMAFULL ;
SCHEMAFULL
Es werden nur Daten gespeichert, die in den definierten Feldern erlaubt sind.
Kann auf bestimmte Datentypen beschränkt werden
DEFINE FIELD kann einen Standardwert setzen, wenn keine Daten eingegeben werden
Der zu setzende Wert wird in $value gesetzt
DEFINE TABLE person SCHEMAFULL;.
DEFINE FIELD name ON person TYPE string VALUE $value OR 'guest';.
Hinzufügen von Daten
Wenn das Feld -id weggelassen wird, wird die ID automatisch gesetzt
INSERT INTO mensch (Spitzname, Alter)
VALUES ('brian', 75);
INSERT INTO mensch (id, nickname, alter)
VALUES ('mensch:freddie', 'freddie', -1);
CREATE human:robert SET nickname='robert', age=30;
CREATE Mensch SET
id = human:jack, nickname='jack', age=30;
CREATE human CONTENT
{ id: 'mensch:john', nickname: 'john', alter: 99 };
INSERT
Kann UPDATE, wenn es doppelte IDs gibt
INSERT INTO test (id, test, etwas)
VALUES ('tester', true, 'andere');
INSERT INTO test (id, test, irgendwas)
VALLUES ('tester', wahr, 'andere' )
ON DUPLICATE KEY UPDATE etwas = 'sonst' ;
Verschachtelung von Feldern
Felder in einer Tabelle können verschachtelt werden.
Auf verschachtelte Felder kann durch Punktnotation verwiesen werden
UPDATE person:test CONTENT {
Einstellungen: {
verschachtelt: {
object: {
thing: 'test'
}
}
}
};
SELECT settings.nested.object FROM person ;.
NONE und NULL
Ein Feld kann die Werte NONE und NULL haben
NONE: es wird kein Wert gesetzt
NULL: ein leerer Wert wird gesetzt
CREATE person:test1 SET email = 'info@example.com';
CREATE person:test2 SET email = NONE;
CREATE person:test3 SET email = NULL;
BENUTZEN.
Angeben von NAMESPACE und DATABASE, die verwendet werden sollen
Wirksam, wenn der Zugriff mit ROOT-Authentifizierung erfolgt.
USE NAMESPACE test ;
USE NAMESPACE test DATABASE db1 ;
USE NS test test DB db1 ;
Relation in allgemeinem SQL
CREATE TABLE armor (
id int,
name text,
widerstand text,
PRIMARY KEY(id)
);
INSERT INTO rüstung VALUES
(0, "Leder", 3);
(1, "platemail", 30),
(2, "Kettenhemd", 20),.
CREATE TABLE player (
name text,
Stärke int,
armor_id int,
PRIMARY KEY((name),.
CONSTRAIN fk_armor
FOREIGN KEY(rüstung_id)
REFERENCECS rüstung(id)
);
Relation in SurrealQL (SurQL)
CREATE Rüstung:Leder SET registance = 3;
CREATE Rüstung:Kettenhemd SET registance = 20;;
CREATE rüstung:platemail SET registance = 30;
CREATE player:jack SET Stärke = 22, Rüstung = Rüstung:platemail;
CREATE player:brian SET strength = 20, armor = armor:leather;
Verwendung von Tabellennamen in IDs
SurQL: Relation mit definiertem Schema
DEFINE TABLE armor SCHEMAFULL;.
DEFINE FIELD resistance ON armor TYPE int;.
CREATE rüstung:leder SET widerstand = 3;
CREATE rüstung:kettenhemd SET widerstand = 20;
CREATE rüstung:platemail SET widerstand = 30;
DEFINE TABLE player SCHEMAFULL;.
DEFINE FIELD strength ON player TYPE int;
DEFINE FIELD rüstung ON player TYPE record(rüstung);
CREATE player:jack SET strength = 22, armor = armor:platemail;
CREATE spieler:brian SET stärke = 20, rüstung = rüstung:leder;
Allgemeine SQL-Beziehungen: JOIN
SELECT
spieler.name,
spieler.stärke,.
rüstung.name AS rüstung_name,.
rüstung.widerstand AS rüstung_widerstand
FROM spieler
JOIN rüstung
ON rüstung.id = spieler.rüstung_id
Relation in SurQL: kein JOIN erforderlich
FETCH expandiert das angegebene Feld
SELECT * FROM spieler FETCH rüstung;.
Datensatz Verknüpfung
CREATE Rüstung:Leder SET registance = 3;
CREATE Rüstung:Kettenhemd SET registance = 20;
CREATE rüstung:platemail SET registance = 30;
CREATE player:jack SET strength = 22, armor = armor:platemail;
CREATE player:brian SET strength = 20, armor = armor:leather;
Fremdschlüssel == Datensatzverknüpfung
Beziehung: ONE-TO-ONE
CREATE mensch:freddie SET nickname="freddie", age=99 ;
CREATE mensch:brian SET nickname="brian", age=75
UPDATE mensch:brian SET bff = mensch:freddie;
SELECT bff.nickname, bff.age FROM mensch:brian
Kennzeichnen Sie Felder in der äußeren Tabelle, indem Sie sie mit Punkten verbinden
Beziehung: eins-zu-viele
CREATE car:tesla SET model='Model S', ev=True, price=99000;
CREATE auto:mustang SET modell='Mustang Cobra', ev=False, preis=60000;
UPDATE human:brian SET cars=["car:tesla"];
UPDATE mensch:freddie SET autos=["auto:mustang"];
UPDATE auto:tesla SET eigentümer = mensch:brian;
UPDATE auto:mustang SET besitzer = mensch:freddie;
CREATE Teile:Reifen SET Marke='Michelin', Größe=5;
CREATE parts:gastank SET brand='Tanksy', size=10;
CREATE parts:batterie SET marke='Xi Ping', größe=20;
UPDATE Auto:Mustang SET Teile = ['Teile:Reifen', 'Teile:Gastank'];
UPDATE auto:tesla SET teile = ['teile:reifen', 'teile:batterie'];
BEZIEHUNG: EINS-ZU-VIELE
SELECT teile FROM auto:mustang
SELECT autos.teile.marke FROM mensch:brian ;.
Kennzeichnen Sie Felder in externen Tabellen, indem Sie sie mit Punkten verbinden
Graphische Verbindungen
RELATE spieler:bube -> will_kaufen -> rüstung:drache;
RELATE spieler:bube -> will_kaufen -> rüstung:platemail;
SELECT * FROM wants_to_buy;
SELECT id, -> will_kaufen -> rüstung AS wtb FROM spieler;
SELECT id, <- wants_to_buy <- player AS players FROM rüstung:drache
Kennzeichnen Sie Felder in äußeren Tabellen, indem Sie sie mit "->" oder "<-" verbinden.
LIMIT.
Gibt die Anzahl der Ergebnisse an, die von der SELECT
Im Moment funktioniert die direkte FETCH-Anweisung nicht gut
CREATE tag:rs SET name = 'Rust';.
CREATE tag:go SET name = 'Golang';;
CREATE tag:js SET name = 'JavaScript';;
CREATE person:tobie SET tags = [tag:rs, tag:go, tag:js];
CREATE person:jaime SET tags = [tag:js];
SELECT * FROM person LIMIT 1;
SELECT * FROM (SELECT * FROM person FETCH tags) LIMIT 1;
// SELECT * FROM person LIMIT 1 FETCH tags;
START.
Gibt die Startposition des von SELECT zurückgegebenen Ergebnisses an (nullbasiert).
Funktioniert gut, wenn FETCH angegeben ist
SELECT * FROM person START AT 1;
SELECT * FROM (SELECT * FROM person FETCH tags) START 1;
SELECT * FROM person START 1 FETCH tags;
SurQL: WHERE, ORDER BY, GROUP BY
SELECT * FROM rüstung ;
SELECT * Rüstung WHERE Widerstand >= 30 ;
SELECT math::sum(strength) FROM player GROUP BY ALL ;
SELECT * FROM rüstung ORDER BY RAND();
SELECT * FROM rüstung ORDER RAND();
SELECT * FROM rüstung ORDER widerstand NUMERIC ASC ;
SELECT * FROM rüstung ORDER widerstand NUMERIC DESC ;
SurQL: BEFORE, AFTER, DIFF
CREATE, UPDATE und DELETE können vor, nach und Differenz von Abfragen zurückgeben
UPDATE mensch:freddie SET email = 'freddie@example.com';
UPDATE human:freddie SET email = 'freddie@dummy.com' RETURN DIFF ;.
Vordefinieren von analytischen Abfragen
Sobald die Daten geschrieben sind, führen Sie Auswahl, Aggregation, Gruppierung, Ordnung usw. durch.
DEFINE TABLE person SCHEMALESS;.
DEFINE TABLE person_by_age AS
SELECT
count(),.
Alter,.
math::sum(alter) AS total, math::mean(alter) AS average
math::mean(alter) AS mittelwert
FROM person
GROUP BY alter ;
EVENT.
Inhalt der durch ON TABLE angegebenen Tabelle: $before, $after
ID, bei der das Ereignis eingetreten ist: $this
Ereignis, das eingetreten ist: $event
UPDATE mensch:freddie SET email = 'freddie@example.com';
UPDATE mensch:brian SET email = 'brian@example.com';
DEFINE EVENT changelog ON TABLE human
WHEN $before.email ! = $nach.email
THEN ( CREATE changelog SET
time = time::now(),.
email = $after.email );
RANGE So oft wiederholen, wie durch den Doppelpunkt angegeben
> CREATE |test:10| SET time = time::now();
[
{
"result": [
{
"id": "test:g9hq0dowz77us5yvxnst",.
"time": "2022-12-20T04:10:19.282031670Z"
},
{
"id": "test:nk45tn46dy2bn1hd6zj9", { "time".
"time": "2022-12-20T04:10:19.282450969Z"
},.
RANGE Wiederholen Sie den Vorgang mit den angegebenen Anfangs- und Endwerten.
> CREATE |test:1..10| SET time = time::now();
[
{
"result": [
{
"id": "test:1",.
"time": "2022-12-20T04:12:21.477667592Z"
},
{
"id": "test:2", "time".
"time": "2022-12-20T04:12:21.478289880Z"
},.
Regulärer Ausdruck.
> SELECT * FROM test WHERE id = /. *[24]. */
[
{
"result": [
{
"id": "test:2",.
"time": "2022-12-20T04:12:21.478289880Z"
},
{
"id": "test:4", "time".
"time": "2022-12-20T04:12:21.478332436Z"
}
],.
"status": "OK",.
IF THEN ELSE
UPDATE person SET classtype =
IF Alter <= 10 THEN
'junior'.
ELSE IF Alter <= 21 THEN
'Schüler'
ELSE IF Alter >= 65 THEN
'Senior'
ELSE
NULL
END ;
MERGE.
Tabellenfelder zusammenführen: hinzufügen, löschen
UPDATE person:test SET
name.initials = 'TMH',.
name.first = 'Tobie',.
name.last = 'Morgan Hitchcock';.
UPDATE person:test MERGE {
Name: {
Titel: 'Herr',.
initials: NONE,.
suffix: ['BSc', 'MSc'], }
}
};
ASSERT-Tabellenbeschränkungen
Jedes definierte Feld kann eine Einschränkung für die Daten in ASSERT definieren
DEFINE FIELD countrycode ON user TYPE string
// Sicherstellen, dass der Ländercode ISO-3166 ist
ASSERT $wert ! = NONE AND $value = /[A-Z]{3}/
// Setzt einen Standardwert, falls leer
VALUE $wert OR 'GBR'
;.
FUTURE-Funktion
- Definieren Sie die Felder einer Tabelle durch Werte, die später gesetzt werden sollen
UPDATE person:test SET
can_drive = <future> {
birthday && time::now() > birthday + 18y };
UPDATE person:test SET birthday = <datetime> '2007-06-22';
UPDATE person:test SET birthday = <datetime> '2001-06-22';
ERMÄCHTIGUNGEN.
CRUD-Operationen auf TABLE und FIELD einschränken
DEFINE TABLE user SCHEMALESS
ERMÄCHTIGUNGEN
FOR select, create, update
WHERE id = $auth.id
FOR delete
WHERE id = $auth.id OR $auth.admin = true ;.
ACID-Transaktion
START TRANSAKTION;.
UPDATE coin:one SET balance += -23.00 ;
UPDATE münze:zwei SET Saldo -= 23,00 ;
TRANSAKTION BESTÄTIGEN;.
ODER
TRANSAKTION ABBRECHEN;.
Wenn eine neue Transaktion für eine Tabelle mit gesetztem DROP angegeben wird, werden alle noch nicht abgeschlossenen Transaktionen zerstört.
Wenn DROP gesetzt ist und eine neue Transaktion für eine Tabelle angegeben wird, werden alle Transaktionen, die noch nicht abgeschlossen sind, verworfen.
Standardmäßig sind neue Transaktionen schreibgeschützt (wenn möglich).
WebSocket
Geben Sie eine URL wie ws://dev00:8000/rpc (ws://, wss://) an.
POST-Übertragung mit dem folgenden JSON als Nachrichtentext.
{
"id": <ID zur Identifizierung>,.
"method": <Befehl>,.
"params": <Array der für den Befehl erforderlichen Parameter>
}
SurrealDB-Authentifizierung
ROOT-Authentifizierung
Beim Start des Servers angegebener Benutzer/Passwort
-pass Das Weglassen der Option deaktiviert die ROOT-Authentifizierung
Benutzer-Authentifizierung.
Benutzer/Passwort erstellt mit DEFINE LOGIN
Token-Authentifizierung
Authentifizierung mit JSON Web Token (JWT) (RFC7519, RFC8725)
OAuth-Authentifizierung von Drittanbietern
SCOPE-Authentifizierung
SIGNUP und SIGNIN vordefiniert
Zugriffszeiträume können begrenzt werden
LOGIN
Der Zugang kann auf NAMESPACE und DATABASE beschränkt werden
Benutzer ohne NAMESPACE-Berechtigung können keine DBs erstellen/löschen
DEFINE LOGIN admin ON NAMESPACE PASSWORD "admin.admin";.
DEFINE LOGIN guest ON DATABASE PASSWORD "guest.guest";.
LOGIN Bild.
surrealdb_login.png
TOKEN.
Erlaubt nur den Zugriff auf Anfragen mit einem bestimmten Token in der Kopfzeile
Kann für NAMESPACE, DATABASE und SCOPE festgelegt werden
DEFINE TOKEN my_token ON DATABASE
TYP HS512 WERT '1234567890';.
SCOPE.
Alle JSON-RPC-Felder werden auf Variablen gesetzt
SCOPE gibt die Möglichkeit, auf die Datenbank zuzugreifen
Der Zugriff auf Tabellen und Felder unterliegt den PERMISSIONS.
SCOPE mit TOKEN kann keine Tabellen erstellen/verändern/löschen oder Informationen anzeigen
DEFINE FIELD email ON TABLE user TYPE string ASSERT is::email($value);
DEFINE INDEX email ON TABLE user COLUMNS email UNIQUE;
DEFINE SCOPE account SESSION 24h
SIGNUP ( CREATE user SET
email = $email, pass = crypto::argon
pass = crypto::argon2::generate($pass) )
SIGNIN ( SELECT * FROM user
WHERE email = $email
AND crypto::argon2::compare(pass, $pass) );.
SCOPE-Bild
surrealdb_scope.png
SIGNUP für SCOPE-Authentifizierung
let jwt = fetch('https://api.surrealdb.com/signup', {
method: 'POST', {
headers: {
'Accept': 'application/json',.
NS': 'google', // Geben Sie den Namensraum an
DB': 'gmail', // Geben Sie die Datenbank an
}, }
body: JSON.stringify({
NS': 'google', // Spezifizieren Sie den Namensraum
'SC': 'Konto',.
email: 'tobie@surrealdb.com',.
pass: 'a85b19*1@jnta0$b&!'
}),.
});
Referenzierung von Token und Authentifizierungsdaten aus Abfragen.
$session, $scope, $token und $auth werden auf spezielle, für den Client relevante Informationen gesetzt
Bei der Verwendung von NAMESPACE, DATABASE oder TOKEN, werden $session und $token gesetzt
$toekn wird auf alle Felder des JWT-Tokens gesetzt
$scope wird auf den SCOPE-Namen in der SCOPE-Authentifizierung gesetzt
$auth wird gesetzt, wenn das JWT ein id-Feld in der SCOPE-Authentifizierung hat und die durch id angegebenen Daten in der Tabelle existieren
SELECT * FROM $session;.
SELECT * FROM $token;.
SELECT * FROM $scope;.
SELECT * FROM $auth;.
LIVE-Abfrage
Gültig beim Zugriff über WebScoket
Datenänderungen werden in Echtzeit an Clients, Anwendungen, Endbenutzergeräte und Server übertragen
Echtzeit-Push an Seitenbibliotheken
Alle Client-Geräte werden synchronisiert gehalten
Um eine LIVE-Abfrage zu beenden, geben Sie mit KILL an
LIVE SELECT * FROM user WHERE age > 18 ;.
PARALLEL.
PARALLEL wird zu CREATE, DELETE, UPDATE und SELECT hinzugefügt
Die Ausführung der Abfrage wird parallel verarbeitet
SELECT * FROM test PARALLEL ;
TIMEOUT
TIMEOUT wird in CREATE, DELETE, UPDATE und SELECT eingefügt.
Warten Sie auf die in der Abfrageausführung angegebene Zeit
SELECT * FROM
http::get('https://ipinfo.io')
TIMEOUT 10s;.
GeoJSON
Pont, Linie, Polygon, MultiPoint, MultiLine, MultiPolygon, Sammlung
UPDATE university:oxford SET area = {
coordinates: [
[[ [10.0, 11.2],[10.5, 11.9],[10.8, 12.0],[10.0, 11.2]],]
[[ [9.0, 11.2], [10.5, 11.9],[10.3, 13.0], [9.0, 11.2]]
]
};
SELECT * FROM universität:oxford;.
Eingebaute SurQL-Funktionen
array::xxxx()
combine, complement, concat, difference, disinc, intersect, len, sort::asc, sort::desc, sort, union, all, any, add, append, insert, prepend, remove add, append, insert, prepend, remove, reverse, group, push, pop
count()
crypto::xxxx()
argon2::compare, argon2::generate, bcrypt::compare, bcrypt::generate, md5, pdkdf2::compare, pdkdf2::generate, scrypt::compare, scrypt:: generieren, sha1, sha25, sha512
Eingebaute SurQL-Funktionen (Forts.)
Dauer::xxxx()
Tage, Stunden, Min., Sek., Wochen, Jahre
geo::xxxx()
Fläche, Peilung, Schwerpunkt, Entfernung, hash::decode, hash::encode
http::xxxx()
head, get, put, post, patch, delete
ist::xxxx()
alphanum, alpha, domain, email, hexadezimal, Breitengrad, Längengrad, numerisch, semver, url, uuid, url, datetime
Eingebaute SurQL-Funktionen (Forts.)
math::xxxx()
abs, bottom, ceil, fixed, floor, interquartile, max, mean, midhinge, min, mode, nearestrank, percentile, round, spread, sqrt, stddev, sum, top, trimean, variance, pow
nicht()
parse::email()
Host, Benutzer
parse::url::xxxx)
Domäne, Fragment, Host, Port, Pfad, Abfrage, Schema
Eingebaute SurQL-Funktionen (Forts.)
rand()
rand::xxxx()
bool, enum, float, guid, int, string, time, uuuid:v4, uuid:v7, uuid
session::xxxxxx()
db, id, ip, ns, origin, sc, sd, token,.
Eingebaute SurQL-Funktionen (Forts.)
Zeichenkette::xxxx()
concat, endsWith, join, length, lowercase, repeat, replace, reverse, slice, slug, split, startsWith, trim, uppercase, words
zeit::xxxx()
day, floor, format, group, hour, minute, month, nano, now, round, second, unix, wday, yday, year, timezone
typ::xxxxxx()
bool, datetime, dezimal, Dauer, float, int, Zahl, Punkt, regex, Tabelle, thin
SurQL eingebaute gewöhnliche Zahlen
math::xxxx
E, FRAC_1_PI, FRAC_1_SQORT_2, FRAC_2_PI, FRAC_2_SQRT_PI, FRAC_PI_2, FRAC_PI_3, FRAC_PI_4, FRAC_PI_6, FRAC_PI_8, LN_10, LN_2, LOGO10_2, LOG10_E,. LOG2_10, LOG2_E, PI, SQRT_2, TAU
LET Parametereinstellung
Numerische, String- und andere Objekte können als Variablen gesetzt werden
Kann als $variable in einer Abfrage referenziert werden
LET $test = { some: 'thing', other: true };
SELECT * FROM $test WHERE some = 'thing';
Erweitern von SurQL mit JavaScript
Alle Werte aus SurrealDB werden automatisch in JavaScript-Typen umgewandelt
Rückgabewerte von JavaScript-Funktionen werden automatisch in SurrealDB-Werte umgewandelt
Boolesche Werte, Ganzzahlen, Fließkommazahlen, Strings, Arrays, Objekte und Datumsobjekte werden
werden automatisch in oder aus SurrealDB-Werten konvertiert.
CREATE user:test SET created_at = function() {
return new Datum();
};
Beispiel einer JavaScript-Erweiterung 1
CREATE platform:test SET version = function() {
const { platform } = await import('os');
return platform();
};
JavaScript-Erweiterung Beispiel 2
LET $value = 'SurrealDB';.
LET $words = ['awesome', 'advanced', 'cool'];
CREATE article:test SET summary = function($value, $words) {
return `${argumente[0]} ist ${argumente[1].join(', ')}`;
};
Beispiel für eine JavaScript-Erweiterung 3
CREATE film:test SET
ratings = [
{ Bewertungen: 6.3 }
{ Bewertung: 8.7 }, }
],.
display = function() {
return this.ratings.filter(r => {
return r.rating >= 7;
}).map(r => {
return { ... .r,.
Bewertung: Math.round(r.Bewertung * 10) }; }
});
};
Einfache Beispielimplementierung der RETful-API in Python
from urllib.request import Request, urlopen
importiere base64
importiere json
from pprint import pprint as pp
_BASE_URL = "http://dev00:8000"
NAMESPACE = "test"
DATENBANK = "test"
BENUTZER = "root"
_PASS = "root"
auth_str = f"{_USER}:{_PASS}".encode("utf-8")
credential = base64.b64encode(auth_str)
auth = "Basic " + credential.decode("utf-8")
headers = {
"Accept": "application/json",.
"Authorization": auth,.
"NS": _NAMESPACE,.
"DB": _DATABASE,.
}
url = _BASE_URL + "/schlüssel/mensch"
request = Anfrage(url, headers=headers)
with urlopen(request) as res:.
data = res.read()
pp(json.loads(data)[0]['result'])
Beispiel für eine Abfrage über die RETful-API in Python
importiere Anfragen
from requests.auth import HTTPBasicAuth
from pprint import pprint as pp
_URL = "http://dev00:8000/sql"
NAMESPACE = "test"
DATENBANK = "test"
BENUTZER = "root"
_PASS = "root"
_HEADERS = {
'Content-Type': 'application/json',.
'Accept':'application/json',.
'ns': _NAMESPACE,.
'db': _DATABASE'
}
_auth = HTTPBasicAuth(_USER, _PASS)
def db(query):.
res = requests.post( _URL,.
headers=_headers,.
auth = _auth,
data=abfrage )
if "code" in res.json():.
raise Exception(res.json())
return res.json()
if __name__ == '__main__':.
while True:.
sql = Eingabe('SQL> ')
if sql.upper() == 'Q':
break
val = db(sql)
pp(val)
Beispiel einer Abfrage über WebSocket in Python
asyncio importieren
von surrealdb import WebsocketClient
from pprint import pprint as pp
_URL = "ws://dev00:8000/rpc"
NAMESPACE = "test"
DATENBANK = "test"
_BENUTZER = "root"
_PASS = "root"
async def main():.
async mit WebsocketClient( url=_URL,.
namespace=_NAMESPACE, database=_DATABASE,.
username=_USER, password=_PASS,.
) als Sitzung:.
while True:.
sql = Eingabe('SQL> ')
if sql.upper() == 'Q': break
res = await session.query(sql)
pp(res).
PyPI-Zeug verbindet sich nicht gut mit WebSocket
Pull Request in Arbeit.
Dieses Repository wird für den Moment funktionieren.
GitHub - iisaka51/surrealdb.py bei develop
Andere Beispielimplementierungen
Flask
GitHub - santiagodonoso/python_flask_surrealdb
FastAPI
GitHub - santiagodonoso/fastapi_surrealdb_v_1
PHP
GitHub - santiagodonoso/php_surrealdb
React
GitHub - rvdende/surrealreact: SurrealDB-Explorer UI geschrieben in React.
Deno
https://github.com/officialrajdeepsingh/surrealDb-deno
Typescript.
SurrealDB erklärt mit Express.js, Node.js, und TypeScript
Zu beachtende Punkte
In surrealdb-1.0.0-beat8 verfügbare Backend-DBs
RocksDB, TiKV
FoundationDB, IndexedDB erfordert einen Rebuild
IndexedDB kann von Haus aus für eingebettete Zwecke verwendet werden
NAMESPACE ist für den Zugriff auf DATABASE erforderlich
Verschiedene NAMESPACE führen zu verschiedenen DATABASEs mit demselben Namen.
Es können beliebig viele DATABASEs in einem NAMESPACE erstellt werden.
Sie benötigen jedoch eine Berechtigung für den Zugriff auf NAMESPACE/.
Dies ist wahrscheinlich ein Fehler!
Einige SurQL funktionieren nicht gut in der CLI
SurQL-Subkommando ist HTTP RestfulAPI-Zugriff mit Return-Tastendruck
Semikolons werden nicht als eine einzelne Abfrage erkannt
In Dateien, die durch den Unterbefehl import gegeben werden, ist es OK.
Copy&Paste ist OK, wenn Return gedrückt wird.
Kommentare werden akzeptiert, aber nur Kommentare sind ein Fehler.
Leerzeichen ('') wird als ausgeführt betrachtet.
Mit LET definierte Variablen gehen verloren, wenn die Return-Taste gedrückt wird.
Transaktion ist NG, wenn die Return-Taste mitten in einer Transaktion gedrückt wird.
Die Deklaration von USE geht ebenfalls verloren, wenn die Return-Taste gedrückt wird.
Schlussfolgerung.
Erstaunlich einfach zu installieren und zu konfigurieren
Sehr, sehr, sehr kompatibel mit Webanwendungen
Leistungsstarke, über JavaScript erweiterbare Abfragen
Geschäftslogik und Benutzerauthentifizierung können direkt in der Datenbank behandelt werden
Vereinfachter Back-End-Technologie-Stack → reduzierte Entwicklungszeit → reduzierte Kosten
Noch in der Entwicklung, aber vielversprechend
Referenzen
SurrealDB offizielle Seite
GitHub - surrealdb/surrealdb: Eine skalierbare, verteilte, kollaborative Dokumentgraphen-Datenbank für das Echtzeit-Web
StackOverflow
Authentifizierungsfehler bei Verwendung eines externen JWT-Tokens in SurrealDB
Beziehungen in SurrealDB nach oben traversieren
Wie kann ich mich mit SurrealDB in einem Bereich anmelden?
Wie kann ich einen Namespace angeben, wenn ich Websockets mit SurrealDB verwende?
Empfohlene REST-Clients
Surrealist
Teilt die Ergebnisse mehrerer Abfragen in Registerkarten auf.
Ausgezeichnete Beispielimplementierung von SurrealDB
GitHub - StarlaneStudios/Surrealist: ⚡ Blitzschneller grafischer SurrealDB-Abfrage-Spielplatz für Desktop
Tabbed Postman - REST-Client
Chrome-Erweiterung
Abfragen können als Sammlungen gespeichert werden
Sammlungen können exportiert/importiert werden
Registerkarten-Postman - REST-Client
Thunder-Client
Erweiterung für VSCode
Thunder Client - Rest API Client-Erweiterung für VS Code
Anhang.
Serveroptionen und Umgebungsvariablen
DB_PATH: Speicherort der Daten (Speicher)
USER Benutzername für die ROOT-Authentifizierung (root), --user/-u
PASS Passwort für den Benutzer der ROOT-Authentifizierung, --pass/-p
ADDR Teilnetz für die ROOT-Authentifizierung (127.0.0.1/32), --addr
BIND Hostname/IP-Adresse zum Lauschen auf Verbindungen (0.0.0.0:8000), --bind/-b
KEY Geheimer Schlüssel für die ON-DISK-Verschlüsselung, --key/-k
KVS_CA CA-Datei für die KVS-Verbindung, --kvs-ca
KVS_CRT CERT-Datei für die KVS-Verbindung, --kvs-crt
KVS_KEY Privater Schlüssel für KVS-Verbindungen, --kvs-key
WEB_CRT CERT-Datei für das Abhören von SSL-Verbindungen, --web-crt
WEB_KEY Privater Schlüssel für das Abhören von SSL-Verbindungen, --web-key
STRICT Start im STRICT-Modus, falls gesetzt, --strict
LOG Protokollstufe "warn", ["info"], "debug", "trace", "full", --log
ACID: vier Merkmale, die eine Transaktion definieren
Atomarität.
Jede Anweisung in einer Transaktion wird als eine Einheit behandelt.
Konsistenz.
Stellt sicher, dass eine Transaktion Änderungen an einer Tabelle nur in einer vordefinierten und vorhersehbaren Weise vornimmt.
Tabelle in einer vordefinierten und vorhersehbaren Art und Weise.
Isolierung
Stellt sicher, dass jede Anfrage so behandelt wird, als würde sie unabhängig erfolgen, auch wenn mehrere Benutzer gleichzeitig in derselben Tabelle lesen und schreiben.
Jede Anfrage wird so behandelt, als sei sie unabhängig entstanden, auch wenn mehrere Benutzer gleichzeitig in derselben Tabelle lesen und schreiben.
Dauerhaftigkeit
Garantiert, dass Datenänderungen von erfolgreich ausgeführten Transaktionen auch bei einem Systemausfall erhalten bleiben.
Stellt sicher, dass Datenänderungen von erfolgreich ausgeführten Transaktionen auch bei einem Systemausfall erhalten bleiben.
N+1-Problem
Ein Problem, bei dem Datenbankzugriffe dazu führen, dass Abfragen insgesamt N+1 Mal ausgeführt werden.
SELECT wird einmal ausgeführt, um N Datensätze abzurufen
SELECT wird N-mal ausgeführt, um die mit N Datensätzen verbundenen Daten abzurufen
Neigt dazu, bei der Verwendung von ORMs hinter den Kulissen aufzutreten
Neigt dazu, die Anwendung schwerfällig (langsam) laufen zu lassen
RocksDB
Beliebte, leistungsstarke eingebettete KVS-Datenbank
Abspaltung von LevelDB, entwickelt von Meta (Facebook)
Wird in der Produktion von verschiedenen Webdiensten wie Facebook, Yahoo!
Bietet Datenpersistenz bei gleichzeitiger Erhöhung der Leistung und Sicherheit
Die Leistung steigt linear mit der Anzahl der CPUs
Die Leistung von RocksDB wird stark vom Plattform-Tuning beeinflusst
Nicht einfach aufgrund der Komplexität vieler konfigurierbarer Parameter
TiKV
KVS-Datenbank, die auf dem Backend von TiDB läuft
Datenpersistenz (mit RocksDB)
Datenintegritätsgarantien für verteilte Datenbanken
MVCC (Multi-Version Gleichzeitigkeitskontrolle)
Realisierung von verteilten Transaktionen
Google Parcorator / 2PC (2 Phasen Commit)
Coprozessor
Beachten Sie, dass TiKV standardmäßig als 3-Knoten-Cluster konfiguriert ist.
Speicherung in temporären Dateien, bis der Cluster mit 3 Knoten konfiguriert ist
Temporäre Dateien werden beim Starten automatisch gelöscht.
Referenz: https://docs.pingcap.com/tidb/dev/tikv-configuration-file
Cluster-Konfiguration: https://tikv.org/docs/5.1/deploy/install/production/
TiKV-Architektur
tikv_stack.png
IndizierteDB
Browser-basierte eingebettete KVS-Datenbank
Speichert Daten persistent im Browser des Benutzers
Ermöglicht die Erstellung von Web-Applikationen mit erweiterten Abfragemöglichkeiten unabhängig von den Netzwerkbedingungen
Schemafrei
Unterstützt ACID-Transaktionen
Asynchrone Verarbeitung
Gleichzeitigkeit von mehreren Versionen
Benutzer können Daten so einfach wie Cookies löschen
Browser-Auswahl
Daten können nicht in IndexedDB registriert werden, wenn die Kapazität einen bestimmten Wert überschreitet.
Die Menge der Daten, die in IndexedDB registriert werden können, hängt von der Umgebung ab.
FoundationDB
NoSQL mit Unterstützung von ACID-Transaktionen
Kann mit SQL bedient werden.
Schlüssel sind sortiert.
Durchsatz von 20.000 Schreibvorgängen pro Sekunde auf einem Kern bei Verwendung von SSDs
Lineare Skalierung auf bis zu 500 Kerne
Liest in 1 ms, schreibt in 5 ms
Kann in einer Clusterkonfiguration verteilt/redundant sein
Kann mit mindestens einem Knoten konfiguriert werden (keine Redundanz/Knoten können später hinzugefügt werden)
Die Standardkonfiguration von FDB funktioniert nicht gut, daher ist eine Konfiguration erforderlich
$ fdbcli --exec 'ssd konfigurieren'
$ fdbcli --exec 'writemode ein'
$ fdbcli --exec 'getrangekeys \x00 \xff'
Referenz: https://apple.github.io/foundationdb/command-line-interface.html
Binäre Versionen haben FoundationDB deaktiviert
Hängt von der FoundationDB-Version ab, die in features angegeben ist
$ cargo Merkmal surreal
Verfügbare Features für `surreal`.
default = ["storage-rocksdb", "scripting", "http"]
http = ["surrealdb/http"].
scripting = ["surrealdb/scripting"].
storage-fdb = ["surrealdb/kv-fdb-6_3"].
storage-rocksdb = ["surrealdb/kv-rocksdb"]]
speicher-tikv = ["surrealdb/kv-tikv"]
$ grep kv-fdb- lib/Cargo.toml
kv-fdb-5_1 = ["foundationdb/fdb-5_1", "kv-fdb"]
kv-fdb-5_2 = ["foundationdb/fdb-5_2", "kv-fdb"].
kv-fdb-6_0 = ["foundationdb/fdb-6_0", "kv-fdb"].
kv-fdb-6_1 = ["foundationdb/fdb-6_1", "kv-fdb"].
kv-fdb-6_2 = ["foundationdb/fdb-6_2", "kv-fdb"].
kv-fdb-6_3 = ["foundationdb/fdb-6_3", "kv-fdb"].
kv-fdb-7_0 = ["foundationdb/fdb-7_0", "kv-fdb"].
kv-fdb-7_1 = ["foundationdb/fdb-7_1", "kv-fdb"].
Avaliable notation ist ein Fehler in cargo-feature. Pull Requests wurden ausgegeben.
SurrealDB neu erstellen.
Richte eine Rust-Entwicklungsumgebung ein (falls nötig).
$ curl -sSf https://sh.rustup.rs | sh
$ source $HOME/.cargo/env
$ rustup install stable
Klonen Sie das SurrealDB-Repository
$ git clone https://github.com/surrealdb/surrealdb.git
$ cd surrealdb
Neu erstellen.
$ carrgo build -release -all-features # Schlägt fehl mit 2GB Speicher.
# oder
$ cargo build -release -features storage-fdb # TiKV wird deaktiviert
TiKV gegenüber FoundationDB
Die FDB-Überwachungsfunktionalität ist schwach
$ fdbcli --exec 'status json'
TiKV mit Prometheus für die Datenreferenzierung und Grafana für die Statusüberwachung
FDB ist versionsabhängig
FDB wird standardmäßig im Speicher abgelegt und erfordert Konfigurationsänderungen
FDB ist in C++ implementiert, TiKV in Rust
FDB kann mit mindestens einem Knoten gewartet werden, TiKV erfordert mindestens drei Knoten
Replikation von RocksDB
Replikation in Echtzeit ist mit rocksplicator möglich
https://github.com/pinterest/rocksplicator
Beachten Sie jedoch, dass es sich bei Rocksplicator um ein archiviertes Projekt handelt, das von Pinterest nicht aktiv gepflegt oder unterstützt wird.
Zur Speicherung von Binärdateien.
SurrealDB ist für eine solche Verwendung nicht ausgelegt
Objektspeicherung sollte in Betracht gezogen werden
GitHub - minio/minio: Multi-Cloud-Objektspeicherung
GitHub - scality/Zenko: Zenko ist der Open-Source-Multi-Cloud-Datencontroller: Besitzen und behalten Sie die Kontrolle über Ihre Daten in jeder Cloud.
SurQL-Syntax
INFO
INFO FÜR [
KV
| NS | NAMESPACE
| DATABASE
| DATENBANK
| TABLE @table
];
DEFINE NAMESPACE | DATABASE ...
DEFINE [
NAMESPACE @name
DEFINE [ NAMESPACE | DATABASE @name
| LOGIN @name ON [ NAMESPACE | DATABASE ]
[ PASSWORT @pass | PASSHASH @hash ]
| TOKEN @name ON [ NAMESPACE | DATABASE | SCOPE ]
TYP @algorithmus VALUE @value
| SCOPE @name [ SESSION @duration ]
[ SIGNUP @Ausdruck ] [ SIGNIN @Ausdruck ]
| EVENT @name ON [ TABLE ] @table
WHEN @Ausdruck THEN @Ausdruck
@algorithmus
EDDSA, ES256, ES384, ES512, HS256, HS384, HS512,.
PS256, PS384, PS512, RS256, RS384, RS51
DEFINE TABLE
DEFINE [
| TABLE @name
[DROP ]
[ SCHEMAFULL | SCHEMALESS ]
[ AS SELECT @projections
FROM @Tabellen
[ WHERE @condition ]
[ GROUP [ BY ] @groups ]
]
[ PERMISSIONS [ NONE | FULL
| FOR select @Ausdruck
| FOR create @Ausdruck
| FOR update @Ausdruck
FOR delete @expression | FOR delete @expression
] ]
; ;
FELD | INDEX DEFINIEREN
DEFINE [
| FIELD @name ON [ TABLE ] @table
[ TYP @Typ ]
[ WERT @Ausdruck ]
[ ASSERT @Ausdruck ]
[ PERMISSIONS [ NONE | FULL
| FOR select @Ausdruck
| FOR create @ausdruck
| FOR update @Ausdruck
| FOR delete @ausdruck
]
| INDEX @name ON [ TABLE ] @table [ FIELDS | COLUMNS ] @fields [ UNIQUE ]
] ;
CREATE
CREATE @Ziele
[ INHALT @wert
| SET @feld = @wert ...
]
[ RETURN [ NONE | BEFORE | AFTER | DIFF | @projections ... ]
[ TIMEOUT @duration ]
[ PARALLEL ]
;
REMOVE
REMOVE [
NAMESPACE @name
| DATENBANK @name
| LOGIN @name ON [ NAMESPACE | DATABASE ]
| TOKEN @name ON [ NAMESPACE | DATABASE ]
| SCOPE @name
| TABLE @name
| TABLE @name
| FIELD @name ON [ TABLE ] @table
| INDEX @name ON [ TABLE ] @table
] ;
EINFÜGEN
INSERT [ IGNORE ] INTO @what
[ @wert
| (@fields) VALUES (@values)
[ ON DUPLICATE KEY UPDATE @field = @value ... ]
]
;
UPDATE
UPDATE @Ziele.
[ INHALT @Wert
| MERGE @Wert
| PATCH @wert
| SET @feld = @wert ...
]
[ WHERE @condition ]
[ RETURN [ NONE | BEFORE | AFTER | DIFF | @projections ... ]
[ TIMEOUT @duration ]
[ PARALLEL ]
;
LÖSCHEN
DELETE @targets ]
[ WHERE @condition ]
[ RETURN [ NONE | BEFORE | AFTER | DIFF | @projections ... ]
[ TIMEOUT @duration ]
[ PARALLEL ]
;
SELECT
SELECT @hochrechnungen
FROM @Ziele
[ WHERE @condition ]
[ SPLIT [ AT ] @feld ... ]
[ GROUP [ BY ] @feld ... ]
[ ORDER [ BY ]
@feld [RAND()| COLLATE| NUMERIC ] [ ASC | DESC ] ...
]
[ LIMIT [ BY ] @limit ]
[ START [ AT ] @start ]
[ FETCH @feld ... ]
[ TIMEOUT @duration ]
[ PARALLEL ]
;
USE
BENUTZEN.
[ NAMESPACE | NS ] @namespace ]
[[ DATENBANK | DB ] @Datenbank ] ;
freigeben
Registrieren Sie sich jetzt und nutzen Sie Qiita noch komfortabler!
Wir senden Ihnen Artikel, die Ihren Bedürfnissen entsprechen.
So können Sie nützliche Informationen später effizient nachlesen.
Über die Funktionen, die Sie nutzen können, wenn Sie sich anmelden
iisaka51
@iisaka51(Goichi (Iisaka) Yukawa)
https://github.com/iisaka51
Link
rss_fe
0 件のコメント:
コメントを投稿