Baz done Messenger (pati 1): konsepsyon fondasyon baz la

Ki jan ou ka tradui kondisyon biznis yo nan estrikti done espesifik lè l sèvi avèk egzanp nan konsepsyon yon baz done mesaje soti nan grafouyen.

Baz done Messenger (pati 1): konsepsyon fondasyon baz la
Baz nou an p ap menm gwo ak distribye, tankou VKontakte oswa Badoo, men "se konsa ke li te", men li te bon - fonksyonèl, vit ak anfòm sou yon sèl sèvè PostgreSQL - pou ou ka deplwaye yon egzanp separe nan sèvis la yon kote sou bò a, pou egzanp.

Se poutèt sa, nou pa pral manyen pwoblèm yo nan sharding, replikasyon ak sistèm geo-distribiye, men nou pral konsantre sou solisyon sikwi andedan baz done a.

Etap 1: Gen kèk spesifik biznis

Nou pa pral konsepsyon mesaj nou an abstrèman, men nou pral entegre li nan anviwònman an rezo sosyal antrepriz. Sa vle di, pèp nou an pa "jis koresponn," men kominike youn ak lòt nan yon kontèks rezoud pwoblèm biznis sèten.

Ak ki travay yo nan yon biznis?.. Ann gade nan egzanp lan nan Vasily, chèf depatman devlopman an.

  • "Nikolai, pou travay sa a nou bezwen yon patch jodi a!"
    Sa vle di ke korespondans ka fèt nan yon kontèks kèk dokiman.
  • "Kolya, ou pral Dota aswè a?"
    Sa vle di, menm yon sèl pè entèrlokuteur ka kominike ansanm sou plizyè sijè.
  • "Pyè, Nikolay, gade nan atachman an pou lis pri nouvo sèvè a."
    Se konsa, yon mesaj ka genyen plizyè benefisyè. Nan ka sa a, mesaj la ka genyen Fichye tache.
  • "Semyon, gade tou."
    Epi ta dwe gen yon opòtinite pou antre nan korespondans ki egziste deja envite yon nouvo manm.

Ann rete sou lis sa a nan bezwen "evidan" pou kounye a.

San yo pa konprann espesifik yo aplike nan pwoblèm nan ak limit yo bay li, konsepsyon efikas chema baz done yo rezoud li se prèske enposib.

Etap 2: Minim sikwi lojik

Jiskaprezan, tout bagay mache byen sanble ak korespondans imel - yon zouti biznis tradisyonèl yo. Wi, "algoritmikman" anpil pwoblèm biznis yo sanble youn ak lòt, kidonk zouti pou rezoud yo pral estriktirèl menm jan an.

Ann ranje dyagram lojik ki deja jwenn nan relasyon antite yo. Pou fè modèl nou an pi fasil pou konprann, nou pral sèvi ak opsyon ekspozisyon ki pi primitif la ER modèl san konplikasyon notasyon UML oswa IDEF:

Baz done Messenger (pati 1): konsepsyon fondasyon baz la

Nan egzanp nou an, moun, dokiman an ak "kò" binè nan dosye a se antite "ekstèn" ki egziste poukont yo san sèvis nou an. Se poutèt sa, nou pral tou senpleman wè yo nan lavni an kòm kèk lyen "yon kote" pa UUID.

Trase dyagram osi senp ke posib - pi fò nan moun ou pral montre yo yo pa ekspè nan lekti UML/IDEF. Men, asire w ke ou trase.

Etap 3: Fè desen estrikti tab la

Konsènan tab ak non jaden yoNon yo "Ris" nan jaden ak tab yo ka trete yon fason diferan, men sa a se yon kesyon de gou. Paske la isit la nan Tensor pa gen okenn devlopè etranje, epi PostgreSQL pèmèt nou bay non menm nan yeroglif, si yo fèmen nan guillemets, Lè sa a, nou prefere bay non objè yo san anbigwite ak klè pou pa gen okenn diferans.
Piske anpil moun ekri mesaj pou nou an menm tan, kèk nan yo ka menm fè sa offline, Lè sa a, opsyon ki pi senp la se sèvi ak UUID kòm idantifyan pa sèlman pou antite ekstèn, men tou pou tout objè andedan sèvis nou an. Anplis, yo ka pwodwi menm sou bò kliyan an - sa ap ede nou sipòte voye mesaj lè baz done a pa disponib pou yon ti tan, ak chans pou yon kolizyon trè ba.

Estrikti tab bouyon an nan baz done nou an ap sanble sa a:
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
);

Bagay ki pi senp lè w ap dekri yon fòma se kòmanse "dewoulman" graf koneksyon an soti nan tab ki pa referans tèt yo pa pèsonn.

Etap 4: Chèche konnen bezwen ki pa evidan

Sa a li, nou te fèt yon baz done nan ki ou ka ekri parfe ak yon jan kanmenm li.

Ann mete tèt nou nan soulye itilizatè a nan sèvis nou an - ki sa nou vle fè ak li?

  • Dènye mesaj
    Li kwonolojikman klase yon rejis mesaj "mwen" ki baze sou plizyè kritè. Kote mwen se youn nan moun k ap resevwa yo, kote mwen ye otè a, kote yo te ekri m epi mwen pa t reponn, kote yo pa t reponn mwen,...
  • Patisipan yo nan korespondans la
    Ki moun ki menm patisipe nan chat long sa a?

Estrikti nou an pèmèt nou rezoud tou de pwoblèm sa yo "an jeneral," men se pa byen vit. Pwoblèm lan se ke pou klasman nan premye travay la pa kapab kreye endèks, apwopriye pou chak patisipan yo (epi w ap gen ekstrè tout dosye yo), ak rezoud dezyèm youn ou bezwen an. ekstrè tout mesaj yo sou sijè sa a.

Travay itilizatè pa entansyonèl ka mete fonse kwa sou pwodiktivite.

Etap 5: Smart Denormalization

Tou de pwoblèm nou yo pral rezoud pa tab adisyonèl nan ki nou pral kopi yon pati nan done yo, nesesè yo fòme sou yo endis apwopriye pou travay nou yo.
Baz done Messenger (pati 1): konsepsyon fondasyon baz la

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

Isit la nou te aplike de apwòch tipik yo itilize lè nou kreye tab oksilyè:

  • Miltipliye dosye yo
    Sèvi ak yon sèl dosye inisyal mesaj, nou kreye plizyè dosye swivi nan diferan kalite rejis pou pwopriyetè diferan - tou de pou moun k ap voye a ak pou moun k ap resevwa a. Men, chak nan rejis yo kounye a tonbe sou endèks la - apre tout, nan yon ka tipik, nou pral vle wè sèlman premye paj la.
  • Dosye inik
    Chak fwa ou voye yon mesaj nan yon sijè espesifik, li ase yo tcheke si yon antre sa a deja egziste. Si ou pa, ajoute li nan "diksyonè" nou an.

Nan pwochen pati nan atik la nou pral pale sou aplikasyon patisyon nan estrikti baz done nou an.

Sous: www.habr.com

Add nouvo kòmantè