మెసెంజర్ డేటాబేస్ (పార్ట్ 1): బేస్ ఫ్రేమ్‌వర్క్ రూపకల్పన

మీరు మొదటి నుండి మెసెంజర్ డేటాబేస్ రూపకల్పన యొక్క ఉదాహరణను ఉపయోగించి వ్యాపార అవసరాలను నిర్దిష్ట డేటా నిర్మాణాలలోకి ఎలా అనువదించవచ్చు.

మెసెంజర్ డేటాబేస్ (పార్ట్ 1): బేస్ ఫ్రేమ్‌వర్క్ రూపకల్పన
మా బేస్ అంత పెద్దది మరియు పంపిణీ చేయబడదు, VKontakte వంటిది లేదా వై బడూ, కానీ “అలా ఉంది”, కానీ అది బాగుంది - ఫంక్షనల్, ఫాస్ట్ మరియు ఒక సర్వర్‌లో సరిపోతాయి PostgreSQL - మీరు సేవ యొక్క ప్రత్యేక ఉదాహరణను ఎక్కడో ఒక చోట అమర్చవచ్చు, ఉదాహరణకు.

కాబట్టి, మేము షార్డింగ్, రెప్లికేషన్ మరియు జియో-డిస్ట్రిబ్యూటెడ్ సిస్టమ్‌ల సమస్యలపై తాకము, కానీ డేటాబేస్ లోపల సర్క్యూట్ పరిష్కారాలపై దృష్టి పెడతాము.

దశ 1: కొన్ని వ్యాపార ప్రత్యేకతలు

మేము మా సందేశాన్ని వియుక్తంగా రూపొందించము, కానీ దానిని పర్యావరణంలోకి కలుపుతాము కార్పొరేట్ సామాజిక నెట్వర్క్. అంటే, మా ప్రజలు "కేవలం అనుగుణంగా" కాదు, కానీ కొన్ని వ్యాపార సమస్యలను పరిష్కరించే సందర్భంలో ఒకరితో ఒకరు సంభాషించుకుంటారు.

మరి వ్యాపారానికి సంబంధించిన పనులు ఏమిటి?.. అభివృద్ధి శాఖాధిపతి వాసిలీ ఉదాహరణను చూద్దాం.

  • "నికోలాయ్, ఈ పని కోసం ఈ రోజు మనకు ప్యాచ్ అవసరం!"
    అంటే కొందరి సందర్భంలో కరస్పాండెన్స్ నిర్వహించవచ్చు పత్రం.
  • "కోల్యా, మీరు ఈ సాయంత్రం డోటాకు వెళ్తున్నారా?"
    అంటే, ఒక జత సంభాషణకర్తలు కూడా ఏకకాలంలో కమ్యూనికేట్ చేయగలరు వివిధ అంశాలపై.
  • "పీటర్, నికోలాయ్, కొత్త సర్వర్ కోసం ధర జాబితా కోసం అటాచ్‌మెంట్‌లో చూడండి."
    కాబట్టి, ఒక సందేశం ఉండవచ్చు అనేక మంది గ్రహీతలు. ఈ సందర్భంలో, సందేశం ఉండవచ్చు జతచేసిన ఫైళ్లు.
  • "సెమియన్, మీరు కూడా చూడండి."
    మరియు ఇప్పటికే ఉన్న కరస్పాండెన్స్‌లోకి ప్రవేశించడానికి అవకాశం ఉండాలి కొత్త సభ్యుడిని ఆహ్వానించండి.

ప్రస్తుతానికి “స్పష్టమైన” అవసరాల జాబితాపై నివసిద్దాం.

సమస్య యొక్క అనువర్తిత ప్రత్యేకతలు మరియు దానికి ఇచ్చిన పరిమితులను అర్థం చేసుకోకుండా, డిజైన్ చేయండి సమర్థవంతమైన దాన్ని పరిష్కరించడానికి డేటాబేస్ స్కీమా దాదాపు అసాధ్యం.

దశ 2: మినిమల్ లాజిక్ సర్క్యూట్

ఇప్పటివరకు, ప్రతిదీ ఇమెయిల్ కరస్పాండెన్స్‌తో సమానంగా పని చేస్తుంది - సాంప్రదాయ వ్యాపార సాధనం. అవును, “అల్గోరిథమిక్” అనేక వ్యాపార సమస్యలు ఒకదానికొకటి సమానంగా ఉంటాయి, కాబట్టి వాటిని పరిష్కరించే సాధనాలు నిర్మాణాత్మకంగా సమానంగా ఉంటాయి.

ఎంటిటీల సంబంధాల యొక్క ఇప్పటికే పొందిన తార్కిక రేఖాచిత్రాన్ని పరిష్కరిద్దాం. మా మోడల్‌ను సులభంగా అర్థం చేసుకోవడానికి, మేము అత్యంత ప్రాచీనమైన ప్రదర్శన ఎంపికను ఉపయోగిస్తాము ER నమూనాలు UML లేదా IDEF సంజ్ఞామానాల సమస్యలు లేకుండా:

మెసెంజర్ డేటాబేస్ (పార్ట్ 1): బేస్ ఫ్రేమ్‌వర్క్ రూపకల్పన

మా ఉదాహరణలో, ఫైల్ యొక్క వ్యక్తి, పత్రం మరియు బైనరీ “బాడీ” మా సేవ లేకుండా స్వతంత్రంగా ఉండే “బాహ్య” ఎంటిటీలు. అందువల్ల, మేము వాటిని భవిష్యత్తులో UUID ద్వారా “ఎక్కడో” లింక్‌లుగా గ్రహిస్తాము.

గీయండి రేఖాచిత్రాలు వీలైనంత సరళంగా ఉంటాయి - మీరు వారికి చూపించే చాలా మంది వ్యక్తులు UML/IDEF చదవడంలో నిపుణులు కాదు. అయితే తప్పకుండా గీయండి.

దశ 3: పట్టిక నిర్మాణాన్ని గీయడం

పట్టిక మరియు ఫీల్డ్ పేర్ల గురించిఫీల్డ్‌లు మరియు టేబుల్‌ల “రష్యన్” పేర్లను భిన్నంగా పరిగణించవచ్చు, కానీ ఇది రుచికి సంబంధించిన విషయం. ఎందుకంటే ఇక్కడ టెన్సర్ వద్ద విదేశీ డెవలపర్‌లు లేరు మరియు పోస్ట్‌గ్రెస్‌ఎస్‌క్యూఎల్ హైరోగ్లిఫ్‌లలో కూడా పేర్లను ఇవ్వడానికి అనుమతిస్తుంది. కోట్స్‌లో జతచేయబడింది, అప్పుడు మేము వస్తువులను నిస్సందేహంగా మరియు స్పష్టంగా పేరు పెట్టడానికి ఇష్టపడతాము, తద్వారా వ్యత్యాసాలు లేవు.
చాలా మంది ఒకేసారి మాకు సందేశాలు వ్రాస్తారు కాబట్టి, వారిలో కొందరు దీన్ని కూడా చేయవచ్చు ఆఫ్‌లైన్, అప్పుడు సరళమైన ఎంపిక UUIDలను ఐడెంటిఫైయర్‌లుగా ఉపయోగించండి బాహ్య ఎంటిటీలకు మాత్రమే కాకుండా, మా సేవలోని అన్ని వస్తువులకు కూడా. అంతేకాకుండా, అవి క్లయింట్ వైపు నుండి కూడా ఉత్పత్తి చేయబడతాయి - డేటాబేస్ తాత్కాలికంగా అందుబాటులో లేనప్పుడు మరియు ఘర్షణ సంభావ్యత చాలా తక్కువగా ఉన్నప్పుడు సందేశాలను పంపడంలో ఇది మాకు మద్దతు ఇస్తుంది.

మా డేటాబేస్‌లోని డ్రాఫ్ట్ టేబుల్ నిర్మాణం ఇలా ఉంటుంది:
పట్టికలు: 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
);

పట్టికలు: 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
);

ఆకృతిని వివరించేటప్పుడు సరళమైన విషయం ఏమిటంటే కనెక్షన్ గ్రాఫ్‌ను "విడదీయడం" ప్రారంభించడం సూచించబడని పట్టికల నుండి ఎవరికీ తాము.

దశ 4: స్పష్టమైన అవసరాలను కనుగొనండి

అంతే, మేము డేటాబేస్ను రూపొందించాము, దీనిలో మీరు ఖచ్చితంగా వ్రాయగలరు మరియు ఏదో చదవండి.

మన సేవ యొక్క వినియోగదారు యొక్క బూట్లలో మనల్ని మనం ఉంచుకుందాం - మనం దానితో ఏమి చేయాలనుకుంటున్నాము?

  • చివరి సందేశాలు
    కాలక్రమానుసారంగా క్రమబద్ధీకరించబడింది వివిధ ప్రమాణాల ఆధారంగా "నా" సందేశాల రిజిస్ట్రీ. గ్రహీతలలో నేను ఎక్కడ ఉన్నాను, నేను రచయిత ఎక్కడ ఉన్నాను, వారు నాకు ఎక్కడ వ్రాసారు మరియు నేను సమాధానం చెప్పలేదు, వారు నాకు ఎక్కడ సమాధానం ఇవ్వలేదు, ...
  • కరస్పాండెన్స్‌లో పాల్గొనేవారు
    ఈ సుదీర్ఘమైన, సుదీర్ఘమైన చాట్‌లో ఎవరు పాల్గొంటున్నారు?

మా నిర్మాణం ఈ రెండు సమస్యలను "సాధారణంగా" పరిష్కరించడానికి అనుమతిస్తుంది, కానీ త్వరగా కాదు. సమస్య ఏమిటంటే మొదటి పనిలో క్రమబద్ధీకరించడం సూచికను సృష్టించడం సాధ్యం కాలేదు, పాల్గొనే ప్రతి ఒక్కరికీ అనుకూలం (మరియు మీరు అన్ని రికార్డులను సంగ్రహించవలసి ఉంటుంది), మరియు మీకు అవసరమైన రెండవదాన్ని పరిష్కరించడానికి అన్ని సందేశాలను సంగ్రహించండి ఈ అంశంపై.

అనాలోచిత వినియోగదారు పనులు బోల్డ్‌గా ఉంచవచ్చు ఉత్పాదకతపై క్రాస్.

దశ 5: స్మార్ట్ డీనార్మలైజేషన్

మా రెండు సమస్యలు అదనపు పట్టికల ద్వారా పరిష్కరించబడతాయి, దీనిలో మేము చేస్తాము డేటా యొక్క నకిలీ భాగం, వాటిపై మా పనులకు తగిన సూచికలను రూపొందించడం అవసరం.
మెసెంజర్ డేటాబేస్ (పార్ట్ 1): బేస్ ఫ్రేమ్‌వర్క్ రూపకల్పన

పట్టికలు: RU

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

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

పట్టికలు: 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)
);

ఇక్కడ మేము సహాయక పట్టికలను సృష్టించేటప్పుడు ఉపయోగించే రెండు సాధారణ విధానాలను వర్తింపజేసాము:

  • రికార్డులను గుణించడం
    ఒక ప్రారంభ మెసేజ్ రికార్డ్‌ని ఉపయోగించి, మేము వేర్వేరు ఓనర్‌ల కోసం వివిధ రకాల రిజిస్టర్‌లలో అనేక ఫాలో-అప్ రికార్డ్‌లను సృష్టిస్తాము - పంపినవారి కోసం మరియు గ్రహీత కోసం. కానీ ప్రతి రిజిస్టర్‌లు ఇప్పుడు ఇండెక్స్‌పైకి వస్తాయి - అన్నింటికంటే, ఒక సాధారణ సందర్భంలో, మేము మొదటి పేజీని మాత్రమే చూడాలనుకుంటున్నాము.
  • ప్రత్యేక రికార్డులు
    మీరు నిర్దిష్ట అంశంలో సందేశాన్ని పంపిన ప్రతిసారీ, అటువంటి ఎంట్రీ ఇప్పటికే ఉందో లేదో తనిఖీ చేస్తే సరిపోతుంది. కాకపోతే, దానిని మా "నిఘంటువు"కి జోడించండి.

వ్యాసం యొక్క తదుపరి భాగంలో మనం మాట్లాడతాము విభజన అమలు మా డేటాబేస్ నిర్మాణంలోకి.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి