SÔnumite andmebaas (osa 1): projekteerime andmebaasi struktuuri

Kuidas saab Àritegevuse nÔuded konkreetseteks andmestruktuurdeks tÔlkida, kasutades nÀiteks "nullist" saadud andmebaasi projekteerimist sÔnumivahetuseks.

SÔnumite andmebaas (osa 1): projekteerime andmebaasi struktuuri
Meie andmebaas ei saa olema nii ulatuslik ja jaotatud, nagu VKontakte vĂ”i Badoo, vaid pigem "et oleks", aga siiski hĂ€sti — funktsionaalne, kiire ja mahtuks ĂŒhele serverile. PostgreSQL — et saaksime kĂ€ivitada eraldi teenuse eksemplari kuskil kĂ”rval, nĂ€iteks.

Seega ei kĂ€sitle me shardimise, replikatsiooni ja geograafiliste sĂŒsteemide kĂŒsimusi, vaid keskendume skeemilistele lahendustele andmebaasi sees.

Samm 1: Veidi Àrispetsiifikat.

Meie sĂ”numivahetust projekteerime mitte abstraktselt, vaid integreerime ettevĂ”tte sotsiaalvĂ”rku. See tĂ€hendab, et inimesed ei "lihtsalt suhtle", vaid suhtlevad omavahel teatud Ă€riĂŒlesannete tĂ€itmise kontekstis.. Millised Ă€riĂŒlesanded on? Vaatame nĂ€iteks Vassili nĂ€itel — arendusosakonna juhti.

"Nikolai, selle ĂŒlesande jaoks on tĂ€na juba vajalik patch!"

  • See tĂ€hendab, et suhtlemine vĂ”ib toimuma nĂ€iteks mingis kontekstis
    "Kola, lÀhme tÀna Ôhtul Dota mÀngima?" dokument.
  • See tĂ€hendab, et isegi ĂŒhe paarikese vestluses vĂ”ib suhtlemine samal ajal toimuda.
    See, even a single pair of interlocutors can communicate simultaneously. erinevate teemadega.
  • „Petr, Nikolai, vaadake manuses uusi serveri hindu.“
    Ühel sĂ”numil vĂ”ib olla mitu saajat. Samuti vĂ”ib sĂ”num sisaldada manustatud faile.
  • „Semen, ka sina vaata seda.“
    Ja peab olema vÔimalus juba olemasolevasse vestlusse kaasa kutsuda uus osaleja.

Peatume praegu sellel nimekirjal „ilmselgetest“ vajadustest.

Ilma rakenduslikke eripĂ€rasid ĂŒlesande ja selle kehtestatud piirangute mĂ”istmata on praktiliselt vĂ”imatu projekteerida tĂ”husat andmebaasi skeemi selle lahendamiseks.

2. samm: minimaalne loogiline skeem

Skeemiliselt tundub kĂ”ik vĂ€ga sarnane e-kirjadevahetusele — traditsioonilisele Ă€rivahendile. Jah, „algtude“ paljud Ă€riĂŒlesanded nĂ€evad vĂ€lja sarnased, seega on ka nende lahendamiseks vajalikud tööriistad struktuurselt sarnased.

Kinnitatame juba saadud loogilise suhete skeemi. Arusaamise lihtsustamiseks meie mudelisse kasutame kÔige primitiivsemaid kuvamisviise ER-mudeleid ilma UML vÔi IDEF-mÀrkuste keerukusteta:

SÔnumite andmebaas (osa 1): projekteerime andmebaasi struktuuri

Meie nĂ€ites on tegelane, dokument ja faili binaarne "keha" "vĂ€listest" ĂŒksustest, mis eksisteerivad iseseisvalt ilma meie teenuseta. SeetĂ”ttu tajume neid edaspidi kui mĂ”ningaid linke "kuidas iganes", kasutades UUID-d.

Joonistage skeeme nii lihtsalt kui vĂ”imalik — enamiku nende jaoks, kellele te neid nĂ€itate, ei ole UML/IDEF lugemise eksperdid. Kuid — kindlasti joonistage.

Samm 3: Joonistame tabelite struktuuri

Tabelite ja vĂ€ljade nimedestK 'vene' tabeli ja vĂ€ljade nimede suhtes vĂ”ib suhtuda erinevalt, kuid see on maits kĂŒsimus. Kuna meil 'Tensoris' ei ole vĂ€lismaalaste arendajaid, ja PostgreSQL vĂ”imaldab meil nime anda isegi hieroglĂŒĂŒfidega, kui need on jutumĂ€rkides, siis eelistame nimetada objekte ĂŒheselt mĂ”istetavalt, et vĂ€ltida tĂ”lgenduste erinevusi.
Kuna sĂ”numeid kirjutab meil mitu inimest korraga, vĂ”ivad mĂ”ned neist seda teha offline-reĆŸiimis, siis kĂ”ige lihtsam variant on kasutada UUID-d identifikaatoritena mitte ainult vĂ€listes ĂŒksustes, vaid ka kĂ”igi objektide jaoks meie teenuses. TĂ€iendavaks plussiks on see, et neid saab genereerida isegi kliendi poolel — see aitab meil sĂ”numite saatmist toetada lĂŒhiajalise andmebaasi kĂ€ttesaamatuse korral, ja kokkupĂ”rke tĂ”enĂ€osus on ÀÀrmiselt madal.

Meie andmebaasi tööversioon tabelite struktuur nÀeb vÀlja jÀrgmine:
Tabelid: RU

LOOJA TABEL "Teema"(
  "Teema"
    uuid
      PEAMISED VÕTME
, "Dokument"
    uuid
, "Pealkiri"
    tekst
);

LOOJA TABEL "SÔnum"(
  "SÔnum"
    uuid
      PEAMISED VÕTME
, "Teema"
    uuid
, "Autor"
    uuid
, "KuupÀevAeg"
    timestamp
, "Tekst"
    tekst
);

LOOJA TABEL "Aadressaat"(
  "SÔnum"
    uuid
, "Isik"
    uuid
, PEAMISED VÕTME("SĂ”num", "Isik")
);

LOOJA TABEL "Fail"(
  "Fail"
    uuid
      PEAMISED VÕTME
, "SÔnum"
    uuid
, "BLOB"
    uuid
, "Nimi"
    tekst
);

Tabelid : EN

LOOJA TABEL teema(
  teema
    uuid
      PEAMISED VÕTME
, dokument
    uuid
, pealkiri
    tekst
);

LOOJA TABEL sÔnum(
  sÔnum
    uuid
      PEAMISED VÕTME
, teema
    uuid
, autor
    uuid
, dt
    timestamp
, keha
    tekst
);

LOOJA TABEL sÔnum_aadressaat(
  sÔnum
    uuid
, isik
    uuid
, PEAMISED VÕTME(sĂ”num, isik)
);

LOOJA TABEL sÔnum_fail(
  fail
    uuid
      PEAMISED VÕTME
, sÔnum
    uuid
, sisu
    uuid
, failinimi
    tekst
);

Lihtsaim viis formaadi kirjeldamiseks on alustada suhete graafist tabelitest, mis ei viita mingile teisele.

Samm 4: Selgitame vÀlja mitte ilmsed vajadused

Oleme projekteerinud andmebaasi, kuhu on suurepÀrane kirjutada ja kuidagi lugeda.

Pange end meie teenuse kasutaja olukorda — mida me sooviksime selle abil teha?

  • Viimased sĂ”numid
    See kronoloogiliselt jĂ€rjestatud minu sĂ”numite register eri kriteeriumide jĂ€rgi. Kus ma olen ĂŒks adressaatidest, kus ma olen autor, kus kirjutati mulle, aga ma ei vastanud, kus mulle ei vastatud, 

  • Vestluse osalejad
    Kes on ĂŒldse selles pikale veninud vestluses osalised?

Meie struktuur vĂ”imaldab lahendada mĂ”lemat ĂŒlesannet â€žĂŒldiselt“, kuid kiiresti - ei. Probleem on selles, et esimese ĂŒlesande raames sortimise jaoks pole vĂ”imalik luua indeksi, mis sobib igale osalejale (ja tuleb vĂ€lja vĂ”tta kĂ”ik salvestised), ning teise ĂŒlesande lahendamiseks on vajalik vĂ€lja vĂ”tta kĂ”ik sĂ”numid teema kohta.

Ette nÀhtud kasutajaprobleemid vÔivad tÔsiselt kahjustada tulemusi.

Samm 5: MÔistlik denormaalimine

MĂ”lemad meie probleemid aitavad lahendada tĂ€iendavad tabelid, kuhu me kavatseme duplitseerida osa andmeid, mis on vajalik nendele ĂŒlesannetele vastavate indeksite moodustamiseks.
SÔnumite andmebaas (osa 1): projekteerime andmebaasi struktuuri

Tabelid: RU

Loo tabel "SÔnumiteRegister"(
  "Omanik"
    uuid
, "RegistriTĂŒĂŒp"
    smallint
, "KuupÀevAeg"
    timestamp
, "SÔnum"
    uuid
, PRIMARY KEY("Omanik", "RegistriTĂŒĂŒp", "SĂ”num")
);
Loo indeks "SĂ”numiteRegister"("Omanik", "RegistriTĂŒĂŒp", "KuupĂ€evAeg" DESC);

Loo tabel "TeemaOsaleja"(
  "Teema"
    uuid
, "Isik"
    uuid
, PRIMARY KEY("Teema", "Isik")
);

Tabelid : EN

Loo tabel message_registry(
  owner
    uuid
, registry
    smallint
, dt
    timestamp
, message
    uuid
, PRIMARY KEY(owner, registry, message)
);
Loo indeks message_registry(owner, registry, dt DESC);

Loo tabel theme_participant(
  theme
    uuid
, person
    uuid
, PRIMARY KEY(theme, person)
);

Siin rakendasime kahte tĂŒĂŒpilist lĂ€henemist, mida kasutatakse abitaabelite loomisel:

  • Kirjete paljundamine
    Loome ĂŒhe algse sĂ”numi pĂ”hjal mitu jĂ€rgmise kirje varianti eri registrites erinevatele omanikele — nii saatjale kui ka saajale. NĂŒĂŒd sobitub iga register indeksisse, sest tĂŒĂŒpiliselt tahame nĂ€ha ainult esimest lehte.
  • Kirjete unikaalsus
    Iga sÔnumi saatmise korral antud teemas piisab, et kontrollida, kas selline kirje juba eksisteerib. Kui ei, siis lisame selle meie "sÔnaraamatusse".

JÀrgmises artikli osas rÀÀgime sektsioonide rakendamine meie andmebaasi struktuuri.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster