messenger áá±áá¬áá±á·á áºááᯠá¡á ááŸá¡áá¯á¶áž áá®ááá¯ááºážáá¯ááºááŒááºáž á¥ááá¬ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáááºážááá¯á¡ááºáá»ááºáá»á¬ážááᯠáá®ážááŒá¬ážáá±áá¬ááœá²á·á ááºážáá¯á¶áá»á¬ážááá¯á· áááºááá¯á·áá¬áá¬ááŒááºááá¯ááá¯ááºáááºáááºážá
- á¡ááá¯ááºáž 1- á¡ááŒá±áá¶áá±á¬ááºááᯠáá®ááá¯ááºážááœá²ááŒááºážá
á¡ááá¯ááºáž 2- "á¡ááŒááºá¡á áœááºážá¡ááœááº" ááá¹áááœá²ááŒááºáž
áá«ááá¯á· á¡áááºážáá±á¬áẠááŒá®ážááŒá®ážáá¬ážáá¬áž ááŒáá·áºáá±ááŸá¬ ááá¯ááºáá°ážá
ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠshardingá replication ááŸáá·áº geo-distributed systems áá»á¬ážá ááŒá¿áá¬áá»á¬ážááᯠááááááá¯ááºáá² database á¡ááœááºážááŸá circuit solutions áá»á¬ážááᯠá¡á¬áá¯á¶á
áá¯ááºáá«áááºá
á¡ááá·áº 1- áá¯ááºáááºážá¡áá±ážá áááºá¡áá»áá¯á·
áá»áœááºá¯ááºááá¯á·á áááºáá±á·áá»áºááᯠá
áááºáá°ážáááºáááºááẠáá®ááá¯ááºážáá¯ááºáááºááá¯ááºáá±á¬áºáááºáž áááºážááᯠáááºáááºážáá»ááºááœáẠáá±á«ááºážá
ááºážáááºááŒá
áºáááºá
á á®ážááœá¬ážáá±ážáá¯ááºáááºážáá áºáá¯áá²á· áá¬áááºááœá±á áá¬ááœá±áá²á ááœá¶á·ááŒáá¯ážááá¯ážáááºáá±ážáá¬ááá²á· á¡ááŒá®ážá¡áá² Vasily áá²á· á¥ááá¬ááᯠááŒáá·áºááŒáá¡á±á¬ááºá
- "Nikolaiá áá®á¡áá¯ááºá¡ááœáẠáá®áá±á· patch áá
áºáá¯ááá¯áááºá"
ááá¯ááá¯áááºááŸá¬ á¡áá»áá¯á·áá±á¬ á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááœáẠá á¬áá±ážá á¬áá° ááŒá¯áá¯ááºááá¯ááºáááºá á á¬ááœááºá á¬áááºáž. - "Kolya áááºáž áá®á Dota ááœá¬ážááŸá¬áá¬ážá"
ááá¯ááá¯áááºááŸá¬ áá»á áºáá°á á¯á¶ááœá²áá áºááœá²áááºááẠáá áºááŒáá¯ááºááẠáááºááœááºááŒá±á¬ááá¯ááá¯ááºáááºá á¡áá»áá¯ážáá»áá¯ážáá±á¬á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážáá±á«áºááœááº. - "áá®áá¬á áá®ááá¯áá±á áá¬áá¬á¡áá
áºá¡ááœáẠá
á»á±ážááŸá¯ááºážá
á¬áááºážááᯠáá°ážááœá²áá«ááá¯ááºááœáẠááŒáá·áºááŸá¯áá«á"
áá«ááŒá±á¬áá·áº áááºáá±á·áá»áºáá áºáá¯áá±á¬á· áááá¯ááºáá«áááºá áááºáá¶áá°á¡áá»á¬ážá¡ááŒá¬áž. á€ááá á¹á ááœááºá áááºáá±á·ááºá»ááœááºáá« á ááºááá¯ááºáááºá áá°ážááœá²áá«ááá¯ááºáá»á¬áž. - "Semyon áááºážááŒáá·áºáá«áŠážá"
ááŒá®ážáá±á¬á· ááŸáááŒá®ážáá¬áž á á¬áá±ážá á¬áá°áá²ááᯠáááºááá¯á· á¡ááœáá·áºá¡áá±áž ááŸáááááºá á¡ááœá²á·áááºá¡áá áºááᯠááááºáá±á«áºáá«á.
ááá¯áááºááŸá "áááá¬áááºááŸá¬ážáá±á¬" ááá¯á¡ááºáá»ááºáá»á¬ážá á¬áááºážááœáẠáá±ááá¯ááºááŒáá«á áá¯á·á
ááŒá¿áá¬á á¡áá¯á¶ážáá»ááŸá¯ááá¯ááºáᬠá¡áá±ážá áááºá¡áá»ááºáá»á¬ážááŸáá·áº áááºážá¡ááœááºáá±ážáá¬ážáá±á¬ ááá·áºáááºáá»ááºáá»á¬ážááᯠáá¬ážááááºáá²á áá®ááá¯ááºážááœá²áá«á áááá±á¬ááºáááºá á¡á²áá«ááá¯ááŒá±ááŸááºážááá¯á· database schema á áááŒá áºááá¯ááºááá±á¬ááºáá«áá²á
á¡ááá·áº 2- á¡áááºážáá¯á¶áž áá±á¬á·áá»á áºáááºáááºáž
ááá¯á¡áá»áááºá¡áá á¡áá¬á¡á¬ážáá¯á¶ážááẠááá¬ážááá¯ážáá» áá¯ááºáááºážáá¯á¶ážáááááá¬ááŒá áºááá·áº á¡á®ážáá±ážááºá á¬áá±ážá á¬áá°ááŸáá·áº á¡ááœááºáááºáá°áááºá áá¯ááºáá«áááºá "algorithmically" áá¯ááºáááºážááŒá¿áá¬áá»á¬ážá áœá¬ááẠáá áºáá¯ááŸáá·áºáá áºáá¯áááºáá°áááºá ááá¯á·ááŒá±á¬áá·áº áááºážááá¯á·ááá¯ááŒá±ááŸááºážáááºáááááá¬áá»á¬ážááẠááœá²á·á ááºážáá¯á¶á¡ááááºáá°áá«áááºá
áááŸáááŒá®ážáá±á¬ áá¯áá¹áááá±á áá¯á¶ááŒááºážááᯠentity áááºáá¶áá±ážáá»á¬ážááᯠááŒá¯ááŒááºááŒáá«á
áá¯á·á áá»áœááºá¯ááºááá¯á·á áá±á¬áºáááºááᯠáá¬ážáááºááẠááá¯ááá¯ááœááºáá°á
á±áááºá áá»áœááºá¯ááºááá¯á·ááẠááá¬áá¡ááŸááá¯á¶áž display ááœá±ážáá»ááºááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
áá»áœááºá¯ááºááá¯á·áá¥ááá¬ááœááºá ááá¯ááºááá°á á
á¬ááœááºá
á¬áááºážááŸáá·áº ááœááááẠâááá¯ááºáááºâ áá»á¬ážááẠáá»áœááºá¯ááºááá¯á·ááááºáá±á¬ááºááŸá¯ááá«áá² áá®ážááŒá¬ážáááºááŸááá±áá±á¬ âááŒááºáâ á¡áá¬áá»á¬ážááŒá
áºáááºá ááá¯á·ááŒá±á¬áá·áºá UUID á០á¡áá»áá¯á·áá±á¬ ááá·áºááºáá»á¬ážááᯠâáá
áºáá±áá¬áá¬â á¡áá±ááŒáá·áº á¡áá¬áááºááœáẠáááºážááá¯á·ááᯠááá¯ážááŸááºážá
áœá¬ áá¬ážáááºááá±á¬áá±á«ááºáá«áááºá
ááœá²áááºá áá¯á¶ááŒááºážáá»á¬ážááᯠáááºááá¯ááºááá»áŸ ááá¯ážááŸááºážá¡á±á¬ááºááŒá¯áá¯ááºáá«á - áááºááŒááá·áºáá°á¡áá»á¬ážá á¯ááẠUML/IDEF ááá¯áááºáá¬ááœáẠáá»áœááºážáá»ááºáá°áá»á¬ážááá¯ááºááŒáá«á áá«áá±ááá·áº áá±áá»á¬ááœá²áá«á
á¡ááá·áº 3- ááá¬ážááœá²á·á ááºážáá¯á¶ áá¯á¶ááŒááºážáá±ážááœá²ááŒááºážá
ááá¬ážááŸáá·áº á¡ááœááºá¡áááºáá»á¬ážá¡ááŒá±á¬ááºážáááºáááºáá»á¬ážááŸáá·áº ááá¬ážáá»á¬ážá "áá¯ááŸá¬áž" á¡áááºáá»á¬ážááᯠááœá²ááŒá¬ážá
áœá¬ áááºáá¶ááá¯ááºáá±á¬áºáááºáž áááºážááẠá¡ááá¬ááá
á¹á
ááŒá
áºáááºá á¡ááŒá±á¬ááºážááŸá¬á
áá°áá»á¬ážá
áœá¬ááẠáá»áœááºá¯ááºááá¯á·áᶠáááºáá±á·áá»áºáá»á¬áž áá
áºááŒáá¯ááºááẠáá±ážááŒáá±á¬ááŒá±á¬áá·áºá á¡áá»áá¯á·ááŸá¬ á€áá²á·ááá¯á·ááẠááŒá¯áá¯ááºááá¯ááºáááºá á¡á±á¬á·ááºááá¯ááºážáá«ááá¯ááẠá¡ááá¯ážááŸááºážáá¯á¶áž ááœá±ážáá»ááºááŸá¯áá«á UUID áá»á¬ážááᯠááœá²ááŒá¬ážáááºááŸááºááŸá¯áá»á¬ážá¡ááŒá
Ạá¡áá¯á¶ážááŒá¯áá«á ááŒááºáá¡ááœá²á·á¡á
ááºážáá»á¬ážá¡ááœááºáá¬áá áá»áœááºá¯ááºááá¯á·ááááºáá±á¬ááºááŸá¯á¡ááœááºážááŸá á¡áá¬ááá¹áá¯á¡á¬ážáá¯á¶ážá¡ááœááºáááºážááŒá
áºáááºá ááá¯á·á¡ááŒááºá áááºážááá¯á·ááᯠclient áááºááœááºááẠáá¯ááºáá±ážááá¯ááºááẠ- áááºážááẠáá±áá¬áá±á·á
áºáá±áá¹áááááá¯ááºáá±á¬á¡áá«ááœáẠáá»áœááºá¯ááºááá¯á·á¡á¬áž áááºáá±á·áá»áºáá»á¬ážáá±ážááá¯á·áá¬ááœáẠáá¶á·ááá¯ážáá°áá®áá±ážáááºááŒá
áºááŒá®áž ááá¯ááºááááŸá¯ááŒá
áºááá¯ááºááŒá±ááŸá¬ á¡ááœááºáááºážáá«ážáá«áááºá
áá»áœááºá¯ááºááá¯á·ááá±áá¬áá±á·á
áºááŸá ááá¬ážáá°ááŒááºážáá¯á¶á
á¶ááẠá€áá²á·ááá¯á·ááŒá
áºáááá·áºáááº-
ááá¬ážáá»á¬áž : 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- áááºááŸá¬ážááá¯ááºáá±á¬ ááá¯á¡ááºáá»ááºáá»á¬ážááᯠááŸá¬ááœá±áá«á
áá«áá«áá²á ááẠááŒá®ážááŒáá·áºá á¯á¶á áœá¬ áá±ážáá¬ážááá¯ááºáá²á· áá±áá¬áá±á·á áºáá áºáá¯ááᯠáá»áœááºáá±á¬áºááá¯á· áá®ááá¯ááºážááœá²áá¬ážáá«áááºá áá áºáááºážáááºáž áááºáá«á
áá»áœááºá¯ááºááá¯á·ááááºáá±á¬ááºááŸá¯á¡áá¯á¶ážááŒá¯áá°ááááááºááœáẠááááááá¯ááºááá¯ááºáá¬ážááŒáá«á áá¯á· - áááºážááá¯áá»áœááºá¯ááºááá¯á·áá¬áá¯ááºááá¯áá«ááááºážá
- ÐПÑлеЎМОеÑППбÑеМОÑ
ဠá¡áá»áááºááŸáá·áº áááŒá±ážáá® á á®áá¬ážáááºá á á¶ááŸá¯ááºážá¡áá»áá¯ážáá»áá¯ážá¡áá±á«áºá¡ááŒá±áá¶ááá·áº "áá»áœááºá¯ááºá" áááºáá±á·áá»áºáá»á¬ážá á¬áááºážá áá»áœááºá¯ááºááẠá á¬áááºáá¶áá°áá»á¬ážáá²á០áá áºáŠážááŒá áºááŒá®áž áá»áœááºá¯ááºááẠá á¬áá±ážááá¬ááŸááá¬á áá»áœááºá¯ááºáᶠá á¬áá±ážá áááŒá±ááŒá¬ážáá²á·áá«á áááºážááá¯á·ááẠáá»áœááºá¯ááºá¡á¬áž áááŒá±ááŒá¬ážááá·áºáá±áá¬á ... - á
á¬áá±ážá
á¬áá° áá«áááºáá°áá»á¬áž
á€ááŸááºáá»á¬ážááŒá®áž ááŸááºáá»á¬ážáá±á¬ á áá¬ážááŒá±á¬áááºážááœáẠáááºáá°ááœá±áá±á¬áẠáá«áááºáá±áá«ááá²á
áá»áœááºá¯ááºááá¯á·áááœá²á·á ááºážáá¯á¶ááẠá€ááŒá¿áá¬ááŸá áºáá¯áá¯á¶ážááᯠâáá±áá°áá»á¡á¬ážááŒáá·áºâ ááŒá±ááŸááºážááá¯ááºá á±áá±á¬áºáááºáž ááŒááºááŒááºáááºáááºááá¯ááºáá±á ááŒá¿áá¬ááŸá¬ áááá¡áá¯ááºá¡ááœááºáž á á®áááºááŒá áºáááºá index ááááºáá®ážááá¯ááºáá«ááááºáááºážáá¬ážáá áºáŠážá á®á¡ááœáẠááá·áºáá»á±á¬áºááẠ(ááŸááºáááºážáá»á¬ážá¡á¬ážáá¯á¶ážááᯠáá¯ááºáá°ááá«áááº) ááŸáá·áº áááºááá¯á¡ááºáá±á¬ áá¯ááááá áºáá¯ááᯠááŒá±ááŸááºážáááºá áááºáá±á·ááºá»á¡á¬ážáá¯á¶ážááᯠáá¯ááºáá°áá«á á€á¡ááŒá±á¬ááºážá¡áá¬á¡áá±á«áºá
ááááºááœááºáá² á¡áá¯á¶ážááŒá¯áá° áá¯ááºáá±á¬ááºá áá¬áá»á¬ážááᯠáá²áá²áááºážáááºáž áá¯ááºááá¯ááºáá«áááºá áá¯ááºáá¯ááºá áœááºážá¡á¬ážááᯠááŒááºáá»á±á¬áºáá«á.
á¡ááá·áº 5- Smart Denormalization
áá»áœááºá¯ááºááá¯á·áááŒá¿áá¬ááŸá
áºáá¯áá¯á¶ážááᯠáá»áœááºá¯ááºááá¯á·áá¯ááºáá±á¬ááºááá·áº áá±á¬ááºáááºááœá²ááá¬ážáá»á¬ážááŒáá·áº ááŒá±ááŸááºážáá«áááºá áá±áá¬á¡á
áááºá¡ááá¯ááºážááᯠááœá¬ážáá«ááá»áœááºá¯ááºááá¯á·ááá¯ááºáááºážáá¬áááºáá»á¬ážá¡ááœáẠááá·áºáá»á±á¬áºáá±á¬ á¡ááœáŸááºážááááºážáá»á¬ážááᯠáááºážááá¯á·ááœáẠááœá²á·á
ááºážááẠááá¯á¡ááºáá«áááºá
ááá¬ážáá»á¬áž : 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)
);
á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡áááºááá¬ážáá»á¬ážááᯠáááºáá®ážáá¬ááœáẠá¡áá¯á¶ážááŒá¯áá±á·ááŸááá±á¬ áá¯á¶ááŸááºáá»ááºážáááºáááºážááŸá áºáá¯ááᯠá¡áá¯á¶ážáá»áá¬ážáá«áááºá
- ááááºážááááºážáá»á¬áž
áááŠážáááºáá±á·áá»áºááŸááºáááºážáá áºáá¯á¡á¬áž á¡áá¯á¶ážááŒá¯á ááá°áá®áá±á¬ááá¯ááºááŸááºáá»á¬ážá¡ááœáẠááŸááºáá¯á¶áááºá¡áá»áá¯ážá¡á á¬ážá¡áá»áá¯ážáá»áá¯ážááœáẠáá±á¬ááºáááºááœá²ááŸááºáááºážáá»á¬ážá áœá¬ááᯠáá»áœááºá¯ááºááá¯á·áááºáá®ážááẠ- áá±ážááá¯á·áá°á¡ááœááºáá±á¬ áááºáá¶áá°á¡ááœááºáá« ááœá²ááŒá¬ážáááºá ááá¯á·áá±á¬áº ááŸááºáá¯á¶áááºááŒááºážáá áºáá¯á á®ááẠá¡ááœáŸááºážááááºážáá±á«áºááœáẠáá»áá±á¬ááºáá±ááŒá®ááŒá áºááẠ- áá¯á¶ááŸááºá¡ááŒá±á¡áá±ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáááá á¬áá»ááºááŸá¬ááá¯áᬠááŒááºááá¯áááºááŒá áºáááºá - áá°ážááŒá¬ážáá±á¬ááŸááºáááºážáá»á¬áž
áá®ážááŒá¬ážá¡ááŒá±á¬ááºážá¡áá¬áá áºáá¯á¡ááœááºáž áááºáá±á·áá»áºáá±ážááá¯á·ááá·áºá¡áá«ááá¯ááºážá ááá¯ááá¯á·áá±á¬ááá·áºááœááºážááŸá¯ ááŸáááŸáá·áºááŒá®ážáá¬ážááŸááááŸá á á áºáá±ážááẠáá¯á¶áá±á¬ááºáá«áááºá ááá¯ááºáá«á áá»áœááºá¯ááºááá¯á·á "á¡áááá¬ááº" ááœáẠááá·áºáá«á
áá±á¬ááºážáá«ážá áá±á¬ááºá¡ááá¯ááºážááœáẠáá»áœááºá¯ááºááá¯á· ááœá±ážááœá±ážáá«áááºá
source: www.habr.com