Π‘Π” мСссСндТСра (Ρ‡.1): ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ каркас Π±Π°Π·Ρ‹

Как ΠΌΠΎΠΆΠ½ΠΎ пСрСвСсти бизнСс-трСбования Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ проСктирования «с нуля» Π±Π°Π·Ρ‹ для мСссСндТСра.

Π‘Π” мСссСндТСра (Ρ‡.1): ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ каркас Π±Π°Π·Ρ‹
Наша Π±Π°Π·Π° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½ΠΎΠΉ ΠΈ распрСдСлСнной, ΠΊΠ°ΠΊ Ρƒ Π’ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅ ΠΈΠ»ΠΈ Badoo, Π° Β«Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎΒ», Π½ΠΎ Π±Ρ‹Π»ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, быстро ΠΈ ΡƒΠΌΠ΅Ρ‰Π°Π»ΠΎΡΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ сСрвСрС PostgreSQL β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр сСрвиса Π³Π΄Π΅-Ρ‚ΠΎ Π½Π° сторонС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Ρ‚ΡŒ вопросы ΡˆΠ°Ρ€Π΄ΠΈΠ½Π³Π°, Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ гСораспрСдСлСнных систСм, Π° сосрСдоточимся Π½Π° схСмных Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ… Π²Π½ΡƒΡ‚Ρ€ΠΈ Π‘Π”.

Π¨Π°Π³ 1: НСмного бизнСс-спСцифики

Наш ΠΎΠ±ΠΌΠ΅Π½ сообщСниями ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ абстрактно, Π° Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ соцсСти. Π’ΠΎ Π΅ΡΡ‚ΡŒ люди Ρƒ нас Π½Π΅ «просто ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡΒ», Π° ΠΎΠ±Ρ‰Π°ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой Π² контСкстС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… бизнСс-Π·Π°Π΄Π°Ρ‡.

А ΠΊΠ°ΠΊΠΈΠ΅ Π±Ρ‹Π²Π°ΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ Ρƒ бизнСса?.. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Василия β€” руководитСля ΠΎΡ‚Π΄Π΅Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

  • «Николай, Π²ΠΎΡ‚ ΠΏΠΎ этой Π·Π°Π΄Π°Ρ‡Π΅ ΠΏΠ°Ρ‚Ρ‡ Π½ΡƒΠΆΠ΅Π½ ΡƒΠΆΠ΅ сСгодня!Β»
    Π—Π½Π°Ρ‡ΠΈΡ‚, пСрСписка ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅ΡΡ‚ΠΈΡΡŒ Π² контСкстС ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°.
  • «Коля, Π³ΠΎ Π²Π΅Ρ‡Π΅Ρ€ΠΎΠΌ Π² Π΄ΠΎΡ‚Ρƒ?Β»
    Π’ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ Ρƒ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ собСсСдников ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅ΡΡ‚ΠΈΡΡŒ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ Ρ‚Π΅ΠΌΠ°ΠΌ.
  • Β«ΠŸΠ΅Ρ‚Ρ€, Николай, посмотритС Π² Π°Ρ‚Ρ‚Π°Ρ‡Π΅ прайс Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ сСрвСр.Β»
    Π’Π°ΠΊ, Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ сообщСния ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько адрСсатов. ΠŸΡ€ΠΈ этом сообщСниС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.
  • Β«Π‘Π΅ΠΌΠ΅Π½, ΠΈ Ρ‚Ρ‹ Ρ‚ΠΎΠΆΠ΅ взгляни.Β»
    И Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π² ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ пСрСписку ΠΏΡ€ΠΈΠ³Π»Π°ΡΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ³ΠΎ участника.

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌΡΡ ΠΏΠΎΠΊΠ° Π½Π° этом ΠΏΠ΅Ρ€Π΅Ρ‡Π½Π΅ Β«ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ…Β» потрСбностСй.

Π‘Π΅Π· понимания ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ спСцифики Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π΅ΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, ΡΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ схСму Π‘Π” для Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ практичСски Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π¨Π°Π³ 2: Минимальная логичСская схСма

Π‘Ρ…Π΅ΠΌΠ½ΠΎ ΠΏΠΎΠΊΠ° всС получаСтся ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° email-пСрСписку β€” Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ инструмСнт вСдСния бизнСса. Π’Π°ΠΊΠΈ Π΄Π°, «алгоритмичСски» ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ бизнСса ΠΏΠΎΡ…ΠΎΠΆΠΈ Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π°, поэтому ΠΈ инструмСнты для ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π±ΡƒΠ΄ΡƒΡ‚ структурно сходны.

Π”Π°Π²Π°ΠΉΡ‚Π΅ зафиксируСм ΡƒΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΡƒΡŽΡΡ Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ схСму ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ сущностСй. Для простоты понимания нашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ самым ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ отобраТСния ER-ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±Π΅Π· услоТнСний UML ΠΈΠ»ΠΈ IDEF-Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ:

Π‘Π” мСссСндТСра (Ρ‡.1): ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ каркас Π±Π°Π·Ρ‹

Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрсона, Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Β«Ρ‚Π΅Π»ΠΎΒ» Ρ„Π°ΠΉΠ»Π° β€” это «внСшниС» сущности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π±Π΅Π· нашСго сСрвиса. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ просто Π±ΡƒΠ΄Π΅ΠΌ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈΡ… Π² дальнСйшСм ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ссылки Β«ΠΊΡƒΠ΄Π°-Ρ‚ΠΎΒ» ΠΏΠΎ UUID.

РисуйтС схСмы ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ β€” Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ‚Π΅Ρ…, ΠΊΠΎΠΌΡƒ Π²Ρ‹ ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ экспСртами Π² Ρ‡Ρ‚Π΅Π½ΠΈΠΈ UML/IDEF. Но β€” рисуйтС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Π¨Π°Π³ 3: НабрасываСм структуру Ρ‚Π°Π±Π»ΠΈΡ†

ΠŸΡ€ΠΎ ΠΈΠΌΠ΅Π½Π° Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ полСйК «русским» названиям ΠΏΠΎΠ»Π΅ΠΉ ΠΈ Ρ‚Π°Π±Π»ΠΈΡ† ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ, Π½ΠΎ это Π΄Π΅Π»ΠΎ вкуса. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас Π² Β«Π’Π΅Π½Π·ΠΎΡ€Π΅Β» Π½Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²-иностранцСв, Π° PostgreSQL позволяСт Π½Π°ΠΌ Π΄Π°Π²Π°Ρ‚ΡŒ названия Ρ…ΠΎΡ‚ΡŒ ΠΈΠ΅Ρ€ΠΎΠ³Π»ΠΈΡ„Π°ΠΌΠΈ, Ссли ΠΎΠ½ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ-понятно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ Ρ€Π°Π·Π½ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ.
ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сообщСния Ρƒ нас ΠΏΠΈΡˆΡƒΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ людСй сразу, Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π² ΠΎΡ„Ρ„Π»Π°ΠΉΠ½-Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚ΠΎ самый простой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 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)
);

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈ Π΄Π²Π° Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, примСняСмых ΠΏΡ€ΠΈ создании Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†:

  • Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ записСй
    Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ исходной записи сообщСния сразу нСсколько записСй-слСдствий Π² Ρ€Π°Π·Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ рССстров для Ρ€Π°Π·Π½Ρ‹Ρ… Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π² β€” ΠΊΠ°ΠΊ для отправитСля, Ρ‚Π°ΠΊ ΠΈ для получатСля. Π—Π°Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· рССстров Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ лоТится Π½Π° индСкс β€” вСдь Π² Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠΌ случаС ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΡƒΡŽ страницу.
  • Уникализация записСй
    ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ сообщСния Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ‚Π΅ΠΌΡ‹ достаточно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, сущСствуСт Π»ΠΈ ΡƒΠΆΠ΅ такая запись. Если Π½Π΅Ρ‚ β€” добавляСм Π΅Π΅ Π² наш Β«ΡΠ»ΠΎΠ²Π°Ρ€ΡŒΒ».

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ сСкционирования Π² структуру нашСй Π±Π°Π·Ρ‹.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com