SÔnumite andmebaas (jag. 1): projekteerime andmebaasi karkassi

Kuidas saame Ă€ri nĂ”udmisi tĂ”lkida konkreetseteks andmestruktuurideks, kasutades nĂ€itena andmebaasi projekteerimist „nullist” sĂ”numite jaoks.

SÔnumite andmebaas (jag. 1): projekteerime andmebaasi karkassi
Meie andmebaas ei saa olema nii ulatuslik ja jaotatud, nagu VKontakte'il vĂ”i Badoo, vaid „et lihtsalt oleks”, aga oleks hĂ€sti — funktsionaalselt, kiiresti ja mahtuks ĂŒhele serverile PostgreSQL — et oleks vĂ”imalik kuskil kĂŒlgselt teenuse eraldi eksemplari kĂ€ivitada, nĂ€iteks.

Seega ei puuduta me shardimise, replikatsiooni ja geograafiliselt jaotatud sĂŒsteemide teemasid, vaid keskendume andmebaasi sisemistele skeemilahendustele.

Samm 1: Veidi Àri-spetsiifikat

Meie sĂ”numite vahetust ei projekteeri me abstraktselt, vaid integreerime selle keskkonda ettevĂ”tte sotsiaalvĂ”rgustikku. See tĂ€hendab, et inimesed ei tee lihtsalt teksti vahetust, vaid suhtlevad omavahel teatud Ă€riĂŒlesannete lahendamise kontekstis.

Aga millised Ă€riĂŒlesanded vĂ”ivad olla?.. Vaatame Vasili nĂ€itel — arendusosakonna juhi kaudu.

  • „Nikolai, selle ĂŒlesande kohta on patch tĂ€na juba vajalik!”
    See tÀhendab, et vestlus vÔib toimuda mingisuguse dokumentide.
  • „Kola, lĂ€heme Ă”htul Dota'sse?”
    See tĂ€hendab, et isegi ĂŒhe paarilise vahel vĂ”ib samaaegselt kĂ€ia suhtlemine erinevatel teemadel.
  • „Pjotr, Nikolai, vaadake manustes uus serveri hind.”
    Nii, ĂŒhel sĂ”numil vĂ”ib olla mitu adressaati. Selle juures vĂ”ib sĂ”num sisaldada manustatud faile.
  • „Semen, vaata sa ka.”
    Ja peaks olema vÔimalus juba olemasolevasse vestlusesse uut osalist kutsuda.

Peatume praegu sellel „ilmse” vajaduste nimekirjal.

Ilma rakenduse spetsiifika ja selle seatud piirangute mÔistmiseta on peaaegu vÔimatu projekteerida efektiivset andmebaasi skeemi selle lahendamiseks.

Samm 2: Minimaalne loogiline skeem

Skeem on muu hulgas vĂ€ga sarnane e-kirjavahetusele — traditsiooniline Ă€ri lĂ€biviimise instrument. TĂ”epoolest, paljude Ă€riĂŒlesannete „algsed” lahendused sarnanevad teineteisele, seega on ka nende lahendamiseks kasutatavad vahendid struktuurilt sarnased.

Kinnitan juba saavutatud loogilise skeemi suhete kohta. Meie mudeli arusaamise lihtsustamiseks kasutame kÔige primitiivsemat varianti ER-mudeli kuvamiseks ER-mudel ilma UML vÔi IDEF mudeliteta:

SÔnumite andmebaas (jag. 1): projekteerime andmebaasi karkassi

Meie nÀites on isik, dokument ja faili binaarne "keha" "vÀlistena" entiteetid, mis eksisteerivad ka ilma meie teenuseta. Seega vÔtame need edaspidi lihtsalt mÔne linkina "kusagile" UUID alusel.

Joonistage skeeme nii lihtsasti kui vĂ”imalik — enamik neist, kellele te neid nĂ€itate, ei ole UML/IDEF lugemise eksperdid. Kuid — kindlasti joonistage.

Samm 3: Loome tabelite struktuuri

Tabelite ja vĂ€ljade nimedestVĂ”ib olla erinevaid arvamusi „vene“ nime kohta vĂ€ljadele ja tabelitele, aga see on maits kĂŒsimus. Kuna meie "Tensoris" pole vĂ€lismaalasi arendajaid, ja PostgreSQL vĂ”imaldab meil nimetada isegi hieroglĂŒĂŒfidena, kui need on tsitaatides, siis eelistame nimetada objekte ĂŒheselt arusaadavalt, et ei tekiks segadust.
Kuna sĂ”numeid kirjutavad mitmed inimesed korraga, vĂ”ivad mĂ”ned neist seda teha off-line reĆŸiimis, siis kĂ”ige lihtsam variant on kasutada UUID-sid identifikaatoritena mitte ainult vĂ€liste entiteetide, vaid ka kĂ”igi objektide jaoks meie teenuses. Ning nende genereerimist saab teha isegi kliendi poolel — see aitab meil toetada sĂ”numite saatmist lĂŒhiajalisel DB kĂ€ttesaamatuse ajal, samas kui kokkulangevuse tĂ”enĂ€osus on ÀÀrmiselt vĂ€ike.

Meie andmebaasi must struktuur nÀeb vÀlja jÀrgmine:
Tabelid: RU

CREATE TABLE "Teema"(
  "Teema"
    uuid
      PRIMARY KEY
, "Dokument"
    uuid
, "Nimi"
    text
);

CREATE TABLE "SÔnum"(
  "SÔnum"
    uuid
      PRIMARY KEY
, "Teema"
    uuid
, "Autor"
    uuid
, "KuupÀevAeg"
    timestamp
, "Tekst"
    text
);

CREATE TABLE "Adressaat"(
  "SÔnum"
    uuid
, "Isik"
    uuid
, PRIMARY KEY("SÔnum", "Isik")
);

CREATE TABLE "Fail"(
  "Fail"
    uuid
      PRIMARY KEY
, "SÔnum"
    uuid
, "BLOB"
    uuid
, "Nimi"
    text
);

Tabelid: EN

CREATE TABLE theme(
  theme
    uuid
      PRIMARY KEY
, document
    uuid
, title
    text
);

CREATE TABLE message(
  message
    uuid
      PRIMARY KEY
, theme
    uuid
, author
    uuid
, dt
    timestamp
, body
    text
);

CREATE TABLE message_addressee(
  message
    uuid
, person
    uuid
, PRIMARY KEY(message, person)
);

CREATE TABLE message_file(
  file
    uuid
      PRIMARY KEY
, message
    uuid
, content
    uuid
, filename
    text
);

Lihtsaim viis formaadi kirjeldamiseks on "nÀidata" suhete graafikut tabelitest, mis ei viita ise kellelegi.

Samm 4: Selgitame vÀlja mitte-eeldatavad vajadused

KÔik, oleme projekteerinud andmebaasi, kuhu saab suurepÀraselt kirjutada ja kuidagi lugeda.

Asetame end meie teenuse kasutaja asemele — mida me tahaksime selle abil teha?

  • Viimased sĂ”numid
    See on ajaliselt jĂ€rjestatud erinevate kriteeriumite jĂ€rgi ĂŒlevaade "minu" sĂ”numitest. Kus ma olen ĂŒks adressaatidest, kus ma olen autor, kus minule kirjutati, aga ma ei vastanud, kus mulle ei vastatud, ...
  • Vestluse osalised
    Kes ĂŒldse osaleb selles pika-pika jututoas?

Meie struktuur vĂ”imaldab lahendada mĂ”lemad need ĂŒlesanded "ĂŒldiselt", kuid kiiresti — ei. Probleem on see, et esimeses ĂŒlesandes sortimise jaoks ei saa luua indeksi, mis sobiks igale osalejale (ja tuleb vĂ€lja vĂ”tta kĂ”ik kirjed), aga teise lahendamiseks on vaja vĂ€lja vĂ”tta kĂ”ik sĂ”numid teema kohta.

Etteplaneerimata kasutajaĂŒlesanded vĂ”ivad tĂ”siselt madaldada jĂ”udlust.

Samm 5: MÔistlik denormaliseerimine

MĂ”lemad meie probleemid aitavad lahendada tĂ€iendavad tabelid, kuhu me dubleerime osa andmeid, vajalikud sisseehitatud indeksite loomiseks meie ĂŒlesannetele sobivalt.
SÔnumite andmebaas (jag. 1): projekteerime andmebaasi karkassi

Tabelid: RU

CREATE TABLE "SÔnumiteRegister"(
  "Omandaja"
    uuid
, "RegisterTĂŒĂŒp"
    smallint
, "KuupÀevAeg"
    timestamp
, "SÔnum"
    uuid
, PRIMARY KEY("Omandaja", "RegisterTĂŒĂŒp", "SĂ”num")
);
CREATE INDEX ON "SĂ”numiteRegister"("Omandaja", "RegisterTĂŒĂŒp", "KuupĂ€evAeg" DESC);

CREATE TABLE "TeemaOsaline"(
  "Teema"
    uuid
, "Isik"
    uuid
, PRIMARY KEY("Teema", "Isik")
);

Tabelid: EN

CREATE TABLE message_registry(
  owner
    uuid
, registry
    smallint
, dt
    timestamp
, message
    uuid
, PRIMARY KEY(owner, registry, message)
);
CREATE INDEX ON message_registry(owner, registry, dt DESC);

CREATE TABLE theme_participant(
  theme
    uuid
, person
    uuid
, PRIMARY KEY(theme, person)
);

Siin rakendasime kaks tĂŒĂŒpilist lĂ€henemisviisi abitablejate loomisel:

  • Kirjete paljundamine
    Loome ĂŒhe algse sĂ”numi kohta kohe mitu tulemust erinevates registrites erinevatele omanikele — nagu saatjale, nii ka saajale. Ent iga register katab nĂŒĂŒd indeksi — kuna tĂŒĂŒpilises olukorras tahame nĂ€ha ainult esimest lehte.
  • Kirjete unikaalsus
    Iga sĂ”numi saatmise korral teatud teema raames piisab, kui kontrollida, kas selline kirje juba eksisteerib. Kui ei — lisame selle oma "sĂ”nastikku".

JÀrgmises artikli osas rÀÀgitakse jaotamise rakendamisest meie andmebaasi struktuuri.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster