Kuidas saab Àritegevuse nÔuded konkreetseteks andmestruktuurdeks tÔlkida, kasutades nÀiteks "nullist" saadud andmebaasi projekteerimist sÔnumivahetuseks.
- Osa 1: projekteerime andmebaasi karkassi

Meie andmebaas ei saa olema nii ulatuslik ja jaotatud, vĂ”i , 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. . 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 ilma UML vÔi IDEF-mÀrkuste keerukusteta:

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

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 meie andmebaasi struktuuri.
Allikas: habr.com
