Найти Π² Π”Π·Π΅Π½Π΅
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста

🐘 20+ нюансов PostgreSQL, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΉ бэкСндСр

ОглавлСниС

ДокумСнтация PostgreSQL – Π»ΡƒΡ‡ΡˆΠΈΠΉ источник Π·Π½Π°Π½ΠΈΠΉ ΠΎ Π‘Π£Π‘Π”. Но ΠΎΠ½Π° отличаСтся ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ объСмом: Π½Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ осилит 3024 страницы Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° А4. ΠžΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ бэкСндСр составил список самых Π²Π°ΠΆΠ½Ρ‹Ρ… свСдСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΠΌΡƒ самому Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с PostgreSQL. Π­Ρ‚Π° ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΠ° сэкономит Π²Π°ΠΌ нСсколько нСдСль изучСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΈ скорСС всСго, пригодится для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π‘Π£Π‘Π”.

ΠœΠΎΡ‰ΡŒ PostgreSQL сопровоТдаСтся рядом особСнностСй, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ. Автор ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ основана эта ΡΡ‚Π°Ρ‚ΡŒΡ, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π» ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ аспСкты эффСктивной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с PostgreSQL: Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ NULL, тонкости JSONB, ΠΈΠ½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡŽ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π° psql.

Нормализация Π΄Π°Π½Π½Ρ‹Ρ…

   Нормализация Π΄Π°Π½Π½Ρ‹Ρ…
Нормализация Π΄Π°Π½Π½Ρ‹Ρ…

Π‘ΡƒΡ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ дублирования ΠΈ избыточности Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±Π°Π·Π΅. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сайт, Π³Π΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ увСдомлСния Π½Π° ΠΏΠΎΡ‡Ρ‚Ρƒ, ΠΊΠΎΠ³Π΄Π° ΠΊΡ‚ΠΎ-Ρ‚ΠΎ просматриваСт ΠΈΡ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…?

ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄:

  • Π₯Ρ€Π°Π½ΠΈΡ‚ΡŒ email ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ прямо Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°
  • ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свой email, придСтся ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Π²ΠΎ всСх сотнях записСй с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ (Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ):

  • Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с ΠΈΡ… Π΄Π°Π½Π½Ρ‹ΠΌΠΈ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ email).
  • Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (внСшний ΠΊΠ»ΡŽΡ‡).
  • ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ email мСняСм Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΎΡ‚ΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ – Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ часто Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ – для подсчСта ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… часов сотрудника ΠΏΠ΅ΠΊΠ°Ρ€Π½ΠΈ Π·Π° Π³ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ:

  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΡΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ всСх смСн (это ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ).
  • Или Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ сумму, обновляя Π΅Π΅ ΠΏΡ€ΠΈ измСнСниях (Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС).

Но ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ – дСнормализация всСгда ΠΈΠΌΠ΅Π΅Ρ‚ свою Ρ†Π΅Π½Ρƒ:

  • ΠŸΠΎΡΠ²Π»ΡΠ΅Ρ‚ΡΡ риск нСсогласованности Π΄Π°Π½Π½Ρ‹Ρ….
  • УслоТняСтся процСсс обновлСния Π΄Π°Π½Π½Ρ‹Ρ….

НС Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ Π½Π°ΠΈΠ·ΡƒΡΡ‚ΡŒ всС Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈΠ· ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠΎΠ², Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ основной ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ: ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ дублирования Π΄Π°Π½Π½Ρ‹Ρ…, Ссли Ρƒ вас Π½Π΅Ρ‚ вСской ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ.

Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ рСкомСндациям Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² PostgreSQL

   Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ рСкомСндациям Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² PostgreSQL
Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ рСкомСндациям Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² PostgreSQL

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ PostgreSQL создали список «НС Π΄Π΅Π»Π°ΠΉΡ‚Π΅ этого» Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π²ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π²Π°ΠΆΠ½Ρ‹Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ. НС всС ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ понятны Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ (ΠΈ это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ). Π’ΠΎΡ‚ Π³Π»Π°Π²Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:

  • Для хранСния тСкста всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… text. Π­Ρ‚ΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для любого тСкстового ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. НС Π½ΡƒΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ максимальной Π΄Π»ΠΈΠ½Π΅ – PostgreSQL эффСктивно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ text нСзависимо ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π΄Π°Π½Π½Ρ‹Ρ….
  • Для хранСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ timestamptz ΠΈΠ»ΠΈ time with time zone. Π­Ρ‚ΠΈ Ρ‚ΠΈΠΏΡ‹ автоматичСски ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ часовыС пояса, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π·ΠΎΠ½ ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ Π½Π° Π»Π΅Ρ‚Π½Π΅Π΅/Π·ΠΈΠΌΠ½Π΅Π΅ врСмя.
  • НазывайтС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² стилС snake_case – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π½ΠΈΠΆΠ½ΠΈΠΉ рСгистр, раздСляйтС слова подчСркиваниями: user_profiles, payment_transactions, order_items ΠΈ Ρ‚. Π΄.

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

🐘🧠 ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ использования памяти Π² PostgreSQL: сСкрСты профСссионалов

Π£Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ особСнности SQL

   Π£Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ особСнности SQL
Π£Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ особСнности SQL

РСгистр запросов

Π’ SQL рСгистр ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠ°Ρ… SQL-запросы, написанныС Π·Π°Π³Π»Π°Π²Π½Ρ‹ΠΌΠΈ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

На самом Π΄Π΅Π»Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС строчными Π±ΡƒΠΊΠ²Π°ΠΌΠΈ:

Или Π΄Π°ΠΆΠ΅ ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹ΠΌ стилСм:

Π­Ρ‚ΠΎ справСдливо Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для PostgreSQL, Π½ΠΎ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… SQL Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ….

NULL Π² SQL

NULL Π² SQL сущСствСнно отличаСтся ΠΎΡ‚ null/nil Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования. Π’ SQL NULL Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ «нСизвСстноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β». NULL ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ нСсколькими Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌΠΈ особСнностями: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сравнСниС NULL = NULL Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ NULL (Π° Π½Π΅ true, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ SQL Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ, Ρ€Π°Π²Π½Ρ‹ Π»ΠΈ Π΄Π²Π° нСизвСстных значСния).

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ всС ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с NULL Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ NULL. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ true/false, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹:

x IS NULL Π²Π΅Ρ€Π½Π΅Ρ‚ true, Ссли x это NULL (false Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ случаС) x IS NOT NULL Π²Π΅Ρ€Π½Π΅Ρ‚ true, Ссли x это Π½Π΅ NULL (false Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ случаС) x IS NOT DISTINCT FROM y Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ =, Π½ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ NULL x IS DISTINCT FROM y Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ !=, Π½ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ NULL

Π’Π°ΠΆΠ½o Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ WHERE Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ строки, Π³Π΄Π΅ условиС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true. НапримСр, этот запрос НЕ Π²Π΅Ρ€Π½Π΅Ρ‚ строки, Π³Π΄Π΅ title Ρ€Π°Π²Π΅Π½ NULL:

Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ NULL != 'manager' Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ NULL, Π° Π½Π΅ true ΠΈΠ»ΠΈ false.

Другая ваТная функция для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с NULL – COALESCE. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ нСсколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π½Π΅-NULL Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· списка:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ возмоТности psql

   Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ возмоТности psql
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ возмоТности psql

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ psql Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для чтСния

Когда Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ запрос ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ со мноТСством столбцов ΠΈΠ»ΠΈ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ значСниями, Π²Ρ‹Π²ΠΎΠ΄ часто становится Π½Π΅Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€. ΠŸΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€ позволяСт ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ тСкст, прокручивая Π΅Π³ΠΎ Π² ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. less – стандартный ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€ Π² Unix-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… систСмах. Для использования less ΠΊΠ°ΠΊ ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² ваш ~/.bashrc ΠΈΠ»ΠΈ ~/.zshrc:

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Π²Ρ‹Π²ΠΎΠ΄Π°

Π’Π°Π±Π»ΠΈΡ†Ρ‹ со мноТСством столбцов Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ, Π΄Π°ΠΆΠ΅ Ссли Π΄Π°Π½Π½Ρ‹Π΅ идСально ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Π’ этом случаС ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ \pset expanded ΠΈΠ»ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ \x. Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ этот Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, создайтС Ρ„Π°ΠΉΠ» ~/.psqlrc ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ‚ΡƒΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ \x. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС psql всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· этого Ρ„Π°ΠΉΠ»Π° Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ автоматичСски.

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ значСния NULL Π±ΠΎΠ»Π΅Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌΠΈ

Когда Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ встрСчаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ΠΎ отобраТаСтся просто ΠΊΠ°ΠΊ пустоС мСсто, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ NULL-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Для этого Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² консоли psql:

ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ строку, Π΄Π°ΠΆΠ΅ эмодзи, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ πŸ‘» ΠΊΠ°ΠΊ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ NULL. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эту настройку постоянной, создайтС Ρ„Π°ΠΉΠ» .psqlrc Π² домашнСй Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ~/.psqlrc ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² Π½Π΅Π³ΠΎ строку \pset null '[NULL]'.

АвтодополнСниС

psql ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ автодополнСния, которая Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускоряСт Ρ€Π°Π±ΠΎΡ‚Ρƒ. НачнитС Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ SQL-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ»ΠΈ имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Tab – psql автоматичСски Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ строку:

Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

Π’ psql Π΅ΡΡ‚ΡŒ мноТСство ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ слэша \. Π­Ρ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ быстро Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запросы ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ дСйствия. Π’ΠΎΡ‚ основныС ΠΈΠ· Π½ΠΈΡ…:

\? ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ список всСх доступных ΠΊΠΎΠΌΠ°Π½Π΄. \d ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ) вмСстС с ΠΈΡ… Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°ΠΌΠΈ. \d+ Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ \d, Π½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. \d table_name ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ структуру Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹: список столбцов (с ΠΈΡ… Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Π΄ΠΎΠΏΡƒΡΠΊΠ°Π΅ΠΌΠΎΡΡ‚ΡŒΡŽ NULL ΠΈ значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), Π° Ρ‚Π°ΠΊΠΆΠ΅ индСксы ΠΈ внСшниС ΠΊΠ»ΡŽΡ‡ΠΈ. \e ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ваш тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚ΠΎΡ‚, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния $EDITOR) для рСдактирования SQL-запроса. \h SQL_KEYWORD ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ синтаксис для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ SQL-ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, SELECT, INSERT) ΠΈ ссылку Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ.

Π­Ρ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ – лишь Π²Π΅Ρ€Ρ…ΡƒΡˆΠΊΠ° айсбСрга. Π’ psql Π΅ΡΡ‚ΡŒ мноТСство Π΄Ρ€ΡƒΠ³ΠΈΡ… сокращСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ \?, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ список.

Π—Π°ΠΏΠΈΡΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выполнСния запроса Π² CSV

Π’ PostgreSQL ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния любого запроса Π² CSV-Ρ„Π°ΠΉΠ»:

Если Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС Ρ„Π°ΠΉΠ»Π° Π±Ρ‹Π»ΠΈ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ названия ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΎΠΏΡ†ΠΈΡŽ HEADER:

БокращСния ΠΈ псСвдонимы

Π’ psql ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сокращСния ΠΈ псСвдонимы (алиасы) для упрощСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ запросов ΠΈ ΠΈΡ… ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ. НапримСр, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова AS ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ любоС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ для столбца Π² Π²Ρ‹Π²ΠΎΠ΄Π΅:

GROUP BY ΠΈ ORDER BY ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° столбцы Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π½ΠΎ ΠΈ ΠΏΠΎ ΠΈΡ… порядковому Π½ΠΎΠΌΠ΅Ρ€Ρƒ Π² спискС SELECT. НапримСр, Ρ‚ΠΎΡ‚ ΠΆΠ΅ запрос ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Однако Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅.

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Как ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ запросов Π² PostgreSQL

ΠŸΠΎΡ‡Π΅ΠΌΡƒ индСксы ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ бСсполСзными

   ΠŸΠΎΡ‡Π΅ΠΌΡƒ индСксы ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ бСсполСзными
ΠŸΠΎΡ‡Π΅ΠΌΡƒ индСксы ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ бСсполСзными

ИндСкс – структура Π΄Π°Π½Π½Ρ‹Ρ…, которая ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΡΡ‚ΡŒ поиск Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅. Она дСйствуСт ΠΊΠ°ΠΊ быстрый справочник для доступа ΠΊ строкам Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ полям. НаиболСС распространСнный Ρ‚ΠΈΠΏ индСкса – B-Π΄Π΅Ρ€Π΅Π²ΠΎ (B-tree), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для:

  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° равСнство (WHERE a = 3).
  • Поиска Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°Ρ… (WHERE a > 5).

Однако индСкс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ бСсполСзным ΠΏΠΎ нСскольким ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ:

  • PostgreSQL сама Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ индСкс. Π‘Π£Π‘Π” Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ статистику Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ опрСдСляСт, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ использованиС индСкса быстрСС, Ρ‡Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сканированиС всСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.
  • Если индСкс создан Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ соотвСтствуСт условиям запроса, PostgreSQL просто Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚. НапримСр, индСкс Π½Π° ΠΏΠΎΠ»Π΅ a Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚, Ссли Π² запросС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ условиС WHERE b = 3. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, индСксы Π½Π΅ эффСктивны, Ссли запрос Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚ ΠΏΠΎ слишком Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ количСству строк (Π² этом случаС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сканированиС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ быстрСС).
  • ИндСкс бСсполСзСн для Ρ‚Π°Π±Π»ΠΈΡ† с нСбольшим количСством строк. Если Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ всСго нСсколько дСсятков ΠΈΠ»ΠΈ сотСн строк, PostgreSQL часто ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сканированиС вмСсто использования индСкса. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° использованиС индСкса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ структурС B-Π΄Π΅Ρ€Π΅Π²Π°) ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ большС, Ρ‡Π΅ΠΌ простоС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ всСх строк подряд.
  • ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ столбцов Π² ΠΌΠ½ΠΎΠ³ΠΎΠΊΠΎΠ»ΠΎΠ½Π½Ρ‹Ρ… индСксах критичСски Π²Π°ΠΆΠ΅Π½: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ столбСц всСгда являСтся основным для поиска. Запросы, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΡŽΡ‰ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ столбцу, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΊΠΎΠ»ΠΎΠ½Π½Ρ‹ΠΉ индСкс, Π½ΠΎ Π΅Π³ΠΎ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠΆΠ΅. Для слоТных запросов с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ комбинациями условий ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСсколько Ρ€Π°Π·Π½Ρ‹Ρ… индСксов.
  • Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ индСкс Ρ‚ΠΈΠΏΠ° B-tree, скорСС всСго, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для запросов Π½Π° основС совпадСния ΠΏΠΎ прСфиксу LIKE 'prefix%'. Для ускорСния запросов с прСфиксным совпадСниСм создайтС индСкс с text_pattern_ops: CREATE INDEX CONCURRENTLY ON directories (path text_pattern_ops);

Π”ΠΎΠ»Π³ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Π²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ

   Π”ΠΎΠ»Π³ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Π²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ
Π”ΠΎΠ»Π³ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Π²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° (ΠΈΠ»ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ) ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ опасных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π½ΡƒΠΆΠ΅Π½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ опСрация с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ строки, Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ»ΠΈ прСдставлСния) Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ выполнится, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ откатится. Π‘Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄Π²Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ нСсогласованности Π΄Π°Π½Π½Ρ‹Ρ….

КаТдая опСрация Π² PostgreSQL Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, строки ΠΈ Ρ‚. Π΄.) БущСствуСт нСсколько ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΎΡ‚ ΠΌΠ΅Π½Π΅Π΅ Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ строгих:

Π Π΅ΠΆΠΈΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ACCESS SHARE SELECT ROW SHARE SELECT ... FOR UPDATE ROW EXCLUSIVE UPDATE, DELETE, INSERT SHARE UPDATE EXCLUSIVE CREATE INDEX CONCURRENTLY SHARE CREATE INDEX (Π±Π΅Π· CONCURRENTLY) ACCESS EXCLUSIVE ALTER TABLE, DROP TABLE

НСкоторыС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ (Π₯ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚)):

-7

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ситуаций для ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

-8

Как это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹? Если ΠΎΠ΄Π½Π° опСрация (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ALTER TABLE) Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ запросы ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

  • ΠšΠ»ΠΈΠ΅Π½Ρ‚ 1 запускаСт ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ SELECT (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ панСль с ΠΎΡ‚Ρ‡Π΅Ρ‚Π°ΠΌΠΈ, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΎΠ»Π³ΠΎ ΠΈΠ·-Π·Π° большого объСма Π΄Π°Π½Π½Ρ‹Ρ…).
  • ΠšΠ»ΠΈΠ΅Π½Ρ‚ 2 запускаСт ALTER TABLE, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ столбСц. Π­Ρ‚ΠΎΡ‚ запрос Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ SELECT ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° 1
  • Вся ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… запросов (SELECT, UPDATE ΠΈ Ρ‚. Π΄.) Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ 1 ΠΈ 2.

ΠŸΠΎΡΠ»Π΅Π΄ΡΡ‚Π²ΠΈΡ:

Если ALTER TABLE влияСт Π½Π° часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, users), всС запросы ΠΊ этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π°ΠΌ ΠΈ ошибкам 503 Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

Вранзакция – это способ ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ (это Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ). Вранзакция начинаСтся с ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ BEGIN, послС Ρ‡Π΅Π³ΠΎ Π»ΡŽΠ±Ρ‹Π΅ измСнСния, сдСланныС Π² Π΅Π΅ Ρ€Π°ΠΌΠΊΠ°Ρ…, нСдоступны Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ, ΠΏΠΎΠΊΠ° транзакция Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ COMMIT.

Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ измСнСния, Π²Ρ‹Π·Π²Π°Π² ROLLBACK. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² случаях, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…. НапримСр, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ Π΄Π΅Π½Π΅Π³ ΠΌΠ΅ΠΆΠ΄Ρƒ счСтами Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΠΈΠ±ΠΎ ΠΎΠ±Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (списаниС ΠΈ зачислСниС) Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈΡΡŒ, Π»ΠΈΠ±ΠΎ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡŒ Π½ΠΈ ΠΎΠ΄Π½Π°.

Когда транзакция выполняСтся слишком Π΄ΠΎΠ»Π³ΠΎ, это ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π° ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ транзакция ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄ΠΎ Π΅Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ (COMMIT ΠΈΠ»ΠΈ ROLLBACK). ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ 1 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…:

Π’ этой ситуации ΠΊΠ»ΠΈΠ΅Π½Ρ‚ 1 ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ backpacks, Π½ΠΎ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ строка с id = 2 остаСтся Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ. Если ΠΊΠ»ΠΈΠ΅Π½Ρ‚ 2 попытаСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ эту строку:

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ зависнСт, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, удСрТиваСмая ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ 1, ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ DELETE.

πŸ’» Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста»

ΠžΡΡ‚ΠΎΡ€ΠΎΠΆΠ½Π΅Π΅ с JSONB

   ΠžΡΡ‚ΠΎΡ€ΠΎΠΆΠ½Π΅Π΅ с JSONB
ΠžΡΡ‚ΠΎΡ€ΠΎΠΆΠ½Π΅Π΅ с JSONB

Π’ PostgreSQL ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ JSON-Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSONB, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ эффСктивно ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ ΠΈ доступны для запросов. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ PostgreSQL схоТим с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, MongoDB), Π½ΠΎ Π±Π΅Π· нСобходимости Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвис ΠΈΠ»ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ нСсколькими Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Однако Ρƒ JSONB Π΅ΡΡ‚ΡŒ свои Π½ΡŽΠ°Π½ΡΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΏΡ€ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ использовании.

JSONB ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ

PostgreSQL Π½Π΅ собираСт статистику ΠΏΠΎ JSONB-ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°ΠΌ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ запросы ΠΊ JSONB Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°ΠΌ. НапримСр, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ запросы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Π² 2000 Ρ€Π°Π·.

Π‘Π°ΠΌΠΎΠ΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ Π½Π΅ прСдусмотрСна

JSONB позволяСт Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ Ρƒ вас Π½Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡ… структуры. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ схСму ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π²Π΅Ρ€Π½Π΅Ρ‚ запрос. Π’ случаС с JSONB Ρ‚Π°ΠΊΠΎΠΉ прСдсказуСмости Π½Π΅Ρ‚. НапримСр, Π²Π°ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ camelCase ΠΈΠ»ΠΈ snake_case?
  • Π₯ранятся Π»ΠΈ состояния Π² Π²ΠΈΠ΄Π΅ true/false, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ строки Π²Ρ€ΠΎΠ΄Π΅ yes/maybe/no?

НСудобство Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ

Запросы ΠΊ JSONB ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΈΠ·-Π·Π° особСнностСй синтаксиса. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π° backpacks с ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΎΠΉ data Ρ‚ΠΈΠΏΠ° JSONB. Нам Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ всС Ρ€ΡŽΠΊΠ·Π°ΠΊΠΈ Π±Ρ€Π΅Π½Π΄Π° JanSport. Π˜Π½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ запрос:

Но это Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ PostgreSQL ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (JanSport) Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌ JSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ строку Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ:

Или ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ->> для извлСчСния значСния ΠΊΠ°ΠΊ тСкста:

Π’Π°ΠΊΠΆΠ΅ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ эти Π²Π°ΠΆΠ½Ρ‹Π΅ особСнности:

  • JSONB ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ мноТСство своих собствСнных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ‚Π°ΠΊ-Ρ‚ΠΎ просто Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ.
  • Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ NULL Π² SQL, null Π² контСкстС JSONB – ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ числу, строкС ΠΈΠ»ΠΈ Π±ΡƒΠ»Π΅Π²ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΈ null Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования, ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ. НапримСр, Π² JSONB Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 'null'::jsonb = 'null'::jsonb Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Π° значСния явно Ρ€Π°Π²Π½Ρ‹.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

PostgreSQL прСдоставляСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΎΠ±ΡˆΠΈΡ€Π½Ρ‹Π΅ возмоТности для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Однако ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π΅e использования зависит ΠΎΡ‚ понимания ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… аспСктов ΠΈ нюансов, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ‹Π»ΠΈ рассмотрСны Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅: ΡƒΠΌΠ΅Π»ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ JSONB, нормализация Π΄Π°Π½Π½Ρ‹Ρ…, настройка индСксов, ΠΈΠ·Π±Π΅Π³Π°Π½ΠΈΠ΅ Π΄ΠΎΠ»Π³ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈ запросов Π΄Π΅Π»Π°ΡŽΡ‚ прилоТСния Π½Π° Π±Π°Π·Π΅ PostgreSQL Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ.