PostgreSQL Antipatterns: Навигация Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π°

ДнСс няма Π΄Π° ΠΈΠΌΠ° слоТни случаи ΠΈ слоТни Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ Π² SQL. Всичко Ρ‰Π΅ бъдС ΠΌΠ½ΠΎΠ³ΠΎ просто, Π½Π° Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π½Π° Captain Obvious - Π½Π΅ΠΊΠ° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡΡ‚Π° сортирани ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅.

ВоСст ΠΈΠΌΠ° Π·Π½Π°ΠΊ Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ events, ΠΈ тя ΠΈΠΌΠ° ΠΏΠΎΠ»Π΅ ts - Ρ‚ΠΎΡ‡Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅, Π² ΠΊΠΎΠ΅Ρ‚ΠΎ искамС Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Ρ‚Π΅Π·ΠΈ записи ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ Π½Π°Ρ‡ΠΈΠ½:

CREATE TABLE events(
  id
    serial
      PRIMARY KEY
, ts
    timestamp
, data
    json
);

CREATE INDEX ON events(ts DESC);

Ясно Π΅, Ρ‡Π΅ няма Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΡƒΠ·ΠΈΠ½Π° записи Ρ‚Π°ΠΌ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ‰Π΅ Π½ΠΈ трябва някаква Ρ„ΠΎΡ€ΠΌΠ° Π½Π° навигация Π½Π° страницата.

#0. β€žΠΠ· съм ΠΏΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΈΠΊΡŠΡ‚ Π½Π° ΠΌΠ°ΠΉΠΊΠ° ΠΌΠΈβ€œ

cur.execute("SELECT * FROM events;")
rows = cur.fetchall();
rows.sort(key=lambda row: row.ts, reverse=True);
limit = 26
print(rows[offset:offset+limit]);

ΠŸΠΎΡ‡Ρ‚ΠΈ Π½Π΅ Π΅ шСга - рядко Π΅, Π½ΠΎ сС срСща Π² Π΄ΠΈΠ²Π°Ρ‚Π° ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π°. Понякога слСд Ρ€Π°Π±ΠΎΡ‚Π° с ORM ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ към β€žΠ΄ΠΈΡ€Π΅ΠΊΡ‚Π½Π°β€œ Ρ€Π°Π±ΠΎΡ‚Π° с SQL.

Но Π½Π΅ΠΊΠ° Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към ΠΏΠΎ-чСсто срСщанитС ΠΈ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ.

#1. Π˜Π—ΠœΠ•Π‘Π’Π’ΠΠΠ•

SELECT
  ...
FROM
  events
ORDER BY
  ts DESC
LIMIT 26 OFFSET $1; -- 26 - записСй Π½Π° страницС, $1 - Π½Π°Ρ‡Π°Π»ΠΎ страницы

ΠžΡ‚ΠΊΡŠΠ΄Π΅ ΠΈΠ΄Π²Π° числото 26? Π’ΠΎΠ²Π° Π΅ приблизитСлният Π±Ρ€ΠΎΠΉ записи Π·Π° запълванС Π½Π° Π΅Π΄ΠΈΠ½ Π΅ΠΊΡ€Π°Π½. По-Ρ‚ΠΎΡ‡Π½ΠΎ, 25 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ записа, плюс 1, сигнализиращи, Ρ‡Π΅ ΠΈΠΌΠ° ΠΏΠΎΠ½Π΅ ΠΎΡ‰Π΅ Π½Π΅Ρ‰ΠΎ ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ Π² ΠΈΠ·Π²Π°Π΄ΠΊΠ°Ρ‚Π° ΠΈ ΠΈΠΌΠ° смисъл Π΄Π° сС ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ Π½Π°ΠΏΡ€Π΅Π΄.

Π Π°Π·Π±ΠΈΡ€Π° сС, Ρ‚Π°Π·ΠΈ стойност Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС β€žΠ·Π°ΡˆΠΈΡ‚Π°β€œ Π² тялото Π½Π° заявката, Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½Π° ΠΏΡ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€. Но Π² Ρ‚ΠΎΠ·ΠΈ случай ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π·Π° ΠΏΠ»Π°Π½ΠΈΡ€Π°Π½Π΅ Π½Π° PostgreSQL няма Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π·Ρ‡ΠΈΡ‚Π° Π½Π° Π·Π½Π°Π½ΠΈΠ΅Ρ‚ΠΎ, Ρ‡Π΅ трябва Π΄Π° ΠΈΠΌΠ° относитСлно ΠΌΠ°Π»ΠΊΠΎ записи - ΠΈ лСсно Ρ‰Π΅ ΠΈΠ·Π±Π΅Ρ€Π΅ Π½Π΅Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΏΠ»Π°Π½.

И Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π² интСрфСйса Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΡ€Π΅Π³Π»Π΅Π΄ΡŠΡ‚ Π½Π° Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΈΠ·ΡƒΠ°Π»Π½ΠΈ β€žΡΡ‚Ρ€Π°Π½ΠΈΡ†ΠΈβ€œ, Π½ΠΈΠΊΠΎΠΉ Π½Π΅ забСлязва Π½ΠΈΡ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ дълго Π²Ρ€Π΅ΠΌΠ΅. Π’ΠΎΡ‡Π½ΠΎ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, Π² ΠΊΠΎΠΉΡ‚ΠΎ, Π² Π±ΠΎΡ€Π±Π°Ρ‚Π° Π·Π° удобство, UI/UX Ρ€Π΅ΡˆΠ°Π²Π° Π΄Π° ΠΏΡ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΈ интСрфСйса Π½Π° β€žΠ±Π΅Π·ΠΊΡ€Π°ΠΉΠ½ΠΎ ΠΏΡ€Π΅Π²ΡŠΡ€Ρ‚Π°Π½Π΅β€œ - тоСст всички записи Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° сС ΠΈΠ·Ρ‡Π΅Ρ€Ρ‚Π°Π²Π°Ρ‚ Π² Π΅Π΄ΠΈΠ½ списък, ΠΊΠΎΠΉΡ‚ΠΎ потрСбитСлят ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€Π΅Π²ΡŠΡ€Ρ‚Π° Π½Π°Π³ΠΎΡ€Π΅ ΠΈ Π½Π°Π΄ΠΎΠ»Ρƒ.

И Ρ‚Π°ΠΊΠ°, ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° слСдващото тСстванС, Π²ΠΈΠ΅ стС Ρ…Π²Π°Π½Π°Ρ‚ΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€Π°Π½Π΅ Π½Π° записи Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π°. Π—Π°Ρ‰ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΈΠΌΠ° Π½ΠΎΡ€ΠΌΠ°Π»Π΅Π½ индСкс (ts), Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ сС основава Π²Π°ΡˆΠ΅Ρ‚ΠΎ Π·Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅?

Π’ΠΎΡ‡Π½ΠΎ Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π½Π΅ си Π³ΠΎ Π²Π·Π΅Π» ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ ts Π½Π΅ Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΊΠ»ΡŽΡ‡ Π² Ρ‚Π°Π·ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°. Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ стойности Π½Π΅ са ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΈ, ΠΊΠ°Ρ‚ΠΎ всяко β€žΠ²Ρ€Π΅ΠΌΠ΅β€œ Π² Ρ€Π΅Π°Π»Π½ΠΈ условия - слСдоватСлно Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ запис Π² Π΄Π²Π΅ съсСдни заявки лСсно β€žΡΠΊΠ°Ρ‡Π°β€œ ΠΎΡ‚ страница Π½Π° страница ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΊΡ€Π°Π΅Π½ Ρ€Π΅Π΄ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° сортиранС Π½Π° ΡΡŠΡ‰Π°Ρ‚Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π° стойност.

Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ Ρ‚ΡƒΠΊ сС ΠΊΡ€ΠΈΠ΅ ΠΈ Π²Ρ‚ΠΎΡ€ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΠΌ - някои записи няма Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ! Π’ ΠΊΡ€Π°ΠΉΠ½Π° смСтка β€žΠ΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΈΡ‚Π΅β€œ записи Π·Π°Π΅Ρ…Π° мястото Π½Π° някой Π΄Ρ€ΡƒΠ³. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ обяснСниС с красиви снимки ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ Ρ‚ΡƒΠΊ.

Π Π°Π·ΡˆΠΈΡ€ΡΠ²Π°Π½Π΅ Π½Π° индСкса

Π₯итрият Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ€Π°Π·Π±ΠΈΡ€Π°, Ρ‡Π΅ ΠΊΠ»ΡŽΡ‡ΡŠΡ‚ Π½Π° индСкса трябва Π΄Π° бъдС ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈ Π½Π°ΠΉ-лСсният Π½Π°Ρ‡ΠΈΠ½ Π΅ Π΄Π° Π³ΠΎ Ρ€Π°Π·ΡˆΠΈΡ€ΠΈΡ‚Π΅ с ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΎ ΠΏΠΎΠ»Π΅, Π·Π° ΠΊΠΎΠ΅Ρ‚ΠΎ PK Π΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½:

CREATE UNIQUE INDEX ON events(ts DESC, id DESC);

И заявката сС промСня:

SELECT
  ...
ORDER BY
  ts DESC, id DESC
LIMIT 26 OFFSET $1;

#2. ΠŸΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π΅Ρ‚Π΅ към β€žΠΊΡƒΡ€ΡΠΎΡ€ΠΈβ€œ

Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΏΠΎ-късно DBA ΠΈΠ΄Π²Π° ΠΏΡ€ΠΈ вас ΠΈ Π΅ β€žΠ΄ΠΎΠ²ΠΎΠ»Π΅Π½β€œ ΠΎΡ‚ Π²Π°ΡˆΠΈΡ‚Π΅ заявки Ρ‚Π΅ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Ρ‚ ΡΡŠΡ€Π²ΡŠΡ€Π° адски с Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ OFFSET ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΈ ΠΊΠ°Ρ‚ΠΎ цяло Π΅ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ към навигация ΠΎΡ‚ послСдната ΠΏΠΎΠΊΠ°Π·Π°Π½Π° стойност. Π’Π°ΡˆΠ°Ρ‚Π° заявка сС промСня ΠΎΡ‚Π½ΠΎΠ²ΠΎ:

SELECT
  ...
WHERE
  (ts, id) < ($1, $2) -- послСдниС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ шагС значСния
ORDER BY
  ts DESC, id DESC
LIMIT 26;

Π’ΠΈ Π²ΡŠΠ·Π΄ΡŠΡ…Π½Π° с ΠΎΠ±Π»Π΅ΠΊΡ‡Π΅Π½ΠΈΠ΅, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΠΉΠ΄Π΅...

#3. ИндСкси Π·Π° почистванС

Π—Π°Ρ‰ΠΎΡ‚ΠΎ Π΅Π΄ΠΈΠ½ Π΄Π΅Π½ Π²Π°ΡˆΠΈΡΡ‚ DBA ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅ статия Π·Π° Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° Π½Π΅Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΈ индСкси ΠΈ Ρ€Π°Π·Π±Ρ€Π° Ρ‚ΠΎΠ²Π° β€žΠ½Π΅ Π½Π°ΠΉ-Π½ΠΎΠ²ΠΎΡ‚ΠΎβ€œ Π²Ρ€Π΅ΠΌΠ΅Π²ΠΎ ΠΊΠ»Π΅ΠΉΠΌΠΎ Π½Π΅ Π΅ Π΄ΠΎΠ±Ρ€ΠΎ. И Π°Π· ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π΄ΠΎΠΉΠ΄ΠΎΡ… ΠΏΡ€ΠΈ вас - сСга с ΠΌΠΈΡΡŠΠ»Ρ‚Π°, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ индСкс всС ΠΏΠ°ΠΊ трябва Π΄Π° сС Π²ΡŠΡ€Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² (ts DESC).

Но ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ с ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с β€žΡΠΊΠ°Ρ‡Π°Π½Π΅β€œ Π½Π° записи ΠΌΠ΅ΠΆΠ΄Ρƒ страници?.. И всичко Π΅ просто - трябва Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π±Π»ΠΎΠΊΠΎΠ²Π΅ с нСфиксиран Π±Ρ€ΠΎΠΉ записи!

Π’ΡŠΠΎΠ±Ρ‰Π΅ ΠΊΠΎΠΉ Π½ΠΈ забранява Π΄Π° Ρ‡Π΅Ρ‚Π΅ΠΌ Π½Π΅ β€žΡ‚ΠΎΡ‡Π½ΠΎ 26β€œ, Π° β€žΠ½Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ‚ 26β€œ? НапримСр, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π² слСдващия Π±Π»ΠΎΠΊ Π΄Π° ΠΈΠΌΠ° записи с ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ts - Ρ‚ΠΎΠ³Π°Π²Π° няма Π΄Π° ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с "скачанС" Π½Π° записи ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π»ΠΎΠΊΠΎΠ²Π΅!

Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ Π΄Π° постигнСтС Ρ‚ΠΎΠ²Π°:

SELECT
  ...
WHERE
  ts < $1 AND
  ts >= coalesce((
    SELECT
      ts
    FROM
      events
    WHERE
      ts < $1
    ORDER BY
      ts DESC
    LIMIT 1 OFFSET 25
  ), '-infinity')
ORDER BY
  ts DESC;

Какво става Ρ‚ΡƒΠΊ?

  1. Π‘Ρ‚ΡŠΠΏΠ²Π°ΠΌΠ΅ 25 записа β€žΠ½Π°Π΄ΠΎΠ»Ρƒβ€œ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ β€žΠ³Ρ€Π°Π½ΠΈΡ‡Π½Π°Ρ‚Π°β€œ стойност ts.
  2. Ако Ρ‚Π°ΠΌ Π²Π΅Ρ‡Π΅ няма Π½ΠΈΡ‰ΠΎ, Π·Π°ΠΌΠ΅Π½Π΅Ρ‚Π΅ стойността NULL с -infinity.
  3. ИзваТдамС цСлия сСгмСнт ΠΎΡ‚ стойности ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°Ρ‚Π° стойност ts ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ΡŠΡ‚ $1, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ ΠΎΡ‚ интСрфСйса (ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° β€žΠΏΠΎΡΠ»Π΅Π΄Π½Π°β€œ ΠΈΠ·ΠΎΠ±Ρ€Π°Π·Π΅Π½Π° стойност).
  4. Ако сС Π²ΡŠΡ€Π½Π΅ Π±Π»ΠΎΠΊ с ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ‚ 26 записа, Ρ‚ΠΎΠΉ Π΅ послСдният.

Или ΡΡŠΡ‰Π°Ρ‚Π° снимка:
PostgreSQL Antipatterns: Навигация Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π°

Π—Π°Ρ‰ΠΎΡ‚ΠΎ сСга ΠΈΠΌΠ°ΠΌΠ΅ ΠΈΠ·Π²Π°Π΄ΠΊΠ°Ρ‚Π° няма ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ β€žΠ½Π°Ρ‡Π°Π»ΠΎβ€œ, Ρ‚ΠΎΠ³Π°Π²Π° Π½ΠΈΡ‰ΠΎ Π½Π΅ Π½ΠΈ ΠΏΡ€Π΅Ρ‡ΠΈ Π΄Π° β€žΡ€Π°Π·ΡˆΠΈΡ€ΠΈΠΌβ€œ Ρ‚Π°Π·ΠΈ заявка Π² ΠΎΠ±Ρ€Π°Ρ‚Π½Π° посока ΠΈ Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ β€žΡ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ°β€œ Π² Π΄Π²Π΅Ρ‚Π΅ посоки - ΠΈ Π½Π°Π΄ΠΎΠ»Ρƒ, ΠΈ Π½Π°Π³ΠΎΡ€Π΅.

Π·Π°Π±Π΅Π»Π΅ΠΆΠΊΠ°

  1. Π”Π°, Π² Ρ‚ΠΎΠ·ΠΈ случай ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ индСкса Π΄Π²Π° ΠΏΡŠΡ‚ΠΈ, Π½ΠΎ всичко Π΅ β€žΡ‡ΠΈΡΡ‚ΠΎ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡβ€œ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ подзаявката Ρ‰Π΅ Π΄ΠΎΠ²Π΅Π΄Π΅ само Π΄ΠΎ към Π΅Π΄Π½ΠΎ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ сканиранС само Π½Π° индСкс.
  2. БъвсСм ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π΅, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° само ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠΌΠ°Ρ‚Π΅ цСнности ts ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ само случайно ΠΈ Π½Π΅ са ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚ тях. Ако Π²Π°ΡˆΠΈΡΡ‚ Ρ‚ΠΈΠΏΠΈΡ‡Π΅Π½ случай Π΅ β€žΠΌΠΈΠ»ΠΈΠΎΠ½ записа Π½Π° 00:00:00.000β€œ, Π½Π΅ трябва Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°. Искам Π΄Π° ΠΊΠ°ΠΆΠ°, Ρ‡Π΅ Π½Π΅ трябва Π΄Π° допускатС Ρ‚Π°ΠΊΡŠΠ² случай. Но Π°ΠΊΠΎ Ρ‚ΠΎΠ²Π° сС случи, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ опцията с Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ индСкс.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€