ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΠ Π΄Π»Ρ ΡΠ°ΠΉΡΠ° ΠΏΠΎΡ ΠΎΠΆΠ΅Π³ΠΎ Π½Π° fab.com - ΡΠΎΡΠ³ΠΎΠ²ΠΎΠΉ ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΠΈ Π°ΡΡΠ΅ΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ³Ρ.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΈΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
- Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΡΠΎΡΠΈΠ»ΡΡ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ:
- ΠΈΠΌΡ;
- ΠΏΠΎΡΡΠ°;
- ΠΏΠ°ΡΠΎΠ»Ρ (Π² Π·Π°Ρ ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅);
- Π±Π°Π»Π°Π½Ρ (Π΄Π»Ρ ΠΏΠΎΠΊΡΠΏΠΎΠΊ);
- ΡΠΏΠΈΡΠΎΠΊ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ;
- ΡΠΎΠ²Π°ΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π½ΠΆΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΡ ΠΏΠΎΠΊΡΠΏΠΊΠΈ;
- ΠΊΠΎΡΠ·ΠΈΠ½Π°;
- ΠΊΡΠΏΠ»Π΅Π½Π½ΡΠ΅ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΡ (Ρ ΠΏΠΎΠΌΠ΅ΡΠΊΠ°ΠΌΠΈ ΠΎ ΡΠΎΠΌ, Π±ΡΠ» Π»ΠΈ ΡΠΎΠ²Π°Ρ ΡΠΊΠ°ΡΠ°Π½: Π΅ΡΠ»ΠΈ Π½Π΅Ρ, ΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ Π²ΠΎΠ·Π²ΡΠ°Ρ);
- ΠΈΡΡΠΎΡΠΈΡ ΠΏΠΎΠΊΡΠΏΠΎΠΊ;
- ΠΈΡΡΠΎΡΠΈΡ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ ΠΎΡΠ΅Π½ΠΎΠΊ ΠΈΠ»ΠΈ ΠΎΡΠ·ΡΠ²ΠΎΠ²;
- ΠΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΈ ΠΏΠ»Π°ΡΠ΅ΠΆΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
- ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π±ΡΠ» Π·Π°Π±Π°Π½Π΅Π½, ΡΠΎ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΠΎΠ»Π΅Π΅ ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΎΡΠ·ΡΠ²Ρ ΠΈ ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
- Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΡΠΎΡΠΈΠ»ΡΡ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ-ΠΏΡΠΎΠ΄Π°Π²ΡΠΎΠ²:
- ΠΈΠΌΡ ΠΏΡΠΎΠ΄Π°Π²ΡΠ° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ);
- Π±Π°Π»Π°Π½Ρ (Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° Π½Π° ΠΊΠ°ΡΡΡ);
- ΡΠΏΠΈΡΠΎΠΊ ΡΠΎΠ²Π°ΡΠΎΠ²;
- ΠΎΠ±ΡΠ°Ρ ΠΎΡΠ΅Π½ΠΊΠ° (ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΎΡΠ·ΡΠ²ΠΎΠ² ΠΈ ΠΈΡ Π°Π³ΡΠ΅Π³Π°ΡΠ°);
- ΠΡΠ±ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Π΅ΠΌ.
- ΠΡΠ±ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ°ΡΡ ΠΏΡΠΎΠ΄Π°Π²ΡΠΎΠΌ, ΠΏΡΠΎΠΉΠ΄Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ.
- ΠΡΠΎΠ΄Π°Π²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΏΠΎ Π΅Π³ΠΎ ΡΠΎΠ²Π°ΡΠ°ΠΌ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ Π²ΡΠ΅ Π²ΠΌΠ΅ΡΡΠ΅:
- ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π΄Π΅Π½Ρ/ΠΌΠ΅ΡΡΡ/Π³ΠΎΠ΄, Π·Π° Π²ΡΡ Π²ΡΠ΅ΠΌΡ Π±ΡΠ» ΠΏΡΠΎΠ΄Π°Π½ ΠΏΡΠΎΠ΄ΡΠΊΡ(Ρ);
- ΠΡΠΎΠ΄Π°Π²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΈΡΠ°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π²Π°ΡΠΈΠ°ΡΠΈΠΈ Π»ΠΈΡΠ΅Π½Π·ΠΈΠΉ Π΄Π»Ρ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΎΠ²Π°ΡΠΎΠ².
- ΠΡΠΎΠ΄Π°Π²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠ΅ΡΡΡΡ Π°ΠΊΠΊΠ°ΡΠ½Ρ ΠΏΡΠΈ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π²ΡΠ΅ Π΅Π³ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΡ ΠΏΡΠΎΠΏΠ°Π΄Π°ΡΡ ΠΈΠ· ΠΏΠΎΠΈΡΠΊΠ° (ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π²ΡΡ Π΅ΡΡ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π½ΠΈΠΌ, Π΅ΡΠ»ΠΈ ΠΊΡΠΏΠΈΠ»ΠΈ Π΅Π³ΠΎ ΡΠ°Π½Π΅Π΅), Π° Π°ΠΊΠΊΠ°ΡΠ½Ρ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ.
- ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΎΡΠ΅Π½ΠΊΠΈ ΠΏΡΠΎΠ΄Π°Π²ΡΠ°.
- Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°Ρ
:
- Π½Π°Π·Π²Π°Π½ΠΈΠ΅;
- ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅;
- ΠΏΠΎΠ΄ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ;
- ΡΠ΅Π³ΠΈ;
- ΡΠΊΡΠΈΠ½ΡΠΎΡΡ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ;
- Π±Π°Π·ΠΎΠ²Π°Ρ ΡΠ΅Π½Π°;
- ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΊΠΈΠ΄ΠΊΠΈ;
- Π΄Π°ΡΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ;
- ΡΡΠ»ΠΎΠ²ΠΈΡ Π»ΠΈΡΠ΅Π½Π·ΠΈΠΈ (ΠΈΠ· ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° ΠΈΠ»ΠΈ Π½Π°ΠΏΠΈΡΠ°Π½Π½Π°Ρ ΠΏΡΠΎΠ΄Π°Π²ΡΠΎΠΌ);
- ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π²ΠΎΠ·ΡΠ°ΡΡΡ (Π΄Π»Ρ Π²ΡΠ΅Ρ Π²ΠΎΠ·ΡΠ°ΡΡΠΎΠ² ΠΈΠ»ΠΈ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ);
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π²Π΅ΡΡΠΈΠΉ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ²:
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ.
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠΊΠ°ΡΠ° ΠΊ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌ Π²Π΅ΡΡΠΈΡΠΌ.
- ΠΠ°ΠΆΠ΄Π°Ρ Π²Π΅ΡΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π½Π½ΡΠΉ ΡΠΎΡΠΊΠ°ΠΌΠΈ (major, minor, patch).
- ΠΠ΅ΡΡΠΈΡ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠΎΠ²Π°Ρ (Π±Π΅Π· ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈ ΠΏΡΠΎΡΠ΅Π³ΠΎ).
- Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠ° Π² ΡΠΎΡΠΌΠ°ΡΠ΅ Π°ΡΡ
ΠΈΠ²Π°
.zip. - ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ (Π½Π΅ ΡΠ°ΡΡΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ).
- ΠΠ»Π°Π΄Π΅Π»Π΅Ρ ΡΠΎΠ²Π°ΡΠ° ΠΈΠΌΠ΅Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΠΎΠ²Π°Ρ, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΄Π°Π»ΠΈΡΡ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ°ΡΡΠ΅ Π²Π΅ΡΡΠΈΠΈ.
- ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΎΡΠ΅Π½ΠΊΠΈ ΡΠΎΠ²Π°ΡΠ°.
- ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ΄ ΡΠΎΠ²Π°ΡΠΎΠΌ.
- Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
- Π°Π²ΡΠΎΡ;
- Π΄Π°ΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ;
- ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ (ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΡΡΡΠΌ Π΄Π»Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π²);
- ΡΠ΅ΠΊΡΡ;
- ΠΠ»Ρ ΠΏΡΠΎΠ΄Π°Π²ΡΠΎΠ² ΠΈ ΡΠΎΠ²Π°ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΉΡΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΈΡ ΠΎΡΠ΅Π½ΠΊΠΈ.
- ΠΠ° ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΎΡΠ΅Π½ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΉΡΠΈΠ½Π³:
- ΡΡΠ΅Π΄Π½Π΅Π΅ ΡΠΈΡΠ»ΠΎ;
- ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΠ΅Π½ΠΎΠΊ ΠΎΡ 1 Π΄ΠΎ 5 (Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ);
- ΠΠ° ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΎΡΠ΅Π½ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΡΠ΅ ΠΎΡΠ·ΡΠ²Ρ Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ.
- ΠΡΠ·ΡΠ² ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ·:
- ΡΠΈΡΠ»Π΅Π½Π½Π°Ρ ΠΎΡΠ΅Π½ΠΊΠ° ΠΎΡ 1 Π΄ΠΎ 5;
- Π°Π²ΡΠΎΡ;
- Π΄Π°ΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ;
- ΡΠ΅ΠΊΡΡ;
- ΠΠ»Ρ ΡΠΎΠ²Π°ΡΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡΠΌ, ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠΌ, ΡΠ΅Π³Π°ΠΌ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ².
- ΠΠ»Ρ ΡΠΎΠ²Π°ΡΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΠΈ/ΠΈΠ»ΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ² ΠΏΠΎ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌ, ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌ, ΡΠ΅Π½Π΅, ΡΠ΅ΠΉΡΠΈΠ½Π³Ρ, Π΄Π°ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΏΡΠΎΠ΄Π°Π²ΡΡ.
- ΠΡΠ΅ ΡΠ΅Π½Ρ ΠΈ Π±Π°Π»Π°Π½Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π² Π΄ΠΎΠ»Π»Π°ΡΠ°Ρ USD ΠΈ ΡΠ΅Π½ΡΠ°Ρ .
- ΠΡΠΈ ΠΏΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΡΡΡΠ° ΠΈΠ»ΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ ΡΡΠ΅Π΄ΡΡΠ² ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΊΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΡ Π² Π²ΡΠ±ΡΠ°Π½Π½ΡΡ Π²Π°Π»ΡΡΡ.
- ΠΡΠΈ ΠΊΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΠΊΡΡΠ³Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΡ ΡΠ΅Π»Π΅Π²ΠΎΠΉ Π²Π°Π»ΡΡΡ Π² ΠΏΠΎΠ»ΡΠ·Ρ ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΠΈ.
- ΠΠ±ΡΡΠ½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°Π½ΠΎΡΠΈΡΡ Π΄Π΅Π½ΡΠ³ΠΈ Π½Π° ΡΡΡΡ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅.
- ΠΡΠΎΠ΄Π°Π²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ Π΄Π΅Π½ΡΠ³ΠΈ ΡΠΎ ΡΡΡΡΠ° Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅.
- ΠΠ΅ΡΡ ΡΠ΅ΠΊΡΡ: ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΡ Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅.
@startuml DB
!define primary_key(x) <b><color:#b8861b><&key></color> x</b>
!define foreign_key(x) <color:#aaaaaa><&key></color> x
!define type(x) : <b>x</b>
!define nnu <<NOT NULL, UNIQUE>>
!define u <<UNIQUE>>
!define nn <<NOT NULL>>
entity Customer {
primary_key(customer_id) type(BIGSERIAL)
--
name type(VARCHAR(50)) nnu
email type(VARCHAR(254)) nnu /' https://www.rfc-editor.org/errata/eid1690 '/
password_hash type(VARCHAR(60)) nn /' depends on hash algorithm, e.g. Argon2 '/
balance type(NUMERIC(12,2)) nn
created_at type(TIMESTAMP) nn
--
is_deleted type(BOOLEAN) nn
is_banned type(BOOLEAN) nn
}
entity DepositOperation {
primary_key(deposit_id) type(BIGSERIAL)
--
amount type(NUMERIC(12,2)) nn
made_at type(TIMESTAMP) nn
--
foreign_key(customer_id) type(BIGINT) nn
}
Customer ||--o{ DepositOperation : "make"
entity Seller {
primary_key(seller_id) type(BIGINT)
--
seller_balance type(NUMERIC(12,2)) nn
/'rating type(NUMERIC(2, 1))
removed for 3NF'/
--
is_deleted type(BOOLEAN) nn
is_banned type(BOOLEAN) nn
}
Customer ||--|| Seller : "can be"
entity WithdrawOperation {
primary_key(withdraw_id) type(BIGSERIAL)
--
amount type(NUMERIC(12,2)) nn
made_at type(TIMESTAMP) nn
--
foreign_key(seller_id) type(BIGINT) nn
}
Seller ||--o{ WithdrawOperation : "make"
entity Category {
primary_key(category_id) type(BIGSERIAL)
--
name type(VARCHAR(20)) nnu
}
entity Subcategory {
primary_key(subcategory_id) type(BIGSERIAL)
--
name type(VARCHAR(20)) nnu
--
foreign_key(category_id) type(BIGINT) nn
}
Category ||--|{ Subcategory : "includes"
entity Product {
primary_key(product_id) type(BIGSERIAL)
--
name type(VARCHAR(255)) nn
description type(TEXT) nn
price type(NUMERIC(12,2)) nn
discount type(NUMERIC(3, 1))
/'rating type(NUMERIC(2, 1))
removed for 3NF'/
published_at type(TIMESTAMP) nn
age_restriction type(VARCHAR(50))
--
is_deleted type(BOOLEAN)
--
foreign_key(seller_id) type(BIGINT) nn
foreign_key(subcategory_id) type(BIGINT)
foreign_key(license_id) type(BIGINT)
}
Seller ||--o{ Product : "sells"
Subcategory |o--o{ Product : "includes"
entity Licence {
primary_key(licence_id) type(BIGSERIAL)
--
name type(TEXT) nnu
description type(TEXT) nn
--
foreign_key(seller_id) type(BIGINT) /' NULL for default licences '/
}
Product }o--o| Licence : "has"
Seller |o--o{ Licence : "create"
entity Tag {
primary_key(tag_id) type(BIGSERIAL)
--
name type(VARCHAR(20)) nnu
}
entity ProductTag {
primary_key(tag_id) type(BIGINT)
primary_key(tag_id) type(BIGINT)
}
Product }o--o{ ProductTag
Tag }o--o{ ProductTag
entity ProductVersion {
primary_key(version_id) type(BIGSERIAL)
--
major type(SMALLINT) nn
minor type(SMALLINT) nn
patch type(SMALLINT) nn
file_size_bytes type(BIGINT) nn
file_hash type(VARCHAR(60)) nn
file_path type(TEXT) nnu
uploaded_at type(TIMESTAMP) nn
--
foreign_key(product_id) type(BIGINT) nn
}
Product ||--|{ ProductVersion : "has"
entity Wishlist {
primary_key(customer_id)
primary_key(product_id)
--
product_priority type(SMALLINT)
}
Customer ||--o{ Wishlist : "has"
Product ||--o{ Wishlist : "inserts into"
entity Cart {
primary_key(customer_id)
primary_key(product_id)
}
Customer ||--o{ Cart : "has"
Product |o--o{ Cart : "inserts into"
entity PurchaseHeader {
primary_key(purchase_detail_id) type(BIGSERIAL)
--
/'price_paid type(NUMERIC(12,2)) nn
removed for 3NF'/
purchased_at type(TIMESTAMP) nn
--
foreign_key(customer_id) type(BIGINT) nn
}
Customer ||--o{ PurchaseHeader : "makes"
entity PurchaseDetail {
primary_key(purchase_detail_id) type(BIGSERIAL)
--
price_paid type(NUMERIC(12,2)) nn
--
is_downloaded type(BOOLEANEAN) nn
/'is_refunded type(BOOLEAN) nn
removed for 3NF'/
--
foreign_key(purchase_header_id) type(BIGINT) nn
foreign_key(product_id) type(BIGINT) nn
}
Product ||--o{ PurchaseDetail : "is included in"
PurchaseHeader ||--|{ PurchaseDetail : "includes"
entity RefundRequest {
primary_key(purchase_id) type(BIGSERIAL)
--
created_at type(TIMESTAMP) nn
resolved_at type(TIMESTAMP)
--
is_accepted type(BOOLEAN)
}
PurchaseDetail ||--o| RefundRequest : "has"
entity Review {
primary_key(review_id) type(BIGSERIAL)
--
rating type(NUMERIC(2,1)) nn
review_text type(TEXT) nn
created_at type(TIMESTAMP) nn
--
is_deleted type(BOOLEAN) nn
--
foreign_key(author_id) type(BIGINT) nn
foreign_key(product_id) type(BIGINT) nn
}
Customer ||--o{ Review : "writes"
Product ||--o{ Review : "has"
entity Comment {
primary_key(comment_id) type(BIGSERIAL)
--
comment type(TEXT) nn
created_at type(TIMESTAMP) nn
--
is_deleted type(BOOLEAN) nn
--
foreign_key(author_id) type(BIGINT) nn
foreign_key(product_id) type(BIGINT) nn
foreign_key(parent_comment_id) type(BIGINT) nn
}
Customer ||--o{ Comment : "writes"
Product ||--o{ Comment : "has"
Comment |o--o{ Comment : "is parent of"
entity Complain {
primary_key(complain_id) type(BIGSERIAL)
--
comment type(TEXT) nn
created_at type(TIMESTAMP) nn
--
is_read type(BOOLEAN) nn
--
foreign_key(author_id) type(BIGINT) nn
--
foreign_key(related_product_id) type(BIGINT)
foreign_key(related_comment_id) type(BIGINT)
foreign_key(related_review_id) type(BIGINT)
foreign_key(related_seller_id) type(BIGINT)
foreign_key(related_customer_id) type(BIGINT)
}
Product |o--o{ Complain : "can be in"
Comment |o--o{ Complain : "can be in"
Review |o--o{ Complain : "can be in"
Seller |o--o{ Complain : "can be in"
Product |o--o{ Complain : "can be in"
@enduml