Database ta' Messenger (parti 2): qsim "għall-profitt"

Iddisinjajna b'suċċess l-istruttura tad-database PostgreSQL tagħna għall-ħażna tal-korrispondenza, għaddiet sena, l-utenti qed jimlewha b'mod attiv, u issa fiha miljuni ta’ rekords, u... xi ħaġa bdiet tonqos.

Database ta' Messenger (parti 2): qsim "għall-profitt"
Fatt huwa li Hekk kif id-daqs tal-mejda jikber, hekk ukoll il-"fond" tal-indiċi. - għalkemm logaritmikament. Iżda maż-żmien dan iġġiegħel lis-server iwettaq l-istess kompiti ta 'qari/kitba jipproċessa ħafna drabi aktar paġni ta 'datamilli fil-bidu.

Dan huwa fejn niġu għas-salvataġġ sezzjoni.

Ħalli ninnota li mhux qed nitkellmu dwar sharding, jiġifieri, id-distribuzzjoni tad-dejta bejn databases jew servers differenti. Għax anke tiddividi d-data fi xi servers, ma teħlesx mill-problema ta 'l-indiċi "nefħa" maż-żmien. Huwa ċar li jekk tistax taffordja li tħaddem server ġdid kuljum, allura l-problemi tiegħek ma jibqgħux jinsabu fil-pjan ta 'database speċifika.

Aħna se nikkunsidraw mhux skripts speċifiċi għall-implimentazzjoni tal-qsim "fil-ħardwer", iżda l-approċċ innifsu - x'u kif għandu jkun "maqtugħ fi flieli", u għal xiex twassal tali xewqa.

Kunċett

Ejja niddefinixxu l-għan tagħna għal darb'oħra: irridu niżguraw li llum, għada, u f'sena, l-ammont ta 'dejta moqrija minn PostgreSQL waqt kwalunkwe operazzjoni ta' qari/kitba jibqa 'bejn wieħed u ieħor l-istess.

Għal kull data akkumulata kronoloġikament (messaġġi, dokumenti, zkuk, arkivji, ...) l-għażla naturali bħala ċavetta ta 'qsim hija data/ħin tal-avveniment. Fil-każ tagħna, avveniment bħal dan huwa mument li jintbagħat il-messaġġ.

Innota li l-utenti kważi dejjem taħdem biss ma 'dawk "l-aħħar". data bħal din - jaqraw l-aħħar messaġġi, janalizzaw l-aħħar zkuk,... Le, ovvjament, jistgħu jiskrollaw aktar lura fiż-żmien, iżda jagħmlu dan rari ħafna.

Minn dawn ir-restrizzjonijiet huwa ċar li l-aħjar soluzzjoni tal-messaġġ tkun sezzjonijiet "kuljum". - wara kollox, l-utent tagħna kważi dejjem jaqra dak li ġie lilu "illum" jew "bieraħ".

Jekk niktbu u naqraw kważi f'sezzjoni waħda biss matul il-ġurnata, allura dan jagħtina wkoll użu aktar effiċjenti tal-memorja u disk - peress li l-indiċijiet kollha tas-sezzjonijiet jidħlu faċilment fir-RAM, b'kuntrast ma' dawk "kbar u grassi" fit-tabella kollha.

pass pass

B'mod ġenerali, dak kollu li ntqal hawn fuq ħsejjes bħal profitt wieħed kontinwu. U jista 'jintlaħaq, iżda għal dan ser ikollna nippruvaw ħafna - għaliex id-deċiżjoni li tinqasam waħda mill-entitajiet twassal għall-ħtieġa li "raw" l-assoċjati.

Il-messaġġ, il-proprjetajiet u l-projezzjonijiet tiegħu

Peress li ddeċidejna li naqtgħu l-messaġġi bid-dati, jagħmel sens li naqsmu wkoll l-entitajiet-propjetajiet li jiddependu minnhom (fajls mehmuża, lista ta’ riċevituri), u ukoll skond id-data tal-messaġġ.

Peress li wieħed mill-kompiti tipiċi tagħna huwa preċiżament li naraw ir-reġistri tal-messaġġi (mhux moqrija, deħlin, kollha), huwa wkoll loġiku li "jiġbduhom" f'qsim skond id-dati tal-messaġġi.

Database ta' Messenger (parti 2): qsim "għall-profitt"

Aħna nżidu ċ-ċavetta tal-qsim (data tal-messaġġ) mat-tabelli kollha: riċevituri, fajl, reġistri. M'għandekx għalfejn iżżidha mal-messaġġ innifsu, imma uża d-DateTime eżistenti.

Suġġetti

Peress li hemm suġġett wieħed biss għal diversi messaġġi, m'hemm l-ebda mod kif "taqta'" fl-istess mudell; trid tistrieħ fuq xi ħaġa oħra. Fil-każ tagħna huwa ideali data tal-ewwel messaġġ fil-korrispondenza — jiġifieri, il-mument tal-ħolqien, fil-fatt, tas-suġġett.

Database ta' Messenger (parti 2): qsim "għall-profitt"

Żid iċ-ċavetta tal-qsim (data tas-suġġett) mat-tabelli kollha: suġġett, parteċipant.

Imma issa għandna żewġ problemi f'daqqa:

  • F'liema taqsima għandi nfittex messaġġi dwar is-suġġett?
  • F'liema taqsima għandi nfittex is-suġġett mill-messaġġ?

Nistgħu, ovvjament, inkomplu nfittxu fit-taqsimiet kollha, iżda dan se jkun ta’ diqa ħafna u se jiċħad ir-rebħ kollu tagħna. Għalhekk, sabiex inkunu nafu eżattament fejn inħarsu, aħna se nagħmlu links/indikazzjonijiet loġiċi għal sezzjonijiet:

  • se nżidu fil-messaġġ qasam tad-data tas-suġġett
  • ejja nżidu mas-suġġett data tal-messaġġ stabbilita din il-korrispondenza (tista' tkun tabella separata, jew firxa ta' dati)

Database ta' Messenger (parti 2): qsim "għall-profitt"

Peress li se jkun hemm ftit modifiki fil-lista tad-dati tal-messaġġi għal kull korrispondenza individwali (wara kollox, kważi l-messaġġi kollha jaqgħu fuq ġranet 1-2 biswit), se niffoka fuq din l-għażla.

B'kollox, l-istruttura tad-database tagħna ħadet il-forma li ġejja, b'kont meħud tal-qsim:

Tabelli: RU, jekk għandek stmerrija għall-alfabett Ċirilliku fl-ismijiet tat-tabelli/oqsma, huwa aħjar li ma tħaresx

-- секции по дате сообщения
CREATE TABLE "Сообщение_YYYYMMDD"(
  "Сообщение"
    uuid
      PRIMARY KEY
, "Тема"
    uuid
, "ДатаТемы"
    date
, "Автор"
    uuid
, "ДатаВремя" -- используем как дату
    timestamp
, "Текст"
    text
);

CREATE TABLE "Адресат_YYYYMMDD"(
  "ДатаСообщения"
    date
, "Сообщение"
    uuid
, "Персона"
    uuid
, PRIMARY KEY("Сообщение", "Персона")
);

CREATE TABLE "Файл_YYYYMMDD"(
  "ДатаСообщения"
    date
, "Файл"
    uuid
      PRIMARY KEY
, "Сообщение"
    uuid
, "BLOB"
    uuid
, "Имя"
    text
);

CREATE TABLE "РеестрСообщений_YYYYMMDD"(
  "ДатаСообщения"
    date
, "Владелец"
    uuid
, "ТипРеестра"
    smallint
, "ДатаВремя"
    timestamp
, "Сообщение"
    uuid
, PRIMARY KEY("Владелец", "ТипРеестра", "Сообщение")
);
CREATE INDEX ON "РеестрСообщений_YYYYMMDD"("Владелец", "ТипРеестра", "ДатаВремя" DESC);

-- секции по дате темы
CREATE TABLE "Тема_YYYYMMDD"(
  "ДатаТемы"
    date
, "Тема"
    uuid
      PRIMARY KEY
, "Документ"
    uuid
, "Название"
    text
);

CREATE TABLE "УчастникТемы_YYYYMMDD"(
  "ДатаТемы"
    date
, "Тема"
    uuid
, "Персона"
    uuid
, PRIMARY KEY("Тема", "Персона")
);

CREATE TABLE "ДатыСообщенийТемы_YYYYMMDD"(
  "ДатаТемы"
    date
, "Тема"
    uuid
      PRIMARY KEY
, "Дата"
    date
);

Iffranka Penny pjuttost

Ukoll, x'jiġri jekk nużaw le għażla ta 'sezzjoni klassika ibbażat fuq id-distribuzzjoni tal-valuri tal-qasam (permezz ta 'attivaturi u wirt jew PARTITION BY), u "manwalment" fil-livell tal-applikazzjoni, tinduna li l-valur taċ-ċavetta tal-qsim diġà huwa maħżun fl-isem tat-tabella nnifisha.

Mela jekk int hekk Inti inkwetat ħafna dwar l-ammont ta 'dejta maħżuna?, allura tista 'teħles minn dawn l-oqsma "extra" u tindirizza tabelli speċifiċi. Veru, l-għażliet kollha minn diversi sezzjonijiet f'dan il-każ se jkollhom jiġu trasferiti għan-naħa tal-applikazzjoni.

Sors: www.habr.com

Żid kumment