Quintett ist eine Möglichkeit, atomare Daten zu präsentieren, die ihre Rolle im Geschäftsbereich angeben. Quintette können jedes Element beschreiben, während jedes vollständige Informationen über sich selbst und seine Beziehungen zu anderen Quintetten enthält. Diese Beschreibung hängt nicht von der verwendeten Plattform ab. Ziel ist es, die Speicherung von Daten zu vereinfachen und die Sichtbarkeit ihrer Präsentation zu verbessern.
Wir werden einen Ansatz zum Speichern und Verarbeiten von Informationen diskutieren und einige Gedanken zur Schaffung einer Entwicklungsplattform in diesem neuen Paradigma austauschen. Wofür? So entwickeln Sie schneller und in kürzeren Iterationen: Skizzieren Sie Ihr Projekt, stellen Sie sicher, dass es Ihren Vorstellungen entspricht, verfeinern Sie es und verfeinern Sie das Ergebnis weiter.Das Quintett hat Eigenschaften: Typ, Wert, Eltern und Reihenfolge unter den Peers. Somit gibt es 5 Komponenten einschließlich der Kennung. Dies ist die einfachste universelle Form zum Aufzeichnen von Informationen, ein neuer Standard, der möglicherweise allen Programmieranforderungen gerecht wird. Quintette werden im Dateisystem der einheitlichen Struktur in einer kontinuierlichen homogenen indizierten Datenmenge gespeichert. Das Quintett-Datenmodell - ein Datenmodell, das jede Datenstruktur als eine einzige miteinander verbundene Liste von Basistypen und darauf basierenden Begriffen (Metadaten) sowie Instanzen von Objekten beschreibt, die gemäß diesen Metadaten (Daten) gespeichert wurden.
Eine halbe Minute TextHeutzutage gibt es unendlich viele Standards zum Aufzeichnen von Daten, zahlreiche Ansätze und Regeln, deren Kenntnis für die Arbeit mit diesen Aufzeichnungen erforderlich ist. Standards werden separat beschrieben und beziehen sich nicht direkt auf die entsprechenden Daten. Bei Quintetten können Sie im Geschäftsbereich des Benutzers relevante Informationen über Art, Eigenschaften und Verarbeitungsregeln abrufen. Sein Standard ist einheitlich und für alle Bereiche festgelegt. Das Quintett ist dem Benutzer verborgen - Metadaten und Daten stehen diesem auf allgemein verständliche Weise zur Verfügung.
Quintett ist nicht nur Information, es könnte auch ausführbaren Code darstellen. Vor allem aber möchten Sie die Daten aufzeichnen, speichern und abrufen. Da Quintette in unserem Fall direkt adressierbar, miteinander verbunden und indiziert sind, speichern wir sie in einer Art Datenbank.
Warum Quintett statt Byte?
Kein Bit oder elektronischer Impuls, der den magnetischen Spin ausrichtet.Wir sind es gewohnt, die Daten in Bytes zu messen, unabhängig davon, ob es sich um eine Dokument- oder Fotogröße, eine Internet-Verkehrsbeschränkung oder verfügbaren Speicherplatz auf Ihrem Mobilgerät handelt. Wir schlagen eine andere Maßnahme vor - Quintett - die keine feste Größe wie Byte hat, sondern eine atomare Datenmenge darstellt, die für den Benutzer von Wert ist.
Sie können beispielsweise sagen, dass Ihre Datenbank 119 Megabyte des Speichers belegt, oder Sie können angeben, dass in dieser Datenbank 1,37 Megaquintette gespeichert sind. Es ist Ihnen egal, was ein Byte in diesem Zusammenhang ist, aber Sie verstehen, dass diese Datenbank 1,37 Millionen Ihrer Begriffsbeschreibungen, Objekte, deren Attribute, Links, Ereignisse, Abfragen mit ihren Details usw. enthält. 1,37 Millionen wertvolle Daten zu besitzen, klingt sexier als 119 Megabyte an Daten.
Dies soll also nicht die Art und Weise ersetzen, wie die Informationen auf dem Datenträger gespeichert sind, sondern auf eine andere Abstraktionsebene wechseln.
Quintettstruktur
Die Hauptidee dieses Artikels besteht darin, Maschinentypen durch menschliche Begriffe zu ersetzen und Variablen durch Objekte zu ersetzen. Nicht von Objekten, die einen Konstruktor, Destruktor, Schnittstellen und einen Garbage Collector benötigen, sondern von kristallklaren Informationseinheiten, die ein Kunde verarbeitet. Das heißt, wenn der Kunde "Kunde" sagt, würde das Speichern des Wesens dieser Aussage auf dem Medium kein Fachwissen eines Programmierers erfordern.

Es ist sinnvoll, die Aufmerksamkeit des Benutzers nur auf den Wert des Objekts zu richten, während Typ, Eltern, Reihenfolge (unter Gleichen in der Unterordnung) und Kennung aus dem Kontext ersichtlich oder einfach verborgen sein sollten. Dies bedeutet, dass der Benutzer überhaupt nichts über Quintette weiß, einfach eine Aufgabe ausgibt, sicherstellt, dass sie korrekt akzeptiert wird, und dann mit der Ausführung beginnt.
Grundbegriffe
Es gibt eine Reihe von Datentypen, die jeder versteht: Zeichenfolge, Nummer, Datei, Text, Datum usw. Solch ein einfacher Satz reicht völlig aus, um die Lösung zu skizzieren und zusammen mit den für ihre Implementierung erforderlichen Bedingungen zu "programmieren". Die durch Quintette dargestellten Grundtypen können folgendermaßen aussehen:

In diesem Fall werden einige Komponenten des Quintetts nicht verwendet, während das Quintett selbst als Basistyp verwendet wird. Dies erleichtert die Navigation des Systemkerns beim Sammeln von Metadaten.
Der Hintergrund
Aufgrund der analytischen Lücke zwischen Benutzer und Programmierer kommt es in der Phase der Projektbeschreibung zu einer erheblichen Verformung der Konzepte. Das Understatement, die Unverständlichkeit und die unaufgeforderte Initiative machen eine einfache und vernünftige Vorstellung des Kunden oft zu einem logisch unmöglichen Durcheinander, wenn sie aus Sicht des Benutzers bewertet werden.

Der Wissenstransfer sollte ohne Verlust und Verzerrung erfolgen. Wenn Sie die Speicherung dieses Wissens organisieren, sollten Sie außerdem die Einschränkungen, die durch das ausgewählte Datenverwaltungssystem auferlegt werden, besser beseitigen.
Wie wir die Daten jetzt speichern
In der Regel befinden sich viele Datenbanken auf dem Server. Jedes von ihnen enthält eine Beschreibung des Datenschemas mit einem bestimmten Satz von Details - logisch miteinander verbundene Daten. Sie werden in einer bestimmten Reihenfolge auf dem Datenträger gespeichert, idealerweise - optimal, um den Abrufaufwand zu verringern.
Das vorgeschlagene Informationsspeichersystem ist ein Kompromiss zwischen verschiedenen bekannten Methoden: spaltenorientiert, relational und NoSQL. Es wurde entwickelt, um die Aufgaben zu lösen, die normalerweise von einem dieser Ansätze ausgeführt werden.
Zum Beispiel sieht die Theorie des spaltenorientierten DBMS gut aus: Wir lesen nur die gewünschte Spalte, aber nicht alle Datensatzzeilen als Ganzes. In der Praxis ist es jedoch unwahrscheinlich, dass Daten auf dem Medium abgelegt werden, sodass es bequem ist, Dutzende verschiedener Analysedimensionen abzurufen. Beachten Sie, dass Attribute und analytische Metriken hinzugefügt und entfernt werden können, manchmal schneller als wir unseren Spaltenspeicher neu erstellen können. Ganz zu schweigen davon, dass die Daten in der Datenbank geändert werden können, was aufgrund der unvermeidlichen Fragmentierung auch die Schönheit des Speicherschemas verletzt.
Metadaten
Wir haben ein Konzept eingeführt - einen Begriff -, um alle Objekte zu beschreiben, mit denen wir arbeiten: Entität, Eigenschaft, Anforderung, Datei usw. Wir definieren alle Begriffe, die wir in unserem Geschäftsbereich verwenden. Und mit ihrer Hilfe werden wir alle Entitäten beschreiben, die Details haben, einschließlich der Form der Beziehungen zwischen Entitäten. Zum Beispiel ein Attribut - ein Link zu einem Statuswörterbucheintrag. Der Begriff wird als Quintett von Daten geschrieben.
Eine Reihe von Begriffsbeschreibungen besteht aus Metadaten, die durch die Struktur von Tabellen und Feldern in einer regulären Datenbank dargestellt werden. Beispielsweise gibt es die folgende Datenstruktur: eine Serviceanforderung an einem bestimmten Datum mit Inhalt (Anforderungsbeschreibung) und einem Status, zu dem die Teilnehmer eines Produktionsprozesses Kommentare hinzufügen, die das Datum angeben. In einem herkömmlichen Datenbankkonstruktor sieht es ungefähr so aus:

Da wir beschlossen haben, alle nicht wesentlichen Details, wie z. B. verbindliche IDs, vor dem Benutzer zu verbergen, wird das Schema etwas vereinfacht: Die Erwähnungen von IDs werden entfernt und die Namen von Entitäten und ihre Schlüsselwerte werden kombiniert.
Der Benutzer "zeichnet" die Aufgabe: eine Anfrage vom heutigen Datum, die einen Status (Referenzwert) hat und zu der Sie Kommentare hinzufügen können, die das Datum angeben:

Jetzt sehen wir 6 verschiedene Datenfelder anstelle von 9, und das gesamte Schema bietet uns die Möglichkeit, 7 statt 13 Wörter zu lesen und zu verstehen. Obwohl dies natürlich nicht die Hauptsache ist.
Die folgenden Quintette werden vom Quintettverarbeitungskern generiert, um diese Struktur zu beschreiben:

Zur Verdeutlichung werden Erklärungen anstelle von grau hervorgehobenen Quintettwerten bereitgestellt. Diese Felder werden nicht ausgefüllt, da alle notwendigen Informationen von den übrigen Komponenten eindeutig bestimmt werden.
Sehen Sie, wie Quintette zusammenhängen
Was wir hier haben:
- Die Attribute mit den IDs 80, 81, 83 haben dieselbe übergeordnete Anforderung
- Quintett # 82 ist das Attribut von Comment, das wiederum ein Attribut von Request ist
- Attribut Nr. 74 ist eine Referenz auf den vom Quintett Nr. 73 beschriebenen Typ und wird als Attribut Nr. 81 von Request verwendet
Dies mag für Menschen etwas kompliziert aussehen, aber die gute Nachricht ist - ein Mensch wird dies niemals sehen. Der Kernel repräsentiert die Metadaten als verständliche Diagramme und die Daten als einfache flache Tabellen.
Benutzerdaten
Lassen Sie mich zeigen, wie wir einen solchen Datensatz für die obige Aufgabe speichern:

Die Daten selbst werden gemäß den Metadaten in Quintetten gespeichert. Wir können sie genauso visualisieren wie oben:

Wir sehen eine vertraute hierarchische Struktur, die mit der Adjacency List-Methode niedergeschrieben wurde.
Physische Speicherung
Die Daten werden als Folge von Quintettelementen in Datenbytes in den Speicher geschrieben. Um nach Index zu suchen, behandelt der Kernel diese Datenbytes gemäß dem Datentyp, der für sie durch Basistypen definiert ist.
Das war's: eine riesige Liste von fünf Datenelementen.
Die Speicherprinzipien unterscheiden sich nicht wesentlich von denen in RDBMS. Dadurch können wir SQL-Abfragen für die Daten erstellen, um Datenabrufe, JOINs, Aggregatfunktionen und andere Dinge, die wir in relationalen Datenbanken mögen, durchzuführen.
Um den Prototyp einer Entwicklungsplattform zu testen, die auf dem Quintett-Speichersystem basiert, verwenden wir eine relationale Datenbank.
Leistung
Das obige Beispiel ist sehr einfach, aber was wird sein, wenn die Struktur tausendmal komplexer ist und Gigabyte an Daten vorhanden sind?
Was wir brauchen:
- Die diskutierte hierarchische Struktur - 1 Stck.
- B-Baum für die Suche nach ID, Eltern und Typ - 3 Stk.
Somit werden alle Datensätze in unserer Datenbank indiziert, einschließlich Daten und Metadaten. Eine solche Indizierung ist erforderlich, um die Vorteile einer relationalen Datenbank zu nutzen - dem einfachsten und beliebtesten Tool. Der übergeordnete Index ist tatsächlich zusammengesetzt (übergeordnete ID + Typ). Der Index nach Typ ist auch zusammengesetzt (Typ + Wert) für die schnelle Suche nach Objekten eines bestimmten Typs.
Mit Metadaten können wir die Rekursion beseitigen: Um beispielsweise alle Details eines bestimmten Objekts zu finden, verwenden wir den Index nach übergeordneter ID. Wenn Sie nach Objekten eines bestimmten Typs suchen müssen, verwenden wir den Index nach Typ-ID. Typ ist ein Analogon eines Tabellennamens und eines Feldes in einem relationalen DBMS.

In jedem Fall scannen wir nicht den gesamten Datensatz, und selbst bei einer großen Anzahl von Werten eines beliebigen Typs kann der gewünschte Wert in wenigen Schritten gefunden werden.
Die Basis für die Entwicklungsplattform
An sich ist eine solche Datenbank für die Anwendungsprogrammierung nicht autark und laut Turing nicht vollständig, wie sie sagen. Wir sprechen hier jedoch nicht nur über die Datenbank, sondern versuchen, alle Aspekte abzudecken: Objekte sind unter anderem beliebige Steuerungsalgorithmen, die gestartet werden können und funktionieren.
Als Ergebnis erhalten wir anstelle komplexer Datenbankstrukturen und separat gespeicherter Quellcode von Steueralgorithmen ein einheitliches Informationsfeld, das durch das Volumen des Speicherplatzes begrenzt und mit Metadaten gesteuert wird. Die Daten selbst werden dem Benutzer in verständlicher Form präsentiert - die Struktur des Themenbereichs und die entsprechenden Einträge darin. Der Benutzer ändert die Struktur und die Daten willkürlich, einschließlich Massenoperationen mit ihnen.
Wir haben nichts Neues erfunden: Alle Daten sind bereits im Dateisystem gespeichert und die Suche in ihnen erfolgt über B-Bäume, entweder im Dateisystem oder in der Datenbank. Wir haben gerade die Darstellung der Daten neu organisiert, damit die Arbeit einfacher und klarer wird.
Um mit dieser Datendarstellung arbeiten zu können, benötigen Sie eine sehr kompakte Kernel-Software. Unsere Datenbank-Engine ist kleiner als ein Computer-BIOS und kann daher, wenn nicht in Hardware, mindestens genauso schnell und fehlerhaft erstellt werden. kostenlos wie möglich. Aus Sicherheitsgründen kann es auch schreibgeschützt sein.
Wenn Sie einer Assembly in meinem bevorzugten .Net eine neue Klasse hinzufügen, können wir den Verlust von 200-300 MB RAM nur bei der Definition dieser Klasse beobachten. Diese Megabyte passen nicht in den Cache der richtigen Ebene, was dazu führt, dass das System mit dem gesamten daraus resultierenden Overhead auf der Festplatte ausgetauscht wird. Eine ähnliche Situation ist bei Java. Die Beschreibung derselben Klasse mit Quintetten dauert zehn oder Hunderte von Bytes, da die Klasse nur primitive Operationen zum Arbeiten mit Daten verwendet, die der Kernel bereits kennt.
Sie könnten denken, dass dieser Ansatz bereits viele Male in verschiedenen Anwendungen implementiert ist, aber das ist nicht wahr.
Wir haben sowohl im Internet als auch in den Grundlagen des geistigen Eigentums (Patente) gründlich gesucht, und niemand behauptet, genau dieselbe Lösung zu verwenden, um die Leistungsgrenze von Konstruktoren, Einzeltabellenlösungen und anderen EAV-basierten Systemen zu überschreiten. Trotzdem haben wir Hunderte von Gigabyte in eine solche Quintettanwendung gesteckt und festgestellt, dass sie recht gut funktioniert. Wenn Sie Beweise sehen, Ihre eigene Instanz erstellen und testen möchten, können Sie unseren Github-Account besuchen.
Der Prototyp der von uns gebauten Plattform besteht aus vier Komponenten:
- Visual Type Editor zum Definieren der Metadaten
- Datennavigationswerkzeug wie ein einfacher SQL-Navigator
- Visual Report Designer zum Erstellen von SQL-Abfragen für die Daten
- Ein Vorlagenprozessor zum Kombinieren von Vorlagen mit Daten, die durch Abfragen abgerufen wurden

Wie beabsichtigt, würde kein Benutzer bei der Arbeit mit dem Prototyp glauben, dass sich Quintette im Inneren befinden - dies sieht aus wie ein gewöhnlicher Konstruktor.
Umgang mit verschiedenen Formaten: RDBMS, NoSQL, SpaltenbasenDer diskutierte Ansatz deckt zwei Hauptbereiche ab: RDBMS und NoSQL. Bei der Lösung von Problemen, bei denen Säulendatenbanken zum Einsatz kommen, müssen wir dem Kernel mitteilen, dass bestimmte Objekte gespeichert werden sollen, wobei die Optimierung der Massenabtastung der Werte eines bestimmten Datentyps (unser Begriff) zu berücksichtigen ist. Daher kann der Kernel Daten auf die rentabelste Weise auf der Festplatte ablegen.
Somit können wir für eine Spalten-DB den von Quintetten belegten Platz erheblich einsparen: Verwenden Sie nur eine oder zwei ihrer Komponenten, um nützliche Daten anstelle von fünf zu speichern, und verwenden Sie den Index nur, um den Beginn von Datenketten anzuzeigen. In vielen Fällen wird nur der Index für die Stichprobe aus unserem Analogon einer Spaltenbasis verwendet, ohne dass auf die Daten der Quintettliste selbst zugegriffen werden muss.
Es sollte beachtet werden, dass die Idee nicht alle fortgeschrittenen Entwicklungen aus diesen drei Arten von Datenbanken sammeln soll. Im Gegenteil, die Engine des neuen Systems wird so weit wie möglich reduziert und enthält nur das erforderliche Minimum an Funktionen - alles, was DDL- und DML-Anforderungen in dem hier beschriebenen Konzept abdeckt.
Programmierparadigma
Der beschriebene Ansatz beschränkt sich nicht nur auf die Verwendung von Quintetten, sondern fördert ein anderes Paradigma als das, an das Programmierer gewöhnt sind. Anstelle einer imperativen, deklarativen oder Objektsprache schlagen wir die Abfragesprache als dem Menschen vertrauter vor und ermöglichen es uns, die Aufgabe direkt auf den Computer zu übertragen, wobei Programmierer und die undurchdringliche Schicht bestehender Entwicklungsumgebungen umgangen werden.
Natürlich ist in den meisten Fällen immer noch ein Übersetzer von einer Laienbenutzersprache in eine Sprache mit klaren Anforderungen erforderlich.Dieses Thema wird in separaten Artikeln mit Beispielen und bestehenden Entwicklungen ausführlicher beschrieben.
In Kürze funktioniert es also wie folgt:
- Wir haben einmal primitive Datentypen mithilfe von Quintetten beschrieben: Zeichenfolge, Nummer, Datei, Text und andere, und den Kernel für die Arbeit mit ihnen geschult. Training bedeutet die korrekte Darstellung von Daten und die Implementierung einfacher Operationen mit ihnen.
- Nun beschreiben wir Benutzerbegriffe (Datentypen) - in Form von Metadaten. In der Beschreibung wird lediglich ein primitiver Datentyp für jeden Benutzertyp angegeben und die Beziehungen bestimmt.
- Wir geben Datenquintette gemäß der durch Metadaten angegebenen Struktur ein. Jedes Quintett von Daten enthält einen Link zu seinem Typ und übergeordneten Element, sodass Sie ihn schnell im Datenspeicher finden können.
- Die Kernel-Aufgaben bestehen darin, Daten abzurufen und einfache Operationen mit ihnen auszuführen, um beliebig komplexe Algorithmen zu implementieren, die vom Benutzer definiert werden.
- Der Benutzer verwaltet Daten und Algorithmen über eine visuelle Oberfläche, die beide darstellt.
Die Vollständigkeit des gesamten Systems wird durch die Verkörperung der Grundanforderungen sichergestellt: Der Kernel kann sequentielle Operationen ausführen, bedingt verzweigen, die Daten verarbeiten und die Arbeit einstellen, wenn ein bestimmtes Ergebnis erreicht wird.
Für eine Person ist der Vorteil beispielsweise die Einfachheit der Wahrnehmung, anstatt einen Zyklus mit Variablen zu deklarieren
for (i = 0; i <length (A); i ++) if A [i] meets a condition do something with A [i]
eine verständlichere Form wird verwendet, wie
with every A, that match a condition, do something
Wir träumen davon, von den Feinheiten der Informationssysteme auf niedriger Ebene zu abstrahieren: Schleifen, Konstruktoren, Funktionen, Manifeste, Bibliotheken - all dies nimmt im Gehirn eines Programmierers zu viel Platz ein und lässt wenig Raum für kreative Arbeit und Entwicklung.
Skalierbarkeit
Eine Anwendung ist ohne Skalierungsmittel oft unbrauchbar: Eine unbegrenzte Möglichkeit zur Erweiterung der Ladekapazität eines Informationssystems ist erforderlich. Unter Berücksichtigung der extrem einfachen Datenorganisation stellt sich bei dem beschriebenen Ansatz heraus, dass die Skalierung nicht komplizierter organisiert ist als in vorhandenen Architekturen.
Im obigen Beispiel mit den Dienstanforderungen können Sie sie beispielsweise durch ihre ID trennen, wodurch die ID mit festen HIGH-Bytes für verschiedene Server generiert wird. Das heißt, wenn 32 Bit zum Speichern der ID verwendet werden, geben die linken zwei, drei, vier oder mehr Bits nach Bedarf den Server an, auf dem diese Anwendungen gespeichert sind. Somit verfügt jeder Server über einen eigenen ID-Pool.
Der Kernel eines einzelnen Servers kann unabhängig von anderen Servern funktionieren, ohne etwas darüber zu wissen. Beim Erstellen eines Objekts erhält der Server mit der Mindestanzahl der verwendeten IDs eine hohe Priorität, um eine gleichmäßige Lastverteilung sicherzustellen.
Angesichts einer begrenzten Anzahl möglicher Variationen von Anforderungen und Antworten in einer solchen Datenorganisation benötigen Sie einen relativ kompakten Dispatcher, der Anforderungen auf Server verteilt und deren Ergebnisse aggregiert.