Är multi-modell DBMS grunden för moderna informationssystem?

Moderna informationssystem Àr ganska komplexa. Inte minst av allt beror deras komplexitet pÄ komplexiteten hos de data som behandlas i dem. Datans komplexitet ligger ofta i mÀngden datamodeller som anvÀnds. SÄ, till exempel, nÀr data blir "stora", Àr en av de problematiska egenskaperna inte bara dess volym ("volym"), utan ocksÄ dess variation ("variation").

Om du Ànnu inte hittar en brist i resonemanget, lÀs vidare.

Är multi-modell DBMS grunden för moderna informationssystem?


InnehÄll

Polyglott uthÄllighet
Multimodell
Multi-modell DBMS baserat pÄ relationsmodellen
     Dokumentmodell i MS SQL Server
     Grafmodell i MS SQL Server
Multi-modell DBMS baserat pÄ dokumentmodellen
     Relationsmodell i MarkLogic
     Grafmodell i MarkLogic
Multi-modell DBMS "utan en huvudmodell"
     ArangoDB
     OrientDB
     Azure CosmosDB
Multi-modell DBMS baserat pÄ en grafmodell?
Slutsats
Interview

Polyglott uthÄllighet

OvanstÄende leder till det faktum att det ibland Àven inom ramen för ett system Àr nödvÀndigt att anvÀnda flera olika DBMS:er för att lagra data och lösa olika problem med att bearbeta dem, som var och en stöder sin egen datamodell. Med M. Fowlers lÀtta hand, författare ett antal kÀnda böcker och en av medförfattare Agile Manifesto kallas denna situation lagring med flera varianter ("polyglot persistens").

Fowler har ocksÄ följande exempel pÄ att organisera datalagring i en fullfjÀdrad och högbelastningsapplikation inom e-handelsomrÄdet.

Är multi-modell DBMS grunden för moderna informationssystem?

Detta exempel Àr förstÄs nÄgot överdrivet, men vissa övervÀganden som talar för att vÀlja ett eller annat DBMS för motsvarande ÀndamÄl kan t.ex. hÀr.

Det Àr klart att det inte Àr lÀtt att vara tjÀnare i en sÄdan djurpark.

  • MĂ€ngden kod som utför datalagring vĂ€xer i proportion till antalet anvĂ€nda DBMS; mĂ€ngden kodsynkroniseringsdata Ă€r bra om inte proportionell mot kvadraten pĂ„ detta tal.
  • Som en multipel av antalet anvĂ€nda DBMS ökar kostnaderna för att tillhandahĂ„lla företagsegenskaper (skalbarhet, feltolerans, hög tillgĂ€nglighet) för var och en av de anvĂ€nda DBMS.
  • Det Ă€r omöjligt att sĂ€kerstĂ€lla företagsegenskaperna för lagringsdelsystemet som helhet - sĂ€rskilt transaktionalitet.

Ur djurparksdirektörens synvinkel ser allt ut sÄ hÀr:

  • En multipel ökning av kostnaden för licenser och teknisk support frĂ„n DBMS-tillverkaren.
  • Överbemanning och ökade deadlines.
  • Direkta ekonomiska förluster eller pĂ„följder pĂ„ grund av datainkonsekvens.

Det finns en betydande ökning av systemets totala Àgandekostnad (TCO). Finns det nÄgon vÀg ut ur situationen med "flera lagringsalternativ"?

Multimodell

Termen "multivariatlagring" kom i bruk 2011. Medvetenheten om problemen med tillvÀgagÄngssÀttet och sökandet efter en lösning tog flera Är, och 2015 formulerades svaret genom Gartners analytikers mun:

Det verkar som att Gartners analytiker denna gĂ„ng hade rĂ€tt med sin prognos. Om du gĂ„r till sidan med huvudbetyg DBMS pĂ„ DB-Engines, det kan du seĐŸDe flesta av dess ledare positionerar sig specifikt som multi-modell DBMS. Detsamma kan ses pĂ„ sidan med valfritt privat betyg.

Tabellen nedan visar DBMS - de ledande i var och en av de privata betygen, som pÄstÄr sig vara multimodeller. För varje DBMS anges den ursprungliga stödda modellen (som en gÄng var den enda) och tillsammans med den de modeller som stöds för nÀrvarande. OcksÄ listade Àr DBMS som positionerar sig som "ursprungligen multi-modell" och, enligt skaparna, inte har nÄgon initial Àrvd modell.

DBMSInitial modellYtterligare modeller
OracleRelationelltGraf, dokument
MSSQLRelationelltGraf, dokument
PostgreSQLRelationelltGraf*, dokument
MarklogicDokumentÀrGraf, relationell
MongoDBDokumentÀrNyckel-vÀrde, diagram*
DataStaxBred kolumnDokumentÀr, graf
RedisNyckelvÀrdeDokumentÀr, graf*
ArangoDB-Graf, dokument
OrientDB-Graf, dokument, relationell
Azure CosmosDB-Graf, dokument, relationell

Tabellanteckningar

Asterisker i tabellen markerar uttalanden som krÀver reservationer:

  • PostgreSQL DBMS stöder inte grafdatamodellen, men den hĂ€r produkten stöder det baserat pĂ„ det, sĂ„som AgensGraph.
  • I förhĂ„llande till MongoDB Ă€r det mer korrekt att tala om förekomsten av grafoperatorer i frĂ„gesprĂ„ket ($lookup, $graphLookup) Ă€n om att stödja grafmodellen, Ă€ven om deras införande naturligtvis krĂ€vde vissa optimeringar pĂ„ den fysiska lagringsnivĂ„n i riktning mot att stödja grafmodellen.
  • I förhĂ„llande till Redis menar vi förlĂ€ngningen RedisGraph.

DÀrefter kommer vi för var och en av klasserna att visa hur stöd för flera modeller implementeras i DBMS frÄn denna klass. Vi kommer att betrakta relations-, dokument- och grafmodellerna som de viktigaste och anvÀnda exempel pÄ specifika DBMS:er för att visa hur de "saknade" implementeras.

Multi-modell DBMS baserat pÄ relationsmodellen

De ledande DBMS:erna Àr för nÀrvarande relationella; Gartners prognos kunde inte anses vara sann om RDBMS:erna inte visade rörelse i riktning mot multimodellering. Och de demonstrerar. Nu kan tanken att en multimodell DBMS Àr som en schweizisk kniv, som inte kan göra nÄgot bra, riktas direkt till Larry Ellison.

Författaren föredrar dock implementeringen av multimodellering i Microsoft SQL Server, pÄ vilket exemplet RDBMS-stöd för dokument- och grafmodeller kommer att beskrivas.

Dokumentmodell i MS SQL Server

Det har redan funnits tvÄ utmÀrkta artiklar om Habré om hur MS SQL Server implementerar stöd för dokumentmodellen; Jag kommer att begrÀnsa mig till en kort ÄterberÀttelse och kommentar:

SÀttet att stödja dokumentmodellen i MS SQL Server Àr ganska typiskt för relationella DBMS:er: JSON-dokument föreslÄs lagras i vanliga textfÀlt. Stöd för dokumentmodellen Àr att tillhandahÄlla speciella operatörer för att analysera denna JSON:

  • JSON_VALUE för att extrahera skalĂ€ra attributvĂ€rden,
  • JSON_QUERY att extrahera underdokument.

Det andra argumentet för bÄda operatorerna Àr ett uttryck i JSONPath-liknande syntax.

Sammanfattningsvis kan vi sÀga att dokument som lagras pÄ detta sÀtt inte Àr "förstklassiga enheter" i ett relationellt DBMS, till skillnad frÄn tupler. Specifikt i MS SQL Server finns det för nÀrvarande inga index pÄ fÀlten för JSON-dokument, vilket gör det svÄrt att sammanfoga tabeller med vÀrdena för dessa fÀlt och till och med vÀlja dokument med dessa vÀrden. Det Àr dock möjligt att skapa en berÀknad kolumn för ett sÄdant fÀlt och ett index pÄ det.

Dessutom ger MS SQL Server möjligheten att bekvÀmt konstruera ett JSON-dokument frÄn innehÄllet i tabeller med hjÀlp av operatorn FOR JSON PATH - en möjlighet, i viss mening, motsatt den tidigare, konventionell lagring. Det Àr uppenbart att oavsett hur snabbt ett RDBMS Àr sÄ motsÀger detta tillvÀgagÄngssÀtt ideologin för dokument-DBMS, som i huvudsak lagrar fÀrdiga svar pÄ populÀra frÄgor, och kan bara lösa problem med enkel utveckling, men inte hastighet.

Slutligen lÄter MS SQL Server dig lösa det motsatta problemet med dokumentkonstruktion: du kan dekomponera JSON i tabeller med OPENJSON. Om dokumentet inte Àr helt platt mÄste du anvÀnda CROSS APPLY.

Grafmodell i MS SQL Server

Stöd för grafmodellen (LPG) Àr ocksÄ fullt implementerat i Microsoft SQL Server förutsÀgbart: Det föreslÄs att anvÀnda speciella tabeller för att lagra noder och för att lagra grafkanter. SÄdana tabeller skapas med hjÀlp av uttryck CREATE TABLE AS NODE О CREATE TABLE AS EDGE respektive.

Tabeller av den första typen liknar vanliga tabeller för lagring av poster, med den enda externa skillnaden Ă€r att tabellen innehĂ„ller ett systemfĂ€lt $node_id — unik identifierare för en grafnod i databasen.

PÄ liknande sÀtt har tabeller av den andra typen systemfÀlt $from_id О $to_id, poster i sÄdana tabeller definierar tydligt kopplingarna mellan noder. En separat tabell anvÀnds för att lagra relationer av varje typ.

Är multi-modell DBMS grunden för moderna informationssystem? LĂ„t oss illustrera detta med ett exempel. LĂ„t grafdata ha en layout som den som visas i figuren. För att sedan skapa motsvarande struktur i databasen mĂ„ste du köra följande DDL-frĂ„gor:

CREATE TABLE Person (
  ID INTEGER NOT NULL,
  name VARCHAR(100)
) AS NODE;

CREATE TABLE Cafe (
  ID INTEGER NOT NULL, 
  name VARCHAR(100), 
) AS NODE;

CREATE TABLE likes (
  rating INTEGER
) AS EDGE;

CREATE TABLE friendOf
  AS EDGE;

ALTER TABLE likes
  ADD CONSTRAINT EC_LIKES CONNECTION (Person TO Cafe);

Den huvudsakliga specificiteten för sÄdana tabeller Àr att det i frÄgor mot dem Àr möjligt att anvÀnda grafmönster med Cypher-liknande syntax (dock "*"etc. stöds inte Ànnu). Baserat pÄ prestandamÀtningar kan det ocksÄ antas att sÀttet som data lagras i dessa tabeller skiljer sig frÄn hur data lagras i vanliga tabeller och Àr optimerat för att utföra sÄdana graffrÄgor.

SELECT Cafe.name
  FROM Person, likes, Cafe
  WHERE MATCH (Person-(friendOf)-(likes)->Cafe)
  AND Person.name = 'John';

Dessutom Àr det ganska svÄrt att inte anvÀnda dessa grafmönster nÀr man arbetar med sÄdana tabeller, eftersom det i vanliga SQL-frÄgor för att lösa liknande problem kommer att vara nödvÀndigt att göra ytterligare anstrÀngningar för att erhÄlla systemets "graf"-nodidentifierare ($node_id, $from_id, $to_id; Av samma anledning visas inte frÄgor för att infoga data hÀr eftersom de Àr onödigt krÄngliga).

För att sammanfatta beskrivningen av implementeringarna av dokument- och grafmodellerna i MS SQL Server, vill jag notera att sÄdana implementeringar av en modell ovanpÄ en annan inte verkar framgÄngsrika, frÀmst ur sprÄkdesignsynpunkt. Det Àr nödvÀndigt att utöka ett sprÄk med ett annat, sprÄken Àr inte helt "ortogonala", kompatibilitetsreglerna kan vara ganska bisarra.

Multi-modell DBMS baserat pÄ dokumentmodellen

I det hÀr avsnittet skulle jag vilja illustrera implementeringen av multimodell i dokument-DBMS med exemplet pÄ den inte mest populÀra av dem, MongoDB (som sagt, den har bara villkorade grafoperatorer $lookup О $graphLookup, arbetar inte med fragmenterade samlingar), utan anvÀnder exemplet med ett mer mogen och "företagande" DBMS Marklogic.

SÄ lÄt samlingen innehÄlla en uppsÀttning XML-dokument av följande typ (MarkLogic lÄter dig ocksÄ lagra JSON-dokument):

<Person INN="631803299804">
  <name>John</name>
  <surname>Smith</surname>
</Person>

Relationsmodell i MarkLogic

En relationsvy av en samling dokument kan skapas med hjÀlp av visa mall (innehÄll av element value i exemplet nedan kan det finnas en godtycklig XPath):

<template >
  <context>/Person</context>
  <rows>
    <row>
      <view-name>Person</view-name>
      <columns>
        <column>
          <name>SSN</name>
          <value>@SSN</value>
          <type>string</type>
        </column>
        <column>
          <name>name</name>
          <value>name</value>
        </column>
        <column>
          <name>surname</name>
          <value>surname</value>
        </column>
      </columns>
    </row>
  <rows>
</template>

Du kan adressera den skapade vyn med en SQL-frÄga (till exempel via ODBC):

SELECT name, surname FROM Person WHERE name="John"

TyvÀrr Àr den relationsvy som skapas av visningsmallen skrivskyddad. Vid bearbetning av en begÀran om det kommer MarkLogic att försöka anvÀnda dokumentindex. Tidigare hade MarkLogic begrÀnsade relationella Äsikter, helt och hÄllet indexbaserad och skrivbara, men nu anses de förÄldrade.

Grafmodell i MarkLogic

Med stöd för grafmodellen (RDF) Ă€r allt ungefĂ€r sig likt. Återigen med hjĂ€lp visa mall du kan skapa en RDF-representation av en samling dokument frĂ„n exemplet ovan:

<template >
  <context>/Person</context>
    <vars>
      <var>
        <name>PREFIX</name>
        <val>"http://example.org/example#"</val>
      </var>
    </vars>
  <triples>
    <triple>
      <subject><value>sem:iri( $PREFIX || @SSN )</value></subject>
      <predicate><value>sem:iri( $PREFIX || surname )</value></predicate>
      <object><value>xs:string( surname )</value></object>
    </triple>
    <triple>
      <subject><value>sem:iri( $PREFIX || @SSN )</value></subject>
      <predicate><value>sem:iri( $PREFIX || name )</value></predicate>
      <object><value>xs:string( name )</value></object>
    </triple>
  </triples>
  </template>

Du kan adressera den resulterande RDF-grafen med en SPARQL-frÄga:

PREFIX : <http://example.org/example#>
SELECT ?name ?surname {
  :631803299804 :name ?name ; :surname ?surname .
}

Till skillnad frÄn den relationella stöder MarkLogic grafmodellen pÄ tvÄ andra sÀtt:

  1. Ett DBMS kan vara en fullfjÀdrad separat lagring av RDF-data (tripletter i den kommer att anropas förvaltade i motsats till de ovan beskrivna extraherades).
  2. RDF i speciell serialisering kan helt enkelt infogas i XML- eller JSON-dokument (och tripletter kommer dÄ att anropas opÄverkad). Detta Àr förmodligen ett alternativ till mekanismer idref etc.

En bra uppfattning om hur saker "verkligen" fungerar i MarkLogic ges av Optiskt API, i denna mening Àr det lÄgnivÄ, Àven om dess syfte snarare Àr det motsatta - att försöka abstrahera frÄn den anvÀnda datamodellen, för att sÀkerstÀlla konsekvent arbete med data i olika modeller, transaktionalitet, etc.

Multi-modell DBMS "utan en huvudmodell"

Det finns Àven DBMS pÄ marknaden som positionerar sig som initialt multimodeller, utan nÄgon Àrvd huvudmodell. Dessa inkluderar ArangoDB, OrientDB (sedan 2018 tillhör utvecklingsbolaget SAP) och CosmosDB (tjÀnst som en del av Microsoft Azure molnplattform).

Faktum Àr att det finns "kÀrnmodeller" i ArangoDB och OrientDB. I bÄda fallen Àr det deras egna datamodeller, som Àr generaliseringar av dokument ett. Generaliseringarna Àr frÀmst till för att underlÀtta möjligheten att utföra frÄgor av grafisk och relationell karaktÀr.

Dessa modeller Ă€r de enda som Ă€r tillgĂ€ngliga för anvĂ€ndning i det angivna DBMS; deras egna frĂ„gesprĂ„k Ă€r designade för att fungera med dem. Naturligtvis Ă€r sĂ„dana modeller och DBMS lovande, men bristen pĂ„ kompatibilitet med standardmodeller och sprĂ„k gör det omöjligt att anvĂ€nda dessa DBMS i Ă€ldre system – för att ersĂ€tta de DBMS som redan anvĂ€nds dĂ€r.

Det fanns redan en underbar artikel om ArangoDB och OrientDB pÄ Habré: JOIN i NoSQL-databaser.

ArangoDB

ArangoDB hÀvdar stöd för en grafdatamodell.

Noderna i en graf i ArangoDB Àr vanliga dokument, och kanterna Àr dokument av en speciell typ som tillsammans med vanliga systemfÀlt har (_key, _id, _rev) systemfÀlt _from О _to. Dokument i dokument-DBMS kombineras traditionellt till samlingar. Samlingar av dokument som representerar kanter kallas kantsamlingar i ArangoDB. Kantsamlingsdokument Àr förresten ocksÄ dokument, sÄ kanter i ArangoDB kan ocksÄ fungera som noder.

RĂ„ data

LÄt oss ha en samling persons, vars dokument ser ut sÄ hÀr:

[
  {
    "_id"  : "people/alice" ,
    "_key" : "alice" ,
    "name" : "АлОса"
  },
  {
    "_id"  : "people/bob" ,
    "_key" : "bob" ,
    "name" : "Đ‘ĐŸĐ±"  
  }
]

LÄt det ocksÄ finnas en samling cafes:

[
  {
    "_id" : "cafes/jd" ,
    "_key" : "jd" ,
    "name" : "Đ”Đ¶ĐŸĐœ Đ”ĐŸĐœĐœ"  
  },
  {
    "_id" : "cafes/jj" ,
    "_key" : "jj" ,
    "name" : "Đ–Đ°Đœ-ЖаĐș"
  }
]

Sedan samlingen likes kan se ut sÄ hÀr:

[
  {
    "_id" : "likes/1" ,
    "_key" : "1" ,
    "_from" : "persons/alice" ,
    "_to" : "cafes/jd",
    "since" : 2010 
  },
  {
    "_id" : "likes/2" ,
    "_key" : "2" ,
    "_from" : "persons/alice" ,
    "_to" : "cafes/jj",
    "since" : 2011 
  } ,
  {
    "_id" : "likes/3" ,
    "_key" : "3" ,
    "_from" : "persons/bob" ,
    "_to" : "cafes/jd",
    "since" : 2012 
  }
]

FrÄgor och resultat

En frÄga i grafisk stil i AQL-sprÄket som anvÀnds i ArangoDB, som returnerar information i lÀsbar form om vem som gillar vilket kafé, ser ut sÄ hÀr:

FOR p IN persons
  FOR c IN OUTBOUND p likes
  RETURN { person : p.name , likes : c.name }

I en relationsstil, dÀr vi "berÀknar" relationer snarare Àn att lagra dem, kan denna frÄga skrivas om sÄ hÀr (förresten, utan samlingen likes kunde klara sig utan):

FOR p IN persons
  FOR l IN likes
  FILTER p._key == l._from
    FOR c IN cafes
    FILTER l._to == c._key
    RETURN { person : p.name , likes : c.name }

Resultatet i bÄda fallen blir detsamma:

[
  { "person" : "АлОса" , likes : "Đ–Đ°Đœ-ЖаĐș" } ,
  { "person" : "АлОса" , likes : "Đ”Đ¶ĐŸĐœ Đ”ĐŸĐœĐœ" } ,
  { "person" : "Đ‘ĐŸĐ±" , likes : "Đ”Đ¶ĐŸĐœ Đ”ĐŸĐœĐœ" }
]

Fler frÄgor och resultat

Om resultatformatet ovan verkar vara mer typiskt för en relations-DBMS Àn för ett dokument-DBMS, kan du prova den hÀr frÄgan (eller sÄ kan du anvÀnda COLLECT):

FOR p IN persons
  RETURN {
    person : p.name,
    likes : (
      FOR c IN OUTBOUND p likes
      RETURN c.name
    )
}

Resultatet kommer att se ut sÄ hÀr:

[
  { "person" : "АлОса" , likes : ["Đ–Đ°Đœ-ЖаĐș" , "Đ”Đ¶ĐŸĐœ Đ”ĐŸĐœĐœ"]  } ,
  { "person" : "Đ‘ĐŸĐ±" , likes : ["Đ”Đ¶ĐŸĐœ Đ”ĐŸĐœĐœ"] }
]

OrientDB

Grunden för att implementera en grafmodell ovanpĂ„ en dokumentmodell i OrientDB Ă€r möjlighet dokumentfĂ€lt har, förutom mer eller mindre standardskalĂ€ra vĂ€rden, Ă€ven vĂ€rden av typer som t.ex LINK, LINKLIST, LINKSET, LINKMAP Đž LINKBAG. VĂ€rdena för dessa typer Ă€r lĂ€nkar eller samlingar av lĂ€nkar till systemidentifierare dokument.

Dokumentidentifieraren som tilldelas av systemet har en "fysisk betydelse", som indikerar postens position i databasen, och ser ut ungefÀr sÄ hÀr: @rid : #3:16. SÄledes Àr vÀrdena för referensegenskaper egentligen pekare (som i grafmodellen) snarare Àn urvalsvillkor (som i relationsmodellen).

Liksom ArangoDB representeras kanter i OrientDB som separata dokument (Àven om en kant inte har sina egna egenskaper kan den göras lÀttvikt, och det kommer inte att motsvara ett separat dokument).

RĂ„ data

I ett format nÀra dump-format OrientDB databas, data frÄn föregÄende exempel för ArangoDB skulle se ut ungefÀr sÄ hÀr:

[
     {
      "@type": "document",
      "@rid": "#11:0",
      "@class": "Person",
      "name": "АлОса",
      "out_likes": [
        "#30:1",
        "#30:2"
      ],
      "@fieldTypes": "out_likes=LINKBAG"
    },
    {
      "@type": "document",
      "@rid": "#12:0",
      "@class": "Person",
      "name": "Đ‘ĐŸĐ±",
      "out_likes": [
        "#30:3"
      ],
      "@fieldTypes": "out_likes=LINKBAG"
    },
    {
      "@type": "document",
      "@rid": "#21:0",
      "@class": "Cafe",
      "name": "Đ–Đ°Đœ-ЖаĐș",
      "in_likes": [
        "#30:2",
        "#30:3"
      ],
      "@fieldTypes": "in_likes=LINKBAG"
    },
    {
      "@type": "document",
      "@rid": "#22:0",
      "@class": "Cafe",
      "name": "Đ”Đ¶ĐŸĐœ Đ”ĐŸĐœĐœ",
      "in_likes": [
        "#30:1"
      ],
      "@fieldTypes": "in_likes=LINKBAG"
    },
    {
      "@type": "document",
      "@rid": "#30:1",
      "@class": "likes",
      "in": "#22:0",
      "out": "#11:0",
      "since": 1262286000000,
      "@fieldTypes": "in=LINK,out=LINK,since=date"
    },
    {
      "@type": "document",
      "@rid": "#30:2",
      "@class": "likes",
      "in": "#21:0",
      "out": "#11:0",
      "since": 1293822000000,
      "@fieldTypes": "in=LINK,out=LINK,since=date"
    },
    {
      "@type": "document",
      "@rid": "#30:3",
      "@class": "likes",
      "in": "#21:0",
      "out": "#12:0",
      "since": 1325354400000,
      "@fieldTypes": "in=LINK,out=LINK,since=date"
    }
  ]

Som vi kan se lagrar hörn ocksÄ information om inkommande och utgÄende kanter. PÄ anvÀnder sig av Document API mÄste sjÀlv övervaka referensintegriteten, och Graph API tar pÄ sig detta arbete. Men lÄt oss se hur Ätkomst till OrientDB ser ut i "rena" frÄgesprÄk som inte Àr integrerade i programmeringssprÄk.

FrÄgor och resultat

En frÄga som till sin syfte liknar frÄgan frÄn exemplet för ArangoDB i OrientDB ser ut sÄ hÀr:

SELECT name AS person_name, OUT('likes').name AS cafe_name
   FROM Person
   UNWIND cafe_name

Resultatet kommer att erhÄllas i följande form:

[
  { "person_name": "АлОса", "cafe_name": "Đ”Đ¶ĐŸĐœ Đ”ĐŸĐœĐœ" },
  { "person_name": "АлОса", "cafe_name": "Đ–Đ°Đœ-ЖаĐș" },
  { "person_name": "Đ‘ĐŸĐ±",  "cafe_name": "Đ–Đ°Đœ-ЖаĐș" }
]

Om resultatformatet igen verkar för "relationellt", mÄste du ta bort raden med UNWIND():

[
  { "person_name": "АлОса", "cafe_name": [ "Đ”Đ¶ĐŸĐœ Đ”ĐŸĐœĐœ", "Đ–Đ°Đœ-ЖаĐș" ] },
  { "person_name": "Đ‘ĐŸĐ±",  "cafe_name": [ "Đ–Đ°Đœ-ЖаĐș" ' }
]

OrientDB:s frÄgesprÄk kan beskrivas som SQL med Gremlin-liknande inlÀgg. I version 2.2 dök ett Cypher-liknande begÀrandeformulÀr upp, MATCH :

MATCH {CLASS: Person, AS: person}-likes->{CLASS: Cafe, AS: cafe}
RETURN person.name AS person_name, LIST(cafe.name) AS cafe_name
GROUP BY person_name

Resultatformatet kommer att vara detsamma som i föregÄende begÀran. TÀnk pÄ vad som behöver tas bort för att göra det mer "relationellt", som i den allra första frÄgan.

Azure CosmosDB

I mindre utstrÀckning gÀller det som sades ovan om ArangoDB och OrientDB för Azure CosmosDB. CosmosDB tillhandahÄller följande dataÄtkomst-API:er: SQL, MongoDB, Gremlin och Cassandra.

SQL API och MongoDB API anvÀnds för att komma Ät data i dokumentmodellen. Gremlin API och Cassandra API - för Ätkomst av data i graf- respektive kolumnformat. Data i alla modeller sparas i CosmosDBs interna modellformat: ARS ("atom-rekord-sekvens"), som ocksÄ ligger nÀra dokumentet en.

Är multi-modell DBMS grunden för moderna informationssystem?

Men datamodellen som valts av anvÀndaren och API:et som anvÀnds Àr fasta vid tidpunkten för att skapa ett konto i tjÀnsten. Det Àr inte möjligt att komma Ät data som laddats i en modell i en annan modells format, vilket illustreras av nÄgot i stil med detta:

Är multi-modell DBMS grunden för moderna informationssystem?

SÄledes, multi-modell i Azure CosmosDB idag Àr bara möjligheten att anvÀnda flera databaser som stöder olika modeller frÄn en tillverkare, vilket inte löser alla problem med multi-variant lagring.

Multi-modell DBMS baserat pÄ en grafmodell?

AnmÀrkningsvÀrt Àr det faktum att det Ànnu inte finns nÄgra flermodells-DBMS pÄ marknaden som Àr baserade pÄ en grafmodell (förutom stöd för flera modeller för samtidigt tvÄ grafmodeller: RDF och LPG; se detta i tidigare publicering). De största svÄrigheterna orsakas av implementeringen av en dokumentmodell ovanpÄ en grafmodell, snarare Àn en relationsmodell.

FrÄgan om hur man implementerar en relationsmodell ovanpÄ grafmodellen övervÀgdes Àven under bildandet av den senare. Hur han sadeTill exempel, David McGovern:

Det finns inget inneboende i grafmetoden som hindrar att skapa ett lager (t.ex. genom lÀmplig indexering) pÄ en grafdatabas som möjliggör en relationsvy med (1) ÄterhÀmtning av tupler frÄn de vanliga nyckelvÀrdesparen och (2) gruppering av tupler efter relationstyp.

NÀr du implementerar en dokumentmodell ovanpÄ en grafmodell mÄste du till exempel tÀnka pÄ följande:

  • Element i en JSON-array anses vara ordnade, men de som kommer frĂ„n spetsen pĂ„ en kant av grafen Ă€r det inte;
  • Data i dokumentmodellen denormaliseras vanligtvis; du vill fortfarande inte lagra flera kopior av samma inbĂ€ddade dokument, och underdokument har vanligtvis inga identifierare;
  • Å andra sidan Ă€r ideologin med dokument-DBMS:er att dokument Ă€r fĂ€rdiga "aggregat" som inte behöver byggas pĂ„ nytt varje gĂ„ng. Det krĂ€vs att grafmodellen har möjlighet att snabbt fĂ„ en subgraf som motsvarar det fĂ€rdiga dokumentet.

En del reklam

Författaren till artikeln Àr relaterad till utvecklingen av NitrosBase DBMS, vars interna modell Àr graf, och de externa modellerna - relationella och dokument - Àr dess representationer. Alla modeller Àr lika: nÀstan all data Àr tillgÀnglig i nÄgon av dem med ett frÄgesprÄk som Àr naturligt för det. Dessutom kan data Àndras i vilken vy som helst. FörÀndringar kommer att Äterspeglas i den interna modellen och följaktligen i andra synpunkter.

Jag kommer förhoppningsvis att beskriva hur modellmatchning ser ut i NitrosBase i nÄgon av följande artiklar.

Slutsats

Jag hoppas att de allmÀnna konturerna av det som kallas multimodellering har blivit mer eller mindre tydliga för lÀsaren. Multi-modell DBMS Àr ganska olika, och "multi-model support" kan se olika ut. För att förstÄ vad som kallas "multimodell" i varje specifikt fall Àr det anvÀndbart att svara pÄ följande frÄgor:

  1. Pratar vi om att stödja traditionella modeller eller nÄgon form av "hybrid" modell?
  2. Är modellerna "lika", eller Ă€r en av dem föremĂ„l för de andra?
  3. Är modellerna "likgiltiga" för varandra? Kan data skrivna i en modell lĂ€sas i en annan eller till och med skrivas över?

Jag tror att frÄgan om relevansen av multi-modell DBMS redan kan besvaras positivt, men den intressanta frÄgan Àr vilka typer av dem som kommer att vara mer efterfrÄgade inom en snar framtid. Det verkar som om DBMS med flera modeller som stöder traditionella modeller, i första hand relationsbaserade, kommer att ha större efterfrÄgan; Populariteten hos multi-modell DBMS, som erbjuder nya modeller som kombinerar fördelarna med olika traditionella, Àr en frÄga om en lÀngre framtid.

Endast registrerade anvÀndare kan delta i undersökningen. Logga in, SnÀlla du.

AnvÀnder du multi-model DBMS?

  • Vi anvĂ€nder det inte, vi lagrar allt i ett DBMS och i en modell

  • Vi anvĂ€nder flera modeller av traditionella DBMS:er

  • Vi övar polyglott uthĂ„llighet

  • Vi anvĂ€nder nya multi-modell DBMS (Arango, Orient, CosmosDB)

19 anvÀndare röstade. 4 anvÀndare avstod frÄn att rösta.

KĂ€lla: will.com

LĂ€gg en kommentar