PostgreSQL Antipatterns: ื ืึทื•ื•ื™ื’ืึทืฆื™ืข ืื™ืŸ ื“ื™ ืจืขื’ื™ืกื˜ืจื™

ื”ื™ื™ึทื ื˜ ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืงื™ื™ืŸ ืงืึธืžืคึผืœืขืงืก ืงืึทืกืขืก ืื•ืŸ ืกืึทืคื™ืกื˜ืึทืงื™ื™ื˜ื™ื“ ืึทืœื’ืขืจื™ื“ืึทืžื– ืื™ืŸ ืกืงืœ. ืึทืœืฅ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื–ื™ื™ืขืจ ืคึผืฉื•ื˜, ืื•ื™ืฃ ื“ืขืจ ืžื“ืจื’ื” ืคื•ืŸ ืงืึทืคึผื™ื˜ืึทืŸ ืงืœืึธืจ ื•ื•ื™ ื“ืขืจ ื˜ืึธื’ - ืœืึธื–ืŸ ืื•ื ื“ื– ื˜ืึธืŸ ื“ืึธืก ื•ื•ื™ื•ื™ื ื’ ื“ื™ ื’ืขืฉืขืขื ื™ืฉ ืจืขื’ื™ืกื˜ืจื™ ืื•ื™ืกื’ืขืฉื˜ืขืœื˜ ืœื•ื™ื˜ ืฆื™ื™ื˜.

ืึทื– ืื™ื–, ืขืก ืื™ื– ืึท ืฆื™ื™ื›ืŸ ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก 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. OFFSET

SELECT
  ...
FROM
  events
ORDER BY
  ts DESC
LIMIT 26 OFFSET $1; -- 26 - ะทะฐะฟะธัะตะน ะฝะฐ ัั‚ั€ะฐะฝะธั†ะต, $1 - ะฝะฐั‡ะฐะปะพ ัั‚ั€ะฐะฝะธั†ั‹

ืคื•ืŸ ื•ื•ืื• ืื™ื– ื’ืขืงื•ืžืขืŸ ื“ื™ ื ื•ืžืขืจ 26? ื“ืึธืก ืื™ื– ื“ื™ ื“ืขืจื ืขื ื˜ืขืจื  ื ื•ืžืขืจ ืคื•ืŸ ืื™ื™ื ืกืŸ ืฆื• ืคึผืœืึธืžื‘ื™ืจืŸ ืื™ื™ืŸ ืคืึทืจืฉื˜ืขืœืŸ. ืžืขืจ ื’ืขื ื•ื™, 25 ื’ืขื•ื•ื™ื–ืŸ ืจืขืงืึธืจื“ืก, ืคึผืœื•ืก 1, ืกื™ื’ื ืึทืœื™ื ื’ ืึทื– ืขืก ืื™ื– ืœืคึผื—ื•ืช ืขืคึผืขืก ืึทื ื“ืขืจืฉ ืื™ืŸ ื“ืขืจ ืžื•ืกื˜ืขืจ ืื•ืŸ ืขืก ืื™ื– ื–ื™ื ืขืŸ ืฆื• ืคืึธืจื–ืขืฆืŸ.

ืคื•ืŸ ืงื•ืจืก, ื“ืขื ื•ื•ืขืจื˜ ืงืขื ืขืŸ ื ื™ื˜ ื–ื™ื™ืŸ "ืกืขื•ื•ืŸ" ืื™ืŸ ื“ืขื ื’ื•ืฃ ืคื•ืŸ ื“ื™ ื‘ืงืฉื”, ืึธื‘ืขืจ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ื“ื•ืจืš ืึท ืคึผืึทืจืึทืžืขื˜ืขืจ. ืึธื‘ืขืจ ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ื™ PostgreSQL ืกืงืขื“ื–ืฉื•ืœืขืจ ื•ื•ืขื˜ ื ื™ืฉื˜ ืงืขื ืขืŸ ืฆื• ืคืึทืจืœืึธื–ื  ื–ื™ืš ื“ื™ ื•ื•ื™ืกืŸ ืึทื– ืขืก ื–ืึธืœ ื–ื™ื™ืŸ ืœืขืคื™ืขืจืขืš ื•ื•ื™ื™ื ื™ืง ืจืขืงืึธืจื“ืก - ืื•ืŸ ื•ื•ืขื˜ ืœื™ื™ื›ื˜ ืงืœื™ื™ึทื‘ืŸ ืึท ื™ื ื™ืคืขืงื˜ื™ื•ื• ืคึผืœืึทืŸ.

ืื•ืŸ ืื™ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฆื•ื‘ื™ื ื“, ื•ื•ื™ื•ื™ื ื’ ื“ื™ ืจืขื’ื™ืกื˜ืจื™ ืื™ื– ื™ืžืคึผืœืึทืžืขื ืึทื“ ื•ื•ื™ ืกื•ื•ื™ื˜ืฉื™ื ื’ ืฆื•ื•ื™ืฉืŸ ื•ื•ื™ื–ืฉืึทื•ื•ืึทืœ "ื‘ืœืขื˜ืขืจ," ืงื™ื™ืŸ ืื™ื™ื ืขืจ ื‘ืืžืขืจืงื˜ ืขืคึผืขืก ืกืึทืกืคึผื™ืฉืึทืก ืคึฟืึทืจ ืึท ืœืึทื ื’ ืฆื™ื™ึทื˜. ืคึผื•ื ืงื˜ ื‘ื™ื– ื“ืขื ืžืึธืžืขื ื˜ ื•ื•ืขืŸ, ืื™ืŸ ื“ืขื ื’ืขืจืึทื ื’ืœ ืคึฟืึทืจ ืงืึทื ื•ื•ื™ื ื™ืึทื ืก, UI / UX ื‘ืึทืฉืœืึธืกืŸ ืฆื• ืจื™ืžื™ื™ืง ื“ื™ ืฆื•ื‘ื™ื ื“ ืฆื• "ืกืึธืฃ ืžืขื’ื™ืœืข" - ื“ืึธืก ืื™ื–, ืึทืœืข ืจืขื’ื™ืกื˜ืจื™ ืื™ื™ื ืกืŸ ื–ืขื ืขืŸ ืฆื™ืขืŸ ืื™ืŸ ืึท ืื™ื™ืŸ ืจืฉื™ืžื” ืึทื– ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืงืขื ืขืŸ ืžืขื’ื™ืœืข ืึทืจื•ื™ืฃ ืื•ืŸ ืึทืจืึธืคึผ.

ืื•ืŸ ืึทื–ื•ื™, ื‘ืขืฉืึทืก ื“ื™ ื•ื•ื™ื™ึทื˜ืขืจ ื˜ืขืกื˜ื™ื ื’, ืื™ืจ ื–ืขื ื˜ ื’ืขื›ืืคื˜ ื“ื•ืคึผืœื™ืงืึทื˜ื™ืึธืŸ ืคื•ืŸ ืจืขืงืึธืจื“ืก ืื™ืŸ ื“ื™ ืจืขื’ื™ืกื˜ืจื™. ืคืืจื•ื•ืืก, ื•ื•ื™ื™ึทืœ ื“ื™ ื˜ื™ืฉ ื”ืื˜ ืึท ื ืึธืจืžืึทืœ ืื™ื ื“ืขืงืก (ts), ื•ื•ืึธืก ื“ื™ื™ืŸ ืึธื ืคึฟืจืขื’ ืจื™ืœื™ื™ื– ืื•ื™ืฃ?

ืคึผื•ื ืงื˜ ื•ื•ื™ื™ึทืœ ืื™ืจ ื”ืึธื˜ ื ื™ืฉื˜ ื ืขืžืขืŸ ืื™ืŸ ื—ืฉื‘ื•ืŸ ืึทื– ts ืื™ื– ื ื™ืฉื˜ ืึท ื™ื™ื ืฆื™ืง ืฉืœื™ืกืœ ืื™ืŸ ื“ืขื ื˜ื™ืฉ. ืื™ืŸ ืคืึทืงื˜, ืื•ืŸ ื–ื™ื™ึทืŸ ื•ื•ืึทืœื•ืขืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ื™ื™ื ืฆื™ืง, ื•ื•ื™ ืงื™ื™ืŸ "ืฆื™ื™ื˜" ืื™ืŸ ืคืึทืงื˜ื™ืฉ ื˜ื ืึธื™ื - ื“ืขืจื™ื‘ืขืจ, ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืจืขืงืึธืจื“ ืื™ืŸ ืฆื•ื•ื™ื™ ืฉื›ื™ื™ื ื™ืฉ ืคึฟืจืื’ืŸ ืœื™ื™ื›ื˜ "ื“ื–ืฉืึทืžืคึผืก" ืคื•ืŸ ื‘ืœืึทื˜ ืฆื• ื‘ืœืึทื˜ ืจืขื›ื˜ ืฆื• ืึท ืึทื ื“ืขืจืฉ ืœืขืฆื˜ ืกื“ืจ ืื™ืŸ ื“ื™ ืคืจื™ื™ืžื•ื•ืขืจืง ืคื•ืŸ ืกืึธืจื˜ื™ื ื’ ื“ื™ ื–ืขืœื‘ืข ืฉืœื™ืกืœ ื•ื•ืขืจื˜.

ืื™ืŸ ืคืึทืงื˜, ืขืก ืื™ื– ืื•ื™ืš ืคืึทืจื‘ืึธืจื’ืŸ ื“ืึธ ืึท ืฆื•ื•ื™ื™ื˜ ืคึผืจืึธื‘ืœืขื, ื•ื•ืึธืก ืื™ื– ืคื™ืœ ืžืขืจ ืฉื•ื•ืขืจ ืฆื• ื‘ืึทืžืขืจืงืŸ - ืขื˜ืœืขื›ืข ืื™ื™ื ืกืŸ ื•ื•ืขื˜ ื ื™ืฉื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื–ืŸ ื‘ื›ืœืœ! ื ืึธืš ืึทืœืข, ื“ื™ "ื“ื•ืคึผืœื™ืงืึทื˜" ืจืขืงืึธืจื“ืก ื’ืขื ื•ืžืขืŸ ืขืžืขืฆืขืจ ืึทื ื“ืขืจืฉ ืก ืคึผืœืึทืฅ. ื ื“ื™ื˜ื™ื™ืœื“ ื“ืขืจืงืœืขืจื•ื ื’ ืžื™ื˜ ืฉื™ื™ืŸ ื‘ื™ืœื“ืขืจ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืœื™ื™ืขื ืขืŸ ื“ืึธ.

ื™ืงืกืคึผืึทื ื“ื™ื ื’ ื“ื™ ืื™ื ื“ืขืงืก

ื ื›ื™ื˜ืจืข ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืคืืจืฉื˜ื™ื™ื˜ ืึทื– ื“ืขืจ ืื™ื ื“ืขืงืก ืฉืœื™ืกืœ ื“ืึทืจืฃ ื–ื™ื™ืŸ ื™ื™ื ืฆื™ืง, ืื•ืŸ ื“ื™ ื™ื–ื™ืึทืกื˜ ื•ื•ืขื’ ืื™ื– ืฆื• ื™ืงืกืคึผืึทื ื“ ืขืก ืžื™ื˜ ืึท ื“ืึธืš ื™ื™ื ืฆื™ืง ืคืขืœื“, ื•ื•ืึธืก ืคึผืง ืื™ื– ื’ืื ืฅ ืคึฟืึทืจ:

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

ืื•ืŸ ื“ื™ ื‘ืงืฉื” ืžื™ื•ื˜ื™ื™ื˜ื™ื“:

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

#2. ื‘ืึทืฉื˜ื™ืžืขืŸ ืฆื• "ืงื•ืจืกืึธืจืก"

ืขื˜ืœืขื›ืข ืžืึธืœ ืฉืคึผืขื˜ืขืจ, ืึท ื“ื‘ืึท ืงื•ืžื˜ ืฆื• ืื™ืจ ืื•ืŸ ืื™ื– "ืฆื•ืคืจื™ื“ืŸ" ืึทื– ื“ื™ื™ืŸ ืจื™ืงื•ื•ืขืก ื–ื™ื™ ืœืึธื“ืŸ ื“ื™ ืกืขืจื•ื•ืขืจ ื•ื•ื™ ื’ืขื ืขื ืžื™ื˜ ื–ื™ื™ืขืจ OFFSET ื›ึผืœืœื™ื, ืื•ืŸ ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ืขืก ืก ืฆื™ื™ึทื˜ ืฆื• ื‘ืึทืฉื˜ื™ืžืขืŸ ืฆื• ื ืึทื•ื•ื™ื’ืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ืœืขืฆื˜ืข ื•ื•ืขืจื˜ ื’ืขื•ื•ื™ื–ืŸ. ื“ื™ื™ืŸ ืึธื ืคึฟืจืขื’ ืžื™ื•ื˜ื™ื™ืฅ ื•ื•ื™ื“ืขืจ:

SELECT
  ...
WHERE
  (ts, id) < ($1, $2) -- ะฟะพัะปะตะดะฝะธะต ะฟะพะปัƒั‡ะตะฝะฝั‹ะต ะฝะฐ ะฟั€ะตะดั‹ะดัƒั‰ะตะผ ัˆะฐะณะต ะทะฝะฐั‡ะตะฝะธั
ORDER BY
  ts DESC, id DESC
LIMIT 26;

ื“ื• ื”ืืกื˜ ื ื ื—ืช ื’ืขืื˜ืขืžื˜ ื‘ื™ื– ืขืก ืื™ื– ื’ืขืงื•ืžืขืŸ...

#3. ืจื™ื™ื ื™ืงื•ื ื’ ื™ื ื“ืขืงืกื™ื–

ื•ื•ื™ื™ึทืœ ืื™ื™ืŸ ื˜ืึธื’ ื“ื™ื™ืŸ ื“ื‘ืึท ืœื™ื™ืขื ืขืŸ ืึทืจื˜ื™ืงืœ ื•ื•ืขื’ืŸ ื“ืขืจื’ื™ื™ื•ื ื’ ื™ื ื™ืคืขืงื˜ื™ื•ื• ื™ื ื“ืขืงืกื™ื– ืื•ืŸ ืื™ื™ื ื’ืขื–ืขืŸ ืึทื– "ื ื™ื˜ ื“ื™ ืœืขืฆื˜ืข" ืฆื™ื™ื˜ ืกื˜ืึทืžืคึผ ืื™ื– ื ื™ืฉื˜ ื’ื•ื˜. ืื•ืŸ ืื™ืš ื‘ื™ืŸ ื’ืขืงื•ืžืขืŸ ืฆื• ื“ื™ืจ ื•ื•ื™ื“ืขืจ - ืื™ืฆื˜ ืžื™ื˜ ื“ืขื ื’ืขื“ืึทื ืง ืึทื– ื“ืขืจ ืื™ื ื“ืขืงืก ื–ืึธืœ ื ืึธืš ืงืขืจ ืฆื•ืจื™ืง ืื™ืŸ (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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’