Kuidas saame Ă€ri nĂ”udmisi tĂ”lkida konkreetseteks andmestruktuurideks, kasutades nĂ€itena andmebaasi projekteerimist ânullistâ sĂ”numite jaoks.
- Jagu 1: projekteerime andmebaasi karkassi

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

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

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