Puas yog ntau tus qauv DBMSs yog lub hauv paus ntawm cov ntaub ntawv niaj hnub?

Niaj hnub nimno cov ntaub ntawv systems yog heev complex. Tsis tas li ntawd, lawv cov complexity yog vim cov complexity ntawm cov ntaub ntawv ua nyob rau hauv lawv. Lub complexity ntawm cov ntaub ntawv feem ntau nyob rau hauv ntau yam ntawm cov ntaub ntawv qauv siv. Yog li, piv txwv li, thaum cov ntaub ntawv dhau los "loj", ib qho ntawm cov yam ntxwv teeb meem tsis yog nws qhov ntim (" ntim "), tab sis kuj muaj ntau yam ("ntau").

Yog tias koj tseem tsis tau pom qhov tsis txaus ntseeg hauv qhov laj thawj, nyeem ntxiv.

Puas yog ntau tus qauv DBMSs yog lub hauv paus ntawm cov ntaub ntawv niaj hnub?


Txheem

Polyglot persistence
Ntau tus qauv
Ntau tus qauv DBMS raws li tus qauv kev sib raug zoo
     Cov ntaub ntawv qauv hauv MS SQL Server
     Graph qauv hauv MS SQL Server
Ntau tus qauv DBMS raws li cov qauv ntaub ntawv
     Cov qauv kev sib raug zoo hauv MarkLogic
     Cov qauv duab hauv MarkLogic
Multi-model DBMS "tsis muaj tus qauv tseem ceeb"
     ArangoDB
     OrientDB
     Azure CosmosDB
Ntau tus qauv DBMS raws li tus qauv duab?
xaus
Poll

Polyglot persistence

Cov saum toj no ua rau lub fact tias tej zaum txawm nyob rau hauv lub moj khaum ntawm ib tug system nws yog tsim nyog los siv ob peb txawv DBMSs los khaws cov ntaub ntawv thiab daws tau ntau yam teeb meem ntawm kev ua lawv, txhua yam uas txhawb nws tus kheej cov ntaub ntawv qauv. Nrog lub teeb tes ntawm M. Fowler, tus sau ib tug xov tooj ntawm cov phau ntawv nto moo thiab ib qho ntawm co-sau Agile Manifesto, qhov xwm txheej no hu ua multi-variant cia ("polyglot persistence").

Fowler tseem muaj cov piv txwv hauv qab no ntawm kev teeb tsa cov ntaub ntawv khaws cia hauv daim ntawv thov kev ua haujlwm puv ntoob thiab siab-load hauv kev lag luam e-lag luam.

Puas yog ntau tus qauv DBMSs yog lub hauv paus ntawm cov ntaub ntawv niaj hnub?

Qhov piv txwv no, ntawm chav kawm, yog me ntsis exaggerated, tab sis qee qhov kev xav hauv kev pom zoo ntawm kev xaiv ib lossis lwm DBMS rau lub hom phiaj sib xws tuaj yeem pom, piv txwv li, no.

Nws pom tseeb tias kev ua tub qhe hauv lub vaj tsiaj zoo li no tsis yooj yim.

  • Tus lej ntawm cov lej uas ua cov ntaub ntawv khaws cia loj hlob raws li tus lej ntawm DBMSs siv; tus lej code synchronizing cov ntaub ntawv yog qhov zoo yog tias tsis proportional rau lub square ntawm tus lej no.
  • Raws li ntau tus naj npawb ntawm DBMSs siv, cov nqi ntawm kev muab cov yam ntxwv ntawm kev lag luam (scalability, txhaum kam rau ua, siab muaj) ntawm txhua qhov ntawm DBMSs siv nce.
  • Nws yog tsis yooj yim sua kom paub meej lub lag luam yam ntxwv ntawm lub cia subsystem tag nrho - tshwj xeeb tshaj yog kev lag luam.

Los ntawm qhov pom ntawm tus thawj coj zoo, txhua yam zoo li no:

  • Kev nce nqi ntau ntawm cov ntawv tso cai thiab kev txhawb nqa los ntawm DBMS cov chaw tsim khoom.
  • Kev ua haujlwm ntau dhau thiab nce sijhawm sijhawm.
  • Kev poob nyiaj ncaj qha lossis raug nplua vim cov ntaub ntawv tsis sib xws.

Muaj qhov nce ntxiv hauv qhov system tag nrho cov nqi ntawm cov tswv cuab (TCO). Puas muaj ib txoj hauv kev tawm ntawm qhov xwm txheej ntawm "ntau qhov kev xaiv cia"?

Ntau tus qauv

Lo lus "multivariate cia" tau siv rau xyoo 2011. Kev paub txog cov teeb meem ntawm txoj hauv kev thiab kev tshawb nrhiav kev daws teeb meem tau siv ntau xyoo, thiab los ntawm 2015, los ntawm lub qhov ncauj ntawm Gartner cov kws tshuaj ntsuam, cov lus teb tau tsim:

Nws zoo nkaus li lub sijhawm no Gartner cov kws tshuaj ntsuam tau raug nrog lawv cov kev kwv yees. Yog koj mus rau nplooj ntawv nrog qhov ntsuas tseem ceeb DBMS ntawm DB-Engines, koj tuaj yeem pom qhov ntawdоFeem ntau ntawm nws cov thawj coj muab lawv tus kheej tshwj xeeb ua ntau hom DBMSs. Tib yam tuaj yeem pom ntawm nplooj ntawv nrog rau kev ntaus nqi ntiag tug.

Cov lus hauv qab no qhia txog DBMS - cov thawj coj hauv txhua qhov kev ntaus nqi ntiag tug, uas thov kom muaj ntau tus qauv. Rau txhua DBMS, tus qauv txhawb nqa thawj (uas yog ib zaug nkaus xwb) thiab nrog rau nws cov qauv kev txhawb nqa tam sim no tau qhia. Kuj tseem muaj npe yog DBMSs uas tso lawv tus kheej li "thawj ntau tus qauv" thiab, raws li cov neeg tsim, tsis muaj cov qauv qub qub.

DBMS Thawj qauv Cov qauv ntxiv
Oracle Kev txheeb ze Graph, ntaub ntawv
MS SQL ib Kev txheeb ze Graph, ntaub ntawv
PostgreSQL Kev txheeb ze Graph *, cov ntaub ntawv
MarkLogic Documentary Graph, kev sib raug zoo
MongoDB Documentary Qhov tseem ceeb-tus nqi, graph *
Cov Ntawv Qhia Dav-kem Documentary, duab
Redis Tus nqi tseem ceeb Documentary, duab *
ArangoDB - Graph, ntaub ntawv
OrientDB - Graph, ntaub ntawv, kev sib raug zoo
Azure CosmosDB - Graph, ntaub ntawv, kev sib raug zoo

Cov ntawv sau rau ntawm lub rooj

Asterisks nyob rau hauv lub rooj cim cov nqe lus uas yuav tsum tau reservation:

  • PostgreSQL DBMS tsis txhawb nqa cov qauv duab, tab sis cov khoom no txhawb nws raws li nws, xws li AgensGraph.
  • Hauv kev sib raug zoo rau MongoDB, nws yog qhov tseeb dua los tham txog qhov muaj cov neeg ua haujlwm graph hauv cov lus nug ($lookup, $graphLookup) tshaj li kev txhawb nqa tus qauv duab, txawm hais tias, tau kawg, lawv cov lus qhia yuav tsum muaj qee qhov kev ua kom zoo ntawm lub cev cia qib hauv kev taw qhia ntawm kev txhawb nqa tus qauv duab.
  • Hauv kev hais txog Redis, peb txhais tau tias qhov txuas ntxiv RedisGraph.

Tom ntej no, rau txhua chav kawm, peb yuav qhia tias kev txhawb nqa rau ntau tus qauv siv li cas hauv DBMS los ntawm chav kawm no. Peb yuav txiav txim siab txog cov qauv kev sib raug zoo, cov ntaub ntawv thiab cov duab kos yog qhov tseem ceeb tshaj plaws thiab siv cov piv txwv ntawm cov DBMSs tshwj xeeb los qhia tias "cov uas ploj lawm" raug siv li cas.

Ntau tus qauv DBMS raws li tus qauv kev sib raug zoo

Cov thawj coj DBMSs tam sim no muaj kev sib raug zoo; Gartner qhov kev kwv yees tsis tuaj yeem suav tias yog qhov tseeb yog tias RDBMSs tsis pom kev txav mus los ntawm ntau tus qauv. Thiab lawv ua qauv qhia. Tam sim no lub tswv yim hais tias ntau tus qauv DBMS zoo li Swiss riam, uas tsis tuaj yeem ua txhua yam zoo, tuaj yeem ncaj qha rau Larry Ellison.

Tus sau, txawm li cas los xij, nyiam qhov kev siv ntau tus qauv hauv Microsoft SQL Server, ntawm qhov piv txwv uas RDBMS kev txhawb nqa rau cov ntaub ntawv thiab cov qauv duab yuav raug piav qhia.

Cov ntaub ntawv qauv hauv MS SQL Server

Muaj twb tau ob tsab xov xwm zoo heev ntawm Habré hais txog yuav ua li cas MS SQL Server siv kev txhawb nqa rau cov qauv ntaub ntawv; Kuv yuav txwv kuv tus kheej rau kev qhia luv luv thiab kev tawm tswv yim:

Txoj hauv kev los txhawb cov qauv ntaub ntawv hauv MS SQL Server yog qhov zoo heev rau kev sib raug zoo DBMSs: JSON cov ntaub ntawv tau thov kom muab khaws cia rau hauv cov ntawv nyeem zoo tib yam. Kev them nyiaj yug rau cov qauv ntaub ntawv yog muab cov neeg ua haujlwm tshwj xeeb los txheeb xyuas JSON no:

  • JSON_VALUE rho tawm scalar attribute qhov tseem ceeb,
  • JSON_QUERY kom rho tawm cov ntaub ntawv sub.

Qhov kev sib cav thib ob ntawm ob tus neeg ua haujlwm yog ib qho kev qhia hauv JSONPath-zoo li syntax.

Abstractly, peb tuaj yeem hais tias cov ntaub ntawv khaws cia hauv txoj kev no tsis yog "cov koom haum thawj zaug" hauv kev sib raug zoo DBMS, tsis zoo li tuples. Tshwj xeeb, hauv MS SQL Server tam sim no tsis muaj qhov ntsuas ntawm thaj chaw ntawm JSON cov ntaub ntawv, uas ua rau nws nyuaj rau koom nrog cov ntxhuav siv cov txiaj ntsig ntawm cov teb no thiab txawm xaiv cov ntaub ntawv siv cov txiaj ntsig no. Txawm li cas los xij, nws muaj peev xwm los tsim ib kab laum rau xws li daim teb thiab qhov ntsuas ntawm nws.

Tsis tas li ntawd, MS SQL Server muab lub peev xwm los tsim cov ntaub ntawv JSON yooj yim los ntawm cov ntsiab lus ntawm cov ntxhuav siv tus neeg teb xov tooj FOR JSON PATH - muaj peev xwm, nyob rau hauv ib qho kev txiav txim siab, rov qab mus rau yav dhau los, cov pa cia. Nws yog qhov tseeb tias txawm tias RDBMS ceev npaum li cas, txoj hauv kev no cuam tshuam cov kev xav ntawm cov ntaub ntawv DBMSs, uas tseem ceeb khaws cov lus teb npaj tau rau cov lus nug nrov, thiab tuaj yeem daws cov teeb meem ntawm kev txhim kho yooj yim, tab sis tsis ceev.

Thaum kawg, MS SQL Server tso cai rau koj los daws qhov teeb meem ntawm kev tsim cov ntaub ntawv: koj tuaj yeem decompose JSON rau hauv cov ntxhuav siv OPENJSON. Yog tias cov ntaub ntawv tsis yog tag nrho, koj yuav tsum siv CROSS APPLY.

Graph qauv hauv MS SQL Server

Kev them nyiaj yug rau daim duab (LPG) qauv kuj tseem ua tiav hauv Microsoft SQL Server kwv yees tau: Nws tau thov kom siv cov rooj tshwj xeeb los khaws cov nodes thiab khaws cov duab npoo. Cov rooj zoo li no yog tsim los siv cov lus qhia CREATE TABLE AS NODE и CREATE TABLE AS EDGE feem.

Cov ntxhuav ntawm thawj hom zoo ib yam li cov ntxhuav zoo tib yam rau khaws cov ntaub ntawv, nrog rau qhov sib txawv sab nraud tsuas yog tias lub rooj muaj qhov system teb. $node_id - tus cim tshwj xeeb ntawm daim duab node hauv cov ntaub ntawv.

Ib yam li ntawd, cov ntxhuav ntawm hom thib ob muaj qhov system teb $from_id и $to_id, nkag rau hauv cov rooj no kom meej meej cov kev sib txuas ntawm nodes. Ib lub rooj sib cais yog siv los khaws kev sib raug zoo ntawm txhua hom.

Puas yog ntau tus qauv DBMSs yog lub hauv paus ntawm cov ntaub ntawv niaj hnub? Cia peb piav qhia qhov no nrog ib qho piv txwv. Cia cov graph cov ntaub ntawv muaj ib tug layout zoo li ib tug qhia nyob rau hauv daim duab. Tom qab ntawd los tsim cov qauv sib xws hauv cov ntaub ntawv koj yuav tsum tau khiav cov lus nug DDL hauv qab no:

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);

Lub ntsiab tshwj xeeb ntawm cov rooj no yog tias hauv cov lus nug tawm tsam lawv nws muaj peev xwm siv cov qauv duab nrog Cypher-zoo li syntax (txawm li cas los xij, "*"lwm yam tseem tsis tau txais kev txhawb nqa). Raws li kev ntsuas kev ua tau zoo, nws tseem tuaj yeem xav tias txoj kev khaws cov ntaub ntawv hauv cov rooj no txawv ntawm txoj kev cov ntaub ntawv khaws cia hauv cov rooj tsis tu ncua thiab tau ua kom zoo rau kev ua tiav cov lus nug graph.

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

Ntxiv mus, nws yog ib qho nyuaj heev tsis txhob siv cov qauv duab no thaum ua hauj lwm nrog cov ntxhuav, vim hais tias nyob rau hauv cov lus nug SQL queries los daws cov teeb meem zoo sib xws nws yuav tsum tau ua ntxiv dag zog kom tau system "graph" node identifiers ($node_id, $from_id, $to_id; Rau tib lub laj thawj, cov lus nug rau kev ntxig cov ntaub ntawv tsis pom ntawm no vim lawv tsis tsim nyog cumbersome).

Txhawm rau sau cov lus piav qhia ntawm qhov kev siv ntawm cov ntaub ntawv thiab cov qauv duab hauv MS SQL Server, kuv yuav nco ntsoov tias qhov kev siv ntawm ib qho qauv saum toj ntawm lwm qhov tsis zoo li ua tiav, feem ntau los ntawm qhov kev xav ntawm kev tsim cov lus. Nws yog ib qho tsim nyog kom ncua ib hom lus nrog lwm tus, cov lus tsis yog "orthogonal", cov kev cai sib haum xeeb tuaj yeem txawv heev.

Ntau tus qauv DBMS raws li cov qauv ntaub ntawv

Hauv seem no, kuv xav qhia txog kev siv ntau tus qauv hauv cov ntaub ntawv DBMSs siv cov piv txwv ntawm cov tsis nyiam tshaj plaws ntawm lawv, MongoDB (raws li tau hais, nws tsuas yog muaj cov neeg ua haujlwm teeb tsa. $lookup и $graphLookup, tsis ua hauj lwm ntawm sharded collections), tab sis siv cov piv txwv ntawm ib tug ntau paub tab thiab "kev lag luam" DBMS MarkLogic.

Yog li, cia cov khoom sau muaj cov ntaub ntawv XML ntawm hom hauv qab no (MarkLogic kuj tso cai rau koj khaws cov ntaub ntawv JSON):

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

Cov qauv kev sib raug zoo hauv MarkLogic

Ib qho kev sib txheeb saib ntawm ib phau ntawm cov ntaub ntawv tuaj yeem tsim siv tso saib template (cov ntsiab lus ntawm cov ntsiab lus value Hauv qhov piv txwv hauv qab no tuaj yeem muaj XPath arbitrary):

<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>

Koj tuaj yeem hais qhov kev pom tsim nrog SQL query (piv txwv li, ntawm ODBC):

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

Hmoov tsis zoo, qhov kev sib txheeb pom tsim los ntawm cov qauv duab yog nyeem nkaus xwb. Thaum ua kev thov rau nws, MarkLogic yuav sim siv cov ntaub ntawv indexes. Yav dhau los, MarkLogic tau txwv kev sib txheeb pom, nkaus index raws thiab sau tau, tab sis tam sim no lawv suav hais tias yog deprecated.

Cov qauv duab hauv MarkLogic

Nrog kev txhawb nqa rau daim duab (RDF) qauv, txhua yam yog hais txog tib yam. Ntxiv nrog rau kev pab tso saib template Koj tuaj yeem tsim RDF tus sawv cev ntawm cov ntawv sau los ntawm cov piv txwv saum toj no:

<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>

Koj tuaj yeem hais txog qhov txiaj ntsig RDF nrog cov lus nug SPARQL:

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

Tsis zoo li qhov kev sib raug zoo, MarkLogic txhawb cov qauv duab hauv ob txoj hauv kev:

  1. DBMS tuaj yeem yog qhov sib cais tag nrho ntawm cov ntaub ntawv RDF (triplelets hauv nws yuav raug hu tswj contrary rau cov uas tau piav saum toj no rho tawm).
  2. RDF hauv kev tshwj xeeb serialization tuaj yeem yooj yim tso rau hauv XML lossis JSON cov ntaub ntawv (thiab triplets yuav raug hu ua tsis muaj kev tswj hwm). Qhov no tej zaum yog lwm txoj kev rau cov mechanisms idref thiab lwm tus.

Lub tswv yim zoo ntawm yuav ua li cas tej yam "tiag tiag" ua haujlwm hauv MarkLogic tau muab los ntawm Optical API, hauv qhov kev nkag siab no, nws yog qib qis, txawm hais tias nws lub hom phiaj yog qhov sib txawv - sim ua kom pom tseeb ntawm cov ntaub ntawv qauv siv, kom ntseeg tau tias kev ua haujlwm zoo ib yam nrog cov ntaub ntawv hauv cov qauv sib txawv, kev hloov pauv, thiab lwm yam.

Multi-model DBMS "tsis muaj tus qauv tseem ceeb"

Kuj tseem muaj DBMSs ntawm kev ua lag luam uas tso lawv tus kheej raws li pib ntau tus qauv, tsis muaj tus qauv tseem ceeb tau txais txiaj ntsig. Cov no suav nrog ArangoDB, OrientDB (txij li thaum 2018 lub tuam txhab kev loj hlob belongs rau SAP) thiab CosmosDB (Kev pabcuam raws li ib feem ntawm Microsoft Azure huab platform).

Qhov tseeb, muaj cov qauv "core" hauv ArangoDB thiab OrientDB. Nyob rau hauv ob qho tib si, cov no yog lawv tus kheej cov ntaub ntawv qauv, uas yog generalizations ntawm daim ntawv ib. Generalizations feem ntau yog los pab txhawb lub peev xwm los ua cov lus nug ntawm daim duab thiab kev sib raug zoo.

Cov qauv no tsuas yog muaj rau siv hauv DBMS uas tau teev tseg; lawv tus kheej cov lus nug yog tsim los ua haujlwm nrog lawv. Tau kawg, cov qauv zoo li no thiab DBMSs tau cog lus tseg, tab sis qhov tsis muaj kev sib raug zoo nrog cov qauv qauv thiab cov lus ua rau nws tsis tuaj yeem siv DBMSs hauv cov txheej txheem qub qub - los hloov DBMSs twb tau siv lawm.

Muaj twb yog ib tsab xov xwm zoo txog ArangoDB thiab OrientDB ntawm Habré: Koom hauv NoSQL databases.

ArangoDB

ArangoDB thov kev txhawb nqa rau daim duab cov ntaub ntawv qauv.

Cov nodes ntawm daim duab hauv ArangoDB yog cov ntaub ntawv zoo tib yam, thiab cov npoo yog cov ntaub ntawv ntawm ib hom tshwj xeeb uas, nrog rau cov kab ke ib txwm muaj, muaj (_key, _id, _rev) system fields _from и _to. Cov ntaub ntawv hauv cov ntaub ntawv DBMSs yog ib txwm ua ke rau hauv cov khoom sau. Kev sau cov ntaub ntawv sawv cev yog hu ua ntug sau hauv ArangoDB. Los ntawm txoj kev, ntug sau cov ntaub ntawv kuj yog cov ntaub ntawv, yog li cov npoo hauv ArangoDB kuj tseem tuaj yeem ua cov nodes.

Cov ntaub ntawv los ntawm cov ntaub ntawv

Cia peb muaj kev sau personsNws cov ntaub ntawv zoo li no:

[
  {
    "_id"  : "people/alice" ,
    "_key" : "alice" ,
    "name" : "Алиса"
  },
  {
    "_id"  : "people/bob" ,
    "_key" : "bob" ,
    "name" : "Боб"  
  }
]

Cia kuj muaj ib phau cafes:

[
  {
    "_id" : "cafes/jd" ,
    "_key" : "jd" ,
    "name" : "Джон Донн"  
  },
  {
    "_id" : "cafes/jj" ,
    "_key" : "jj" ,
    "name" : "Жан-Жак"
  }
]

Tom qab ntawd sau likes tej zaum yuav zoo li no:

[
  {
    "_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 
  }
]

Cov lus nug thiab cov txiaj ntsig

Cov lus nug graph-style hauv AQL hom lus siv hauv ArangoDB, rov qab rau hauv tib neeg cov ntaub ntawv nyeem tau hais txog leej twg nyiam lub tsev noj mov, zoo li qhov no:

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

Nyob rau hauv kev sib raug zoo style, qhov twg peb yog "xws li" kev sib raug zoo es tsis khaws cia, cov lus nug no tuaj yeem rov sau dua li qhov no (los ntawm txoj kev, tsis muaj kev sau. likes tuaj yeem ua yam tsis muaj):

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 }

Qhov tshwm sim hauv ob qhov xwm txheej yuav zoo ib yam:

[
  { "person" : "Алиса" , likes : "Жан-Жак" } ,
  { "person" : "Алиса" , likes : "Джон Донн" } ,
  { "person" : "Боб" , likes : "Джон Донн" }
]

Ntau cov lus nug thiab cov txiaj ntsig

Yog tias cov ntaub ntawv tshwm sim saum toj no zoo li ntau dua rau kev sib raug zoo DBMS dua li cov ntaub ntawv DBMS, koj tuaj yeem sim cov lus nug no (lossis koj tuaj yeem siv. COLLECT):

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

Cov txiaj ntsig yuav zoo li no:

[
  { "person" : "Алиса" , likes : ["Жан-Жак" , "Джон Донн"]  } ,
  { "person" : "Боб" , likes : ["Джон Донн"] }
]

OrientDB

Lub hauv paus rau kev siv cov qauv duab saum toj kawg nkaus ntawm cov qauv ntaub ntawv hauv OrientDB yog sijhawm cov ntaub ntawv teb, ntxiv rau ntau dua lossis tsawg dua tus qauv scalar qhov tseem ceeb, kuj muaj qhov tseem ceeb ntawm hom xws li LINK, LINKLIST, LINKSET, LINKMAP и LINKBAG. Qhov tseem ceeb ntawm cov hom no yog cov kev sib txuas lossis cov khoom sib txuas rau qhov system identifiers cov ntaub ntawv.

Cov ntaub ntawv txheeb xyuas tau muab los ntawm lub kaw lus muaj "lub ntsiab lus ntawm lub cev", qhia txog txoj haujlwm ntawm cov ntaub ntawv hauv cov ntaub ntawv, thiab zoo li qhov no: @rid : #3:16. Yog li, qhov tseem ceeb ntawm cov khoom siv yog qhov taw qhia tiag tiag (raws li hauv cov qauv duab) es tsis yog xaiv cov xwm txheej (raws li hauv cov qauv kev sib raug zoo).

Zoo li ArangoDB, cov npoo hauv OrientDB tau sawv cev raws li cov ntaub ntawv cais (txawm tias yog ntug tsis muaj nws tus kheej, nws tuaj yeem ua tau. lub teeb, thiab nws yuav tsis raug rau ib daim ntawv cais).

Cov ntaub ntawv los ntawm cov ntaub ntawv

Nyob rau hauv ib hom ntawv ze rau pov tseg format OrientDB database, cov ntaub ntawv los ntawm cov piv txwv yav dhau los rau ArangoDB yuav zoo li no:

[
     {
      "@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"
    }
  ]

Raws li peb tuaj yeem pom, vertices tseem khaws cov ntaub ntawv hais txog cov khoom nkag thiab tawm. Ntawm siv Cov Ntaub Ntawv API yuav tsum tau saib xyuas kev ncaj ncees ntawm kev xa mus rau nws tus kheej, thiab Graph API yuav siv rau txoj haujlwm no. Tab sis cia peb pom dab tsi nkag mus rau OrientDB zoo li hauv "ntshiab" cov lus nug uas tsis suav nrog hauv cov lus programming.

Cov lus nug thiab cov txiaj ntsig

Cov lus nug zoo sib xws hauv lub hom phiaj rau cov lus nug los ntawm qhov piv txwv rau ArangoDB hauv OrientDB zoo li no:

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

Cov txiaj ntsig yuav tau txais hauv daim ntawv hauv qab no:

[
  { "person_name": "Алиса", "cafe_name": "Джон Донн" },
  { "person_name": "Алиса", "cafe_name": "Жан-Жак" },
  { "person_name": "Боб",  "cafe_name": "Жан-Жак" }
]

Yog tias qhov tshwm sim hom ntawv dua zoo li "kev sib raug zoo", koj yuav tsum tshem tawm cov kab nrog UNWIND():

[
  { "person_name": "Алиса", "cafe_name": [ "Джон Донн", "Жан-Жак" ] },
  { "person_name": "Боб",  "cafe_name": [ "Жан-Жак" ' }
]

OrientDB cov lus nug tuaj yeem piav qhia raws li SQL nrog Gremlin zoo li ntxig. Hauv version 2.2, daim ntawv thov Cypher zoo li tau tshwm sim, 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

Cov ntaub ntawv tshwm sim yuav zoo ib yam li hauv qhov kev thov dhau los. Xav txog dab tsi yuav tsum tau muab tshem tawm kom nws ua "kev sib raug zoo", zoo li hauv cov lus nug thawj zaug.

Azure CosmosDB

Rau qhov tsawg dua, dab tsi tau hais saum toj no txog ArangoDB thiab OrientDB siv rau Azure CosmosDB. CosmosDB muab cov ntaub ntawv hauv qab no nkag APIs: SQL, MongoDB, Gremlin thiab Cassandra.

SQL API thiab MongoDB API yog siv los saib xyuas cov ntaub ntawv hauv cov qauv ntaub ntawv. Gremlin API thiab Cassandra API - rau kev nkag mus rau cov ntaub ntawv hauv daim duab thiab kab ntawv, feem. Cov ntaub ntawv hauv txhua tus qauv raug khaws cia hauv CosmosDB sab hauv qauv qauv: ARS ("atom-record-sequence"), uas tseem nyob ze rau daim ntawv ib.

Puas yog ntau tus qauv DBMSs yog lub hauv paus ntawm cov ntaub ntawv niaj hnub?

Tab sis cov qauv ntaub ntawv xaiv los ntawm tus neeg siv thiab API siv tau kho thaum lub sijhawm tsim tus account hauv kev pabcuam. Nws tsis tuaj yeem nkag mus rau cov ntaub ntawv thauj khoom hauv ib tus qauv hauv lwm hom qauv, raws li tau piav qhia los ntawm qee yam zoo li no:

Puas yog ntau tus qauv DBMSs yog lub hauv paus ntawm cov ntaub ntawv niaj hnub?

Yog li, ntau tus qauv hauv Azure CosmosDB niaj hnub no tsuas yog muaj peev xwm siv ntau lub databases txhawb cov qauv sib txawv los ntawm ib lub chaw tsim khoom, uas tsis daws txhua yam teeb meem ntawm ntau qhov sib txawv cia.

Ntau tus qauv DBMS raws li tus qauv duab?

Qhov tseem ceeb yog qhov tseeb tias tsis muaj ntau tus qauv DBMSs nyob rau hauv kev ua lag luam tseem tsis tau ua raws li cov qauv duab (tshwj tsis yog rau ntau tus qauv kev txhawb nqa rau ib txhij ob daim qauv: RDF thiab LPG; saib qhov no hauv yav dhau los tshaj tawm). Qhov teeb meem loj tshaj plaws yog tshwm sim los ntawm kev ua raws li cov qauv ntawm cov ntaub ntawv saum toj kawg nkaus ntawm cov qauv duab, tsis yog kev sib raug zoo.

Cov lus nug ntawm yuav ua li cas los tsim ib qho kev sib raug zoo qauv nyob rau sab saum toj ntawm daim duab qauv tau txiav txim siab txawm tias thaum lub sij hawm tsim ntawm qhov kawg. Yuav ua li cas hais lusmuab ua piv txwv David McGovern:

Tsis muaj ib yam dab tsi tshwm sim hauv daim duab qhia kev tiv thaiv kev tsim cov txheej txheem (piv txwv li, los ntawm qhov tsim nyog indexing) ntawm daim duab database uas ua rau muaj kev sib raug zoo nrog (1) rov qab ntawm tuples los ntawm cov nqi tseem ceeb ib txwm ua khub thiab (2) pab pawg ntawm tuples los ntawm kev sib raug zoo.

Thaum siv cov qauv ntaub ntawv saum toj kawg nkaus ntawm cov qauv duab, koj yuav tsum nco ntsoov, piv txwv li, cov hauv qab no:

  • Cov ntsiab lus ntawm JSON array raug txiav txim siab, tab sis cov emanating los ntawm vertex ntawm ntug ntawm daim duab tsis yog;
  • Cov ntaub ntawv hauv cov qauv ntaub ntawv feem ntau yog denormalized; koj tseem tsis xav khaws ob peb daim ntawv theej ntawm tib cov ntaub ntawv, thiab cov ntaub ntawv feem ntau tsis muaj cov cim;
  • Ntawm qhov tod tes, lub tswv yim ntawm cov ntaub ntawv DBMSs yog tias cov ntaub ntawv tau npaj ua "ua ke" uas tsis tas yuav tsim dua tshiab txhua zaus. Nws yog qhov yuav tsum tau muab cov qauv duab nrog lub peev xwm kom tau txais cov duab subgraph sai sai rau cov ntaub ntawv tiav.

Kev tshaj tawm me ntsis

Tus sau ntawm tsab xov xwm muaj feem xyuam rau txoj kev loj hlob ntawm NitrosBase DBMS, cov qauv sab hauv uas yog daim duab, thiab cov qauv sab nraud - kev sib raug zoo thiab cov ntaub ntawv - yog nws cov sawv cev. Txhua tus qauv sib npaug: yuav luag txhua cov ntaub ntawv muaj nyob hauv ib qho ntawm lawv siv cov lus nug uas yog ntuj rau nws. Ntxiv mus, nyob rau hauv txhua qhov kev pom, cov ntaub ntawv tuaj yeem hloov pauv. Cov kev hloov pauv yuav tshwm sim hauv cov qauv sab hauv thiab, raws li, hauv lwm qhov kev xav.

Kuv vam tias yuav piav qhia txog tus qauv zoo li cas hauv NitrosBase hauv ib qho ntawm cov kab lus hauv qab no.

xaus

Kuv vam tias cov ntsiab lus dav dav ntawm qhov hu ua multi-modeling tau dhau los ua ntau dua lossis tsawg dua rau cov neeg nyeem. Ntau tus qauv DBMSs txawv heev, thiab "kev txhawb nqa ntau tus qauv" tuaj yeem saib txawv. Yuav kom nkag siab txog dab tsi hu ua "multi-model" nyob rau hauv txhua rooj plaub, nws yog ib qho tsim nyog los teb cov lus nug hauv qab no:

  1. Puas yog peb tham txog kev txhawb nqa cov qauv ib txwm muaj lossis qee yam "hybrid" qauv?
  2. Puas yog cov qauv "sib npaug", lossis yog ib qho ntawm lawv cov ntsiab lus ntawm lwm tus?
  3. Puas yog cov qauv "tsis txawv txav" rau ib leeg? Cov ntaub ntawv puas tuaj yeem sau rau hauv ib tus qauv tuaj yeem nyeem hauv lwm qhov lossis tseem sau tau?

Kuv xav tias cov lus nug txog qhov tseem ceeb ntawm ntau tus qauv DBMS tuaj yeem teb tau zoo, tab sis cov lus nug nthuav dav yog hom twg ntawm lawv yuav xav tau ntau dua yav tom ntej. Nws zoo li ntau tus qauv DBMSs uas txhawb cov qauv ib txwm muaj, feem ntau muaj kev sib raug zoo, yuav xav tau ntau dua; Qhov nrov ntawm ntau tus qauv DBMSs, muab cov qauv tshiab uas muab cov txiaj ntsig zoo ntawm ntau yam kev cai, yog qhov teeb meem ntawm lub neej yav tom ntej.

Tsuas yog cov neeg siv sau npe tuaj yeem koom nrog hauv daim ntawv ntsuam xyuas. Kos npe rau hauvthov.

Koj puas siv ntau hom DBMS?

  • Peb tsis siv nws, peb khaws txhua yam hauv ib qho DBMS thiab hauv ib tus qauv

  • Peb siv ntau lub peev xwm ntawm DBMSs ib txwm muaj

  • Peb xyaum polyglot persistence

  • Peb siv ntau tus qauv DBMS (Arango, Orient, CosmosDB)

19 cov neeg siv pov npav. 4 cov neeg siv tau txwv.

Tau qhov twg los: www.hab.com

Ntxiv ib saib