Databasa Messenger (beş 1): sêwirana çarçoveya bingehîn

Meriv çawa dikare hewcedariyên karsaziyê wergerîne strukturên daneya taybetî bi karanîna nimûneya sêwirana databasek peyamberê ji nû ve.

Databasa Messenger (beş 1): sêwirana çarçoveya bingehîn
Bingeha me ew qas mezin û belav nabe, mîna VKontakte an Badoo, lê "da ku ew bû", lê ew baş bû - fonksiyonel, bilez û li ser yek server bicîh bikin PostgreSQL - da ku hûn mînakek karûbarek cihêreng li deverek li kêlekê, mînakî, bicîh bikin.

Ji ber vê yekê, em ê dest nedin mijarên parvekirin, dubarekirin û pergalên jeo-belavbûyî, lê dê balê bikişînin ser çareseriyên dorpêçê yên di hundurê databasê de.

Gav 1: Hin taybetmendiyên karsaziyê

Em ê peyamên xwe bi rengekî abstrakt sêwirînin, lê dê di hawîrdorê de yek bikin tora civakî ya pargîdanî. Ango gelê me ne “tenê hevûdu” dikin, di çarçoveya çareserkirina hin pirsgirêkên karsaziyê de bi hev re danûstandinê dikin.

Û karên karsaziyek çi ne?.. Ka em li mînaka Vasily, serokê beşa pêşveçûnê binêrin.

  • "Nikolai, ji bo vî karî îro pêdiviya me bi paçek heye!"
    Ev tê wê wateyê ku name dikare di çarçoveyek hin kesan de were meşandin belge.
  • "Kolya, tu vê êvarê diçî Dota?"
    Ango cotek muxatab jî dikarin hevdemî bi hev re têkilî daynin li ser mijarên cuda.
  • "Peter, Nikolay, li navnîşa bihayê servera nû li pêvekê bigerin."
    Ji ber vê yekê, yek peyam dikare hebe çend wergiran. Di vê rewşê de, dibe ku peyam hebe Pelên pêvekirî.
  • "Semyon, tu jî binêre."
    Û divê derfet hebe ku têkevin nav nameyên heyî endamek nû vexwendin.

Ka em niha li ser vê navnîşa hewcedariyên "eşkere" bisekinin.

Bêyî têgihîştina taybetmendiyên serîlêdanê yên pirsgirêkê û tixûbên ku jê re hatine dayîn, sêwirandin tesîrane şemaya databasê ya çareserkirina wê hema hema ne gengaz e.

Gav 2: Circuit Mantiqa Minimal

Heya nuha, her tişt pir dişibihe pêwendiya e-nameyê - amûrek karsaziyek kevneşopî. Erê, "algorîtmîkî" gelek pirsgirêkên karsaziyê dişibin hev, ji ber vê yekê amûrên ji bo çareserkirina wan dê ji hêla strukturel ve mîna hev bin.

Werin, em şemaya mentiqî ya ku jixwe hatî bidestxistin a têkiliyên hebûnê rast bikin. Ji bo ku em modela xwe hêsantir fêm bikin, em ê vebijarka pêşandana herî seretayî bikar bînin modelên ER bêyî tevliheviyên nîşaneyên UML an IDEF:

Databasa Messenger (beş 1): sêwirana çarçoveya bingehîn

Di mînaka me de, kes, belge û "beden"a binary a pelê hebûnên "derveyî" ne ku bêyî karûbarê me serbixwe hene. Ji ber vê yekê, em ê di pêşerojê de wan bi hêsanî wekî hin girêdanên "cihek" ji hêla UUID ve bihesibînin.

Xetkirin diagramên bi qasî ku pêkan hêsan e - piraniya kesên ku hûn ê nîşanî wan bidin di xwendina UML/IDEF de ne pispor in. Lê bê guman xêz bikin.

Gav 3: Sketching avahiya tabloyê

Li ser navên tablo û zeviyanNavên "rûsî" yên zevî û tabloyan dikarin cûda bêne derman kirin, lê ev mijarek tama ye. Ji ber ku li vir li Tensor pêşdebirên biyanî tune ne, û PostgreSQL destûrê dide me ku em navên bi hieroglif jî bidin, heke ew di nav lêkeran de hatine girtin, wê demê em tercîh dikin ku navên tiştan bi awayekî zelal û zelal bi nav bikin da ku cudahî nebin.
Ji ber ku gelek kes di carekê de ji me re peyaman dinivîsin, dibe ku hin ji wan jî vê yekê bikin offline, hingê bijareya herî hêsan e UUID-ê wekî nasname bikar bînin ne tenê ji bo saziyên derveyî, lê di heman demê de ji bo hemî tiştên di hundurê karûbarê me de jî. Digel vê yekê, ew dikarin li ser milê xerîdar jî bêne çêkirin - ev ê ji me re bibe alîkar ku em piştgirî bidin şandina peyaman dema ku databas bi demkî ne berdest be, û îhtîmala pevçûnek pir kêm e.

Struktura tabloya pêşnûmeyê ya di databasa me de dê wiha xuya bike:
Tablo: RU

CREATE TABLE "Тема"(
  "Тема"
    uuid
      PRIMARY KEY
, "Документ"
    uuid
, "Название"
    text
);

CREATE TABLE "Сообщение"(
  "Сообщение"
    uuid
      PRIMARY KEY
, "Тема"
    uuid
, "Автор"
    uuid
, "ДатаВремя"
    timestamp
, "Текст"
    text
);

CREATE TABLE "Адресат"(
  "Сообщение"
    uuid
, "Персона"
    uuid
, PRIMARY KEY("Сообщение", "Персона")
);

CREATE TABLE "Файл"(
  "Файл"
    uuid
      PRIMARY KEY
, "Сообщение"
    uuid
, "BLOB"
    uuid
, "Имя"
    text
);

Tablo: 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
);

Tişta herî hêsan dema danasîna formatek ev e ku meriv dest bi "vekêşana" grafika girêdanê bike ji tabloyên ku nayên referans kirin xwe ji kesî re nakin.

Gav 4: Pêdiviyên ne diyar bibînin

Ew e, me databasek çêkiriye ku hûn tê de dikarin bêkêmasî û binivîsin awayek xwendin.

Ka em xwe têxin şûna bikarhênerê karûbarê xwe - em dixwazin bi wê re çi bikin?

  • Peyamên dawî
    ev bi kronolojîk hatine rêzkirin tomarek peyamên "min" li ser bingeha pîvanên cihêreng. Li ku derê ez yek ji wergiran im, li ku derê nivîskar im, li ku ji min re nivîsîbûn û min bersiv neda, li ku bersiv nedan min, ...
  • Beşdarên danûstandinê
    Kî jî beşdarî vê sohbeta dûr û dirêj dibe?

Avahiya me dihêle ku em van herdu pirsgirêkan "bi gelemperî", lê ne zû çareser bikin. Pirsgirêk ev e ku di hundurê peywira yekem de veqetandin nikare îndeksê biafirîne, ji bo her yek ji beşdaran maqûl e (û hûn neçar in ku hemî tomaran derxînin), û ji bo çareserkirina ya duyemîn ku hûn hewce ne hemî peyaman derxînin li ser vê mijarê.

Karên bikarhêner ên nexwestî dibe ku stûr bin xaça li ser berhemdariya.

Gav 5: Denormalîzasyona Smart

Herdu pirsgirêkên me dê bi tabloyên din ên ku em tê de ne çareser bibin beşek daneyê dubare bike, pêdivî ye ku em li ser wan indeksên ku ji bo karên me guncan in ava bikin.
Databasa Messenger (beş 1): sêwirana çarçoveya bingehîn

Tablo: RU

CREATE TABLE "РеестрСообщений"(
  "Владелец"
    uuid
, "ТипРеестра"
    smallint
, "ДатаВремя"
    timestamp
, "Сообщение"
    uuid
, PRIMARY KEY("Владелец", "ТипРеестра", "Сообщение")
);
CREATE INDEX ON "РеестрСообщений"("Владелец", "ТипРеестра", "ДатаВремя" DESC);

CREATE TABLE "УчастникТемы"(
  "Тема"
    uuid
, "Персона"
    uuid
, PRIMARY KEY("Тема", "Персона")
);

Tablo: 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)
);

Li vir me du nêzîkatiyên tîpîk ên ku di çêkirina tabloyên alîkar de têne bikar anîn bicîh anîne:

  • Pirkirina tomar
    Bi karanîna yek tomara peyama destpêkê, em çend tomarên şopandinê di cûrbecûr tomaran de ji bo xwediyên cihê diafirînin - hem ji bo şander û hem jî ji bo wergir. Lê her yek ji qeydan naha dikeve ser pêvekê - her tiştî, di rewşek tîpîk de, em ê bixwazin tenê rûpela yekem bibînin.
  • Qeydên bêhempa
    Her gava ku hûn di nav mijarek taybetî de peyamek dişînin, bes e ku hûn kontrol bikin ka navnîşek wusa jixwe heye. Ger na, wê têxin “ferhenga” me.

Di beşa paşîn ya gotarê de em ê li ser biaxivin pêkanîna dabeşkirinê nav avahiya databasa me.

Source: www.habr.com

Add a comment