Perustamme ei ole yhtä suuri ja hajautunut, kuten VKontakte tai Badoo, mutta "niin että oli", mutta se oli hyvä - toimiva, nopea ja mahtuu yhdelle palvelimelle PostgreSQL - jotta voit ottaa käyttöön erillisen palvelun esiintymän esimerkiksi jonnekin sivuun.
Siksi emme käsittele sharing-, replikointi- ja geo-hajautettuja järjestelmiä koskevia kysymyksiä, vaan keskitymme tietokannan sisällä oleviin piiriratkaisuihin.
Vaihe 1: Yrityksen yksityiskohtia
Emme suunnittele viestintäämme abstraktisti, vaan integroimme sen ympäristöön yrityksen sosiaalinen verkosto. Toisin sanoen ihmiset eivät "vain kirjeenvaihtaja", vaan kommunikoivat keskenään tiettyjen liiketoimintaongelmien ratkaisemisen yhteydessä.
Ja mitkä ovat yrityksen tehtävät?... Katsotaanpa kehitysosaston johtajan Vasilyn esimerkkiä.
"Nikolai, tähän tehtävään tarvitsemme paikan tänään!"
Tämä tarkoittaa, että kirjeenvaihtoa voidaan käydä joidenkin yhteydessä asiakirja.
"Kolya, oletko menossa Dotaan tänä iltana?"
Eli jopa yksi keskustelukumppanipari voi kommunikoida samanaikaisesti eri aiheista.
"Peter, Nikolay, katso liitteestä uuden palvelimen hinnasto."
Joten yksi viesti voi olla useita vastaanottajia. Tässä tapauksessa viesti voi sisältää Liitetyt tiedostot.
"Semyon, katso sinäkin."
Ja pitäisi olla mahdollisuus osallistua olemassa olevaan kirjeenvaihtoon kutsu uusi jäsen.
Pysähdytään nyt tähän "ilmeisten" tarpeiden luetteloon.
Suunnittele ymmärtämättä ongelman sovellettavia erityispiirteitä ja sille annettuja rajoituksia tehokas tietokantakaavion ratkaiseminen on lähes mahdotonta.
Vaihe 2: Minimaalinen logiikkapiiri
Toistaiseksi kaikki toimii hyvin samalla tavalla kuin sähköpostin kirjeenvaihto - perinteinen yritystyökalu. Kyllä, "algoritmisesti" monet liiketoimintaongelmat ovat samankaltaisia toistensa kanssa, joten työkalut niiden ratkaisemiseen ovat rakenteellisesti samanlaisia.
Korjataan jo saatu looginen kaavio entiteettien suhteista. Jotta mallimme olisi helpompi ymmärtää, käytämme alkeellisinta näyttövaihtoehtoa ER mallit ilman UML- tai IDEF-merkintöjen komplikaatioita:
Esimerkissämme tiedoston henkilö, asiakirja ja binääri "runko" ovat "ulkoisia" kokonaisuuksia, jotka ovat olemassa itsenäisesti ilman palveluamme. Siksi näemme ne tulevaisuudessa yksinkertaisesti joinakin UUID-linkkeinä "jossain".
Piirrä kaaviot mahdollisimman yksinkertaisia - Suurin osa ihmisistä, joille näytät ne, eivät ole asiantuntijoita lukemaan UML/IDEF. Mutta muista piirtää.
Vaihe 3: Taulukon rakenteen luonnos
Tietoja taulukoiden ja kenttien nimistäKenttien ja taulukoiden "venäläisiä" nimiä voidaan käsitellä eri tavalla, mutta tämä on makuasia. Koska täällä Tensorissa ei ole ulkomaisia kehittäjiä, ja PostgreSQL antaa meille mahdollisuuden antaa nimiä jopa hieroglyfeinä, jos ne lainausmerkkien sisällä, niin haluamme nimetä objektit yksiselitteisesti ja selkeästi, jotta eroja ei ole.
Koska monet ihmiset kirjoittavat meille viestejä kerralla, jotkut heistä voivat jopa tehdä tämän offline-tilassa, niin yksinkertaisin vaihtoehto on käyttää UUID-tunnisteita ei vain ulkoisille kokonaisuuksille, vaan myös kaikille palvelumme sisällä oleville kohteille. Lisäksi ne voidaan luoda jopa asiakaspuolella - tämä auttaa meitä tukemaan viestien lähettämistä, kun tietokanta ei ole tilapäisesti käytettävissä ja törmäyksen todennäköisyys on erittäin pieni.
Tietokannassamme oleva luonnostaulukkorakenne näyttää tältä: Taulukot : RU
Yksinkertaisin asia muotoa kuvattaessa on aloittaa yhteyskaavion "purkaminen". taulukoista, joihin ei ole viitattu itseään kenellekään.
Vaihe 4: Selvitä epäselvät tarpeet
Siinä kaikki, olemme suunnitelleet tietokannan, johon voit kirjoittaa täydellisesti ja jotenkin lukea.
Asetutaanpa itsemme palvelumme käyttäjän kenkiin - mitä haluamme tehdä sillä?
Viimeiset viestit
Se kronologisesti lajiteltuna "minun" viestien rekisteri, joka perustuu eri kriteereihin. Missä olen yksi vastaanottajista, missä olen kirjoittaja, missä he kirjoittivat minulle ja minä en vastannut, missä he eivät vastanneet minulle, ...
Kirjeenvaihdon osallistujat
Kuka edes osallistuu tähän pitkään, pitkään keskusteluun?
Rakenteemme avulla voimme ratkaista molemmat ongelmat "yleisesti", mutta ei nopeasti. Ongelmana on ensimmäisen tehtävän lajittelu indeksiä ei voi luoda, joka sopii jokaiselle osallistujalle (ja sinun on purettava kaikki tietueet) ja ratkaistaksesi toisen tarvitsemasi purkaa kaikki viestit tässä aiheessa.
Käyttäjän tahattomat tehtävät voivat olla lihavoituja ristiin tuottavuuden kanssa.
Vaihe 5: Älykäs denormalisointi
Molemmat ongelmamme ratkaistaan lisätaulukoilla, joissa teemme kopioida osa tiedoista, joita tarvitaan tehtäviimme sopivien indeksien muodostamiseen.
Tässä olemme soveltaneet kahta tyypillistä lähestymistapaa, joita käytetään aputaulukoiden luomisessa:
Tietueiden kertominen
Yhdellä aloitusviestitietueella luomme useita seurantatietueita erityyppisiin rekistereihin eri omistajille - sekä lähettäjälle että vastaanottajalle. Mutta jokainen rekistereistä kuuluu nyt hakemistoon - loppujen lopuksi tyypillisessä tapauksessa haluamme nähdä vain ensimmäisen sivun.
Ainutlaatuisia ennätyksiä
Joka kerta kun lähetät viestin tietyn aiheen sisällä, riittää tarkistaa, onko tällainen merkintä jo olemassa. Jos ei, lisää se "sanakirjaamme".
Artikkelin seuraavassa osassa puhumme siitä osioinnin toteutus tietokantarakenteeseen.