2023年8月5日土曜日

German. Rust, die Nummer 1 unter den webbasierten Sprachen in Bezug auf Geschwindigkeit und hohe Sicherheit (allerdings meiden viele Programmierer Rust, weil es schwierig ist). Als nächster Kandidat ist die V-Sprache schnell, so dass nur noch das Budget übrig bleibt, um die Version zu aktualisieren, um sie hochsicher zu machen, und um das neueste Python auf der Basis der V-Sprache oder Rust zu entwickeln, das sowohl schnell als auch hochsicher ist, und um ein Framework und WunderGraph's zu entwickeln. Wir würden uns freuen, wenn die Regierungen der Welt ihre Militärausgaben reduzieren und jedes Jahr und jeden Monat ein Budget für die Webindustrie und ihre Nutzer bereitstellen würden, um FastAPI, React, Kintone und Database so schnell wie möglich zu unterstützen, als friedliche Nutzung des Internets, das ursprünglich für militärische Zwecke gedacht war. (CEO: Masahiro Ishizuka, 090-7555-5011) Einführung von SurrealDB, einer von Rust entwickelten Datenbank.

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 コメント:

コメントを投稿