Основе дизајна базе података - Поређење ПостгреСКЛ, Цассандра и МонгоДБ

Здраво, пријатељи. Пре поласка на други део мајских празника, делимо са вама материјал који смо превели у ишчекивању покретања новог стрима на курсу "Релациони ДБМС".

Основе дизајна базе података - Поређење ПостгреСКЛ, Цассандра и МонгоДБ

Програмери апликација проводе доста времена упоређујући више оперативних база података како би изабрали ону која најбоље одговара предвиђеном радном оптерећењу. Потребе могу укључивати поједностављено моделирање података, трансакцијске гаранције, перформансе читања/писања, хоризонтално скалирање и толеранцију грешака. Традиционално, избор почиње са категоријом базе података, СКЛ или НоСКЛ, пошто свака категорија представља јасан скуп компромиса. Високе перформансе у смислу мале латенције и велике пропусности се генерално посматрају као услов без компромиса и стога су од суштинског значаја за било коју базу података узорака.

Сврха овог чланка је да помогне програмерима апликација да направе прави избор између СКЛ-а и НоСКЛ-а у контексту моделирања података апликације. Погледаћемо једну СКЛ базу података, односно ПостгреСКЛ, и две НоСКЛ базе података, Цассандра и МонгоДБ, да бисмо покрили основе дизајна базе података, као што је креирање табела, њихово попуњавање, читање података из табеле и њихово брисање. У следећем чланку ћемо свакако погледати индексе, трансакције, ЈОИН-ове, ТТЛ директиве и дизајн базе података заснован на ЈСОН-у.

Која је разлика између СКЛ-а и НоСКЛ-а?

СКЛ базе података повећавају флексибилност апликације кроз АЦИД трансакцијске гаранције, као и њихову способност да траже податке користећи ЈОИН-ове на неочекиване начине на врху постојећих нормализованих модела релационих база података.

С обзиром на њихову монолитну/једночворну архитектуру и коришћење модела репликације мастер-славе за редундантност, традиционалним СКЛ базама података недостају две важне карактеристике – линеарну скалабилност писања (тј. аутоматско партиционисање на више чворова) и аутоматски/нулти губитак података. То значи да количина примљених података не може премашити максималну пропусност писања једног чвора. Поред тога, неки привремени губитак података се мора узети у обзир у толеранцији грешака (у архитектури која се не дели). Овде треба да имате на уму да се недавна урезивања још нису одразила у подређеној копији. Ажурирања без прекида рада такође је тешко постићи у СКЛ базама података.

НоСКЛ базе података се обично дистрибуирају по природи, тј. у њима су подаци подељени у секције и распоређени на неколико чворова. Они захтевају денормализацију. То значи да се унети подаци такође морају више пута копирати да би се одговорило на специфичне захтеве које шаљете. Општи циљ је постизање високих перформанси смањењем броја делова доступних током читања. Ово имплицира да НоСКЛ од вас захтева да моделујете своје упите, док СКЛ захтева да моделујете своје податке.

НоСКЛ се фокусира на постизање високих перформанси у дистрибуираном кластеру и ово је основни разлог за многе компромисе у дизајну базе података који укључују губитак АЦИД трансакција, ЈОИН-ове и конзистентне глобалне секундарне индексе.

Постоји аргумент да док НоСКЛ базе података обезбеђују линеарну скалабилност писања и високу толеранцију грешака, губитак трансакцијских гаранција их чини неприкладним за критичне податке.

Следећа табела показује како се моделирање података у НоСКЛ-у разликује од СКЛ-а.

Основе дизајна базе података - Поређење ПостгреСКЛ, Цассандра и МонгоДБ

СКЛ и НоСКЛ: Зашто су потребна оба?

Реалне апликације са великим бројем корисника, као што су Амазон.цом, Нетфлик, Убер и Аирбнб, имају задатак да обављају сложене, вишестране задатке. На пример, апликација за е-трговину као што је Амазон.цом треба да складишти лагане, веома критичне податке као што су информације о корисницима, производи, поруџбине, фактуре, заједно са тешким, мање осетљивим подацима као што су рецензије производа, поруке подршке, активности корисника, рецензије и препоруке корисника. Наравно, ове апликације се ослањају на најмање једну СКЛ базу података заједно са најмање једном НоСКЛ базом података. У међурегионалним и глобалним системима, НоСКЛ база података функционише као гео-дистрибуирани кеш за податке ускладиштене у поузданој изворној СКЛ бази података која ради у одређеном региону.

Како ИугаБите ДБ комбинује СКЛ и НоСКЛ?

Изграђен на лог оријентисаном мешовитом систему складиштења, аутоматском дељењу, дистрибуираној репликацији консензуса и АЦИД дистрибуираним трансакцијама (инспирисан Гоогле Спаннером), ИугаБите ДБ је прва светска база података отвореног кода која је истовремено компатибилна са НоСКЛ (Цассандра & Редис) и СКЛ (ПостгреСКЛ). Као што је приказано у табели испод, ИЦКЛ, ИугаБите ДБ АПИ компатибилан са Цассандром, додаје концепте АЦИД трансакција са једним и више кључева и глобалних секундарних индекса НоСКЛ АПИ-ју, чиме започиње еру трансакционих НоСКЛ база података. Поред тога, ИЦКЛ, ИугаБите ДБ АПИ компатибилан са ПостгреСКЛ, додаје концепте линеарног скалирања писања и аутоматске толеранције грешака у СКЛ АПИ, доносећи дистрибуиране СКЛ базе података на свет. Пошто је ИугаБите ДБ трансакциона природа, НоСКЛ АПИ сада може да се користи у контексту критичних података.

Основе дизајна базе података - Поређење ПостгреСКЛ, Цассандра и МонгоДБ

Као што је раније речено у чланку „Представљамо ИСКЛ: ПостгреСКЛ компатибилни дистрибуирани СКЛ АПИ за ИугаБите ДБ“, избор између СКЛ-а или НоСКЛ-а у ИугаБите ДБ-у у потпуности зависи од карактеристика основног радног оптерећења:

  • Ако су ваше примарно радно оптерећење операције ЈОИН са више кључева, онда када бирате ИСКЛ, имајте на уму да ваши кључеви могу бити распоређени на више чворова, што резултира већим кашњењем и/или мањим протоком од НоСКЛ-а.
  • У супротном, изаберите било који од два НоСКЛ АПИ-ја, имајући на уму да ћете добити боље перформансе као резултат упита који се сервирају са једног по једног чвора. ИугаБите ДБ може послужити као јединствена оперативна база података за сложене апликације у стварном свету које треба да управљају вишеструким радним оптерећењем истовремено.

Лабораторија за моделирање података у следећем одељку заснована је на ПостгреСКЛ и Цассандра АПИ компатибилним ИугаБите ДБ базама података, за разлику од матичних база података. Овај приступ наглашава лакоћу интеракције са два различита АПИ-ја (на два различита порта) истог кластера базе података, за разлику од коришћења потпуно независних кластера две различите базе података.
У следећим одељцима ћемо погледати лабораторију за моделирање података да бисмо илустровали разлике и неке од заједничких карактеристика обухваћених база података.

Лабораторија за моделирање података

Инсталација базе података

С обзиром на нагласак на дизајну модела података (уместо сложених архитектура примене), инсталираћемо базе података у Доцкер контејнере на локалној машини, а затим ћемо комуницирати са њима користећи њихове одговарајуће шкољке командне линије.

ИугаБите ДБ база података компатибилна са ПостгреСКЛ и Цассандра

mkdir ~/yugabyte && cd ~/yugabyte
wget https://downloads.yugabyte.com/yb-docker-ctl && chmod +x yb-docker-ctl
docker pull yugabytedb/yugabyte
./yb-docker-ctl create --enable_postgres

МонгоДБ

docker run --name my-mongo -d mongo:latest

Приступ командној линији

Хајде да се повежемо са базама података помоћу љуске командне линије за одговарајуће АПИ-је.

ПостгреСКЛ

пскл је љуска командне линије за интеракцију са ПостгреСКЛ-ом. Ради лакшег коришћења, ИугаБите ДБ долази са пскл-ом директно у фасцикли бин.

docker exec -it yb-postgres-n1 /home/yugabyte/postgres/bin/psql -p 5433 -U postgres

Касандра

цклсх је љуска командне линије за интеракцију са Цассандром и њеним компатибилним базама података преко ЦКЛ (Цассандра Куери Лангуаге). Ради лакшег коришћења, ИугаБите ДБ долази са cqlsh у каталогу bin.
Имајте на уму да је ЦКЛ инспирисан СКЛ-ом и да има сличне концепте табела, редова, колона и индекса. Међутим, као НоСКЛ језик, он додаје одређени скуп ограничења, од којих ћемо већину покрити у другим чланцима.

docker exec -it yb-tserver-n1 /home/yugabyte/bin/cqlsh

МонгоДБ

монго је љуска командне линије за интеракцију са МонгоДБ. Може се наћи у бин директоријуму МонгоДБ инсталације.

docker exec -it my-mongo bash 
cd bin
mongo

Направите табелу

Сада можемо да комуницирамо са базом података да бисмо извршили различите операције помоћу командне линије. Почнимо са креирањем табеле која чува информације о песмама које су написали различити извођачи. Ове песме могу бити део албума. Такође опциони атрибути за песму су година издања, цена, жанр и оцена. Морамо да узмемо у обзир додатне атрибуте који ће можда бити потребни у будућности кроз поље „ознаке“. Може да складишти полуструктуриране податке у облику парова кључ-вредност.

ПостгреСКЛ

CREATE TABLE Music (
    Artist VARCHAR(20) NOT NULL, 
    SongTitle VARCHAR(30) NOT NULL,
    AlbumTitle VARCHAR(25),
    Year INT,
    Price FLOAT,
    Genre VARCHAR(10),
    CriticRating FLOAT,
    Tags TEXT,
    PRIMARY KEY(Artist, SongTitle)
);	

Касандра

Прављење табеле у Цассандри је веома слично ПостгреСКЛ-у. Једна од главних разлика је недостатак ограничења интегритета (нпр. НОТ НУЛЛ), али то је одговорност апликације, а не НоСКЛ базе података. Примарни кључ се састоји од партиционог кључа (колона Извођач у примеру испод) и скупа колона за груписање (колона СонгТитле у примеру испод). Кључ партиције одређује у коју партицију/шард треба да се постави ред, а колоне за груписање указују на то како би подаци требало да буду организовани у оквиру тренутног дела.

CREATE KEYSPACE myapp;
USE myapp;
CREATE TABLE Music (
    Artist TEXT, 
    SongTitle TEXT,
    AlbumTitle TEXT,
    Year INT,
    Price FLOAT,
    Genre TEXT,
    CriticRating FLOAT,
    Tags TEXT,
    PRIMARY KEY(Artist, SongTitle)
);

МонгоДБ

МонгоДБ организује податке у базе података (базе података) (слично Кеиспаце-у у Цассандри), где постоје колекције (слично табелама) које садрже документе (слично редовима у табели). У МонгоДБ-у у основи нема потребе да се дефинише почетна шема. Тим "користи базу података", приказан испод, инстанцира базу података при првом позиву и мења контекст за новокреирану базу података. Чак ни колекције не морају бити експлицитно креиране; оне се креирају аутоматски, једноставно када додате први документ у нову колекцију. Имајте на уму да МонгоДБ подразумевано користи тестну базу података, тако да ће се свака операција на нивоу колекције без навођења одређене базе података подразумевано покренути на њој.

use myNewDatabase;

Добијање информација о табели
ПостгреСКЛ

d Music
Table "public.music"
    Column    |         Type          | Collation | Nullable | Default 
--------------+-----------------------+-----------+----------+--------
 artist       | character varying(20) |           | not null | 
 songtitle    | character varying(30) |           | not null | 
 albumtitle   | character varying(25) |           |          | 
 year         | integer               |           |          | 
 price        | double precision      |           |          | 
 genre        | character varying(10) |           |          | 
 criticrating | double precision      |           |          | 
 tags         | text                  |           |          | 
Indexes:
    "music_pkey" PRIMARY KEY, btree (artist, songtitle)

Касандра

DESCRIBE TABLE MUSIC;
CREATE TABLE myapp.music (
    artist text,
    songtitle text,
    albumtitle text,
    year int,
    price float,
    genre text,
    tags text,
    PRIMARY KEY (artist, songtitle)
) WITH CLUSTERING ORDER BY (songtitle ASC)
    AND default_time_to_live = 0
    AND transactions = {'enabled': 'false'};

МонгоДБ

use myNewDatabase;
show collections;

Уношење података у табелу
ПостгреСКЛ

INSERT INTO Music 
    (Artist, SongTitle, AlbumTitle, 
    Year, Price, Genre, CriticRating, 
    Tags)
VALUES(
    'No One You Know', 'Call Me Today', 'Somewhat Famous',
    2015, 2.14, 'Country', 7.8,
    '{"Composers": ["Smith", "Jones", "Davis"],"LengthInSeconds": 214}'
);
INSERT INTO Music 
    (Artist, SongTitle, AlbumTitle, 
    Price, Genre, CriticRating)
VALUES(
    'No One You Know', 'My Dog Spot', 'Hey Now',
    1.98, 'Country', 8.4
);
INSERT INTO Music 
    (Artist, SongTitle, AlbumTitle, 
    Price, Genre)
VALUES(
    'The Acme Band', 'Look Out, World', 'The Buck Starts Here',
    0.99, 'Rock'
);
INSERT INTO Music 
    (Artist, SongTitle, AlbumTitle, 
    Price, Genre, 
    Tags)
VALUES(
    'The Acme Band', 'Still In Love', 'The Buck Starts Here',
    2.47, 'Rock', 
    '{"radioStationsPlaying": ["KHCR", "KBQX", "WTNR", "WJJH"], "tourDates": { "Seattle": "20150625", "Cleveland": "20150630"}, "rotation": Heavy}'
);

Касандра

Укупан израз INSERT у Цассандра изгледа веома слично ономе у ПостгреСКЛ-у. Међутим, постоји једна велика разлика у семантици. У Касандри INSERT је заправо операција UPSERT, где се последње вредности додају у ред ако ред већ постоји.

Унос података је сличан ПостгреСКЛ-у INSERT изнад

.

МонгоДБ

Иако је МонгоДБ НоСКЛ база података попут Цассандре, њена операција уметања нема ништа заједничко са семантичким понашањем Цассандре. У МонгоДБ инсерт () нема могућности UPSERT, што га чини сличним ПостгреСКЛ-у. Додавање подразумеваних података без _idspecified ће изазвати додавање новог документа у колекцију.

db.music.insert( {
artist: "No One You Know",
songTitle: "Call Me Today",
albumTitle: "Somewhat Famous",
year: 2015,
price: 2.14,
genre: "Country",
tags: {
Composers: ["Smith", "Jones", "Davis"],
LengthInSeconds: 214
}
}
);
db.music.insert( {
artist: "No One You Know",
songTitle: "My Dog Spot",
albumTitle: "Hey Now",
price: 1.98,
genre: "Country",
criticRating: 8.4
}
);
db.music.insert( {
artist: "The Acme Band",
songTitle: "Look Out, World",
albumTitle:"The Buck Starts Here",
price: 0.99,
genre: "Rock"
}
);
db.music.insert( {
artist: "The Acme Band",
songTitle: "Still In Love",
albumTitle:"The Buck Starts Here",
price: 2.47,
genre: "Rock",
tags: {
radioStationsPlaying:["KHCR", "KBQX", "WTNR", "WJJH"],
tourDates: {
Seattle: "20150625",
Cleveland: "20150630"
},
rotation: "Heavy"
}
}
);

Табле Куери

Можда је најзначајнија разлика између СКЛ-а и НоСКЛ-а у смислу конструкције упита у језику који се користи FROM и WHERE. СКЛ дозвољава израз после FROM изаберите више табела и израз са WHERE може бити било које сложености (укључујући операције JOIN између столова). Међутим, НоСКЛ има тенденцију да наметне озбиљна ограничења FROM, и раде само са једном наведеном табелом и у WHERE, примарни кључ увек мора бити наведен. Ово је повезано са НоСКЛ перформансама о којима смо раније говорили. Ова жеља води ка сваком могућем смањењу било које интеракције унакрсних табела и унакрсних кључева. Може довести до великог кашњења у комуникацији између чворова када се одговара на захтев и стога га је уопште најбоље избегавати. На пример, Цассандра захтева да упити буду ограничени на одређене оператере (само =, IN, <, >, =>, <=) на партиционим кључевима, осим када се захтева секундарни индекс (овде је дозвољен само оператор =).

ПостгреСКЛ

Испод су три примера упита које СКЛ база података лако може извршити.

  • Прикажи све песме извођача;
  • Прикажи све песме извођача које одговарају првом делу наслова;
  • Прикажи све песме извођача које имају одређену реч у наслову и имају цену мању од 1.00.
SELECT * FROM Music
WHERE Artist='No One You Know';
SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle LIKE 'Call%';
SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle LIKE '%Today%'
AND Price > 1.00;

Касандра

Од горе наведених ПостгреСКЛ упита, само први ће радити непромењено у Цассандри, пошто оператор LIKE не може се применити на груписање колона као нпр SongTitle. У овом случају су дозвољени само оператери = и IN.

SELECT * FROM Music
WHERE Artist='No One You Know';
SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle IN ('Call Me Today', 'My Dog Spot')
AND Price > 1.00;

МонгоДБ

Као што је приказано у претходним примерима, главни метод за креирање упита у МонгоДБ је дб.цоллецтион.финд(). Овај метод експлицитно садржи име колекције (music у примеру испод), тако да је забрањено испитивање више колекција.

db.music.find( {
  artist: "No One You Know"
 } 
);
db.music.find( {
  artist: "No One You Know",
  songTitle: /Call/
 } 
);

Читање свих редова табеле

Читање свих редова је једноставно посебан случај обрасца упита који смо раније погледали.

ПостгреСКЛ

SELECT * 
FROM Music;

Касандра

Слично као у горњем примеру ПостгреСКЛ.

МонгоДБ

db.music.find( {} );

Уређивање података у табели

ПостгреСКЛ

ПостгреСКЛ пружа упутства UPDATE да промените податке. Она нема могућности UPSERT, тако да ова изјава неће успети ако ред више није у бази података.

UPDATE Music
SET Genre = 'Disco'
WHERE Artist = 'The Acme Band' AND SongTitle = 'Still In Love';

Касандра

Касандра има UPDATE слично ПостгреСКЛ-у. UPDATE има исту семантику UPSERT, слично INSERT.

Слично као у горњем примеру ПостгреСКЛ.

МонгоДБ
Операција ажурирање() у МонгоДБ-у може у потпуности ажурирати постојећи документ или ажурирати само одређена поља. Подразумевано, ажурира само један документ са онемогућеном семантиком UPSERT. Ажурирање више докумената и слично понашање UPSERT може се применити постављањем додатних заставица за операцију. На пример, у примеру испод, жанр одређеног извођача се ажурира на основу његове песме.

db.music.update(
  {"artist": "The Acme Band"},
  { 
    $set: {
      "genre": "Disco"
    }
  },
  {"multi": true, "upsert": true}
);

Уклањање података из табеле

ПостгреСКЛ

DELETE FROM Music
WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';

Касандра

Слично као у горњем примеру ПостгреСКЛ.

МонгоДБ

МонгоДБ има две врсте операција за брисање докумената − делетеОне() /делетеМани() и уклони (). Оба типа бришу документе, али враћају различите резултате.

db.music.deleteMany( {
        artist: "The Acme Band"
    }
);

Брисање табеле

ПостгреСКЛ

DROP TABLE Music;

Касандра

Слично као у горњем примеру ПостгреСКЛ.

МонгоДБ

db.music.drop();

Закључак

Дебата о избору између СКЛ-а и НоСКЛ-а траје више од 10 година. Постоје два главна аспекта ове дебате: архитектура мотора базе података (монолитна, трансакциони СКЛ наспрам дистрибуираног, нетрансакционог НоСКЛ) и приступ дизајну базе података (моделирање ваших података у СКЛ-у насупрот моделирању ваших упита у НоСКЛ-у).

Са дистрибуираном трансакционом базом података као што је ИугаБите ДБ, дебата о архитектури базе података може се лако прекинути. Како обим података постаје већи од онога што се може уписати у један чвор, потпуно дистрибуирана архитектура која подржава линеарну скалабилност писања са аутоматским дељењем/ребалансом постаје неопходна.

Осим тога, како је наведено у једном од чланака Гоогле ЦлоудТрансакцијске, снажно конзистентне архитектуре се сада више користе за пружање боље агилности развоја од нетрансакционих, на крају конзистентних архитектура.

Враћајући се на дискусију о дизајну базе података, поштено је рећи да су оба приступа дизајну (СКЛ и НоСКЛ) неопходна за сваку сложену апликацију у стварном свету. СКЛ приступ „моделирању података“ омогућава програмерима да лакше испуне променљиве пословне захтеве, док НоСКЛ приступ „моделирању упита“ омогућава истим програмерима да раде на великим количинама података са малим кашњењем и великом пропусношћу. Из тог разлога ИугаБите ДБ обезбеђује СКЛ и НоСКЛ АПИ-је у заједничком језгру, уместо да промовише један од приступа. Поред тога, обезбеђујући компатибилност са популарним језицима база података, укључујући ПостгреСКЛ и Цассандра, ИугаБите ДБ обезбеђује да програмери не морају да уче други језик да би радили са дистрибуираним, веома доследним механизмом базе података.

У овом чланку смо погледали како се основе дизајна базе података разликују између ПостгреСКЛ, Цассандре и МонгоДБ. У будућим чланцима ћемо заронити у напредне концепте дизајна као што су индекси, трансакције, ЈОИН-ови, ТТЛ директиве и ЈСОН документи.

Желимо вам угодан остатак викенда и позивамо вас на бесплатан вебинар, који ће се одржати 14. маја.

Извор: ввв.хабр.цом

Додај коментар