ЁЯПШя╕П рдзрдбрд╛ 11 тАФ NoSQL рдЖрдгрд┐ рдЗрддрд░ рдЦреЛрд▓реНрдпрд╛: рдкреНрд░рд╢реНрдирд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп рдЦреЛрд▓реА рдирд┐рд╡рдбрдгреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 11 ┬╖ рдорд╛рдЧреАрд▓: lesson-10-scaling ┬╖ рдкреБрдвреАрд▓: lesson-12-performance-ops
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ10, рдЖрдгрд┐ рд╢рд╛рд│рд╛ рдмрд╛рдВрдзреВ рд╢рдХреЗрд▓ рдЕрд╢рд╛ рдЗрддрд░ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдЦреЛрд▓реНрдпрд╛ тАФ document, key-value, columnar, graph, vector тАФ рдкреНрд░рддреНрдпреЗрдХ рдХрд╢рд╛рдЪреЗ рдЙрддреНрддрд░ рдЪрд╛рдВрдЧрд▓реЗ рджреЗрддреЗ, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдп рд╕реЛрдбреВрди рджреЗрддреЗ, рдЖрдгрд┐ рдирд┐рд╡рдбреАрдЪрд╛ рдПрдХрдЪ рдирд┐рдпрдо.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд░реЗрдХреЙрд░реНрдб рд░реВрдо рд╣реА relational рдЦреЛрд▓реА рдЖрд╣реЗ: рдиреЛрдВрджрд╡рд╣реНрдпрд╛, keys, рдирд┐рдпрдо, JOINs, transactions. рддреА рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдЬрд╡рд│рдЬрд╡рд│ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдЙрддреНрддрд░ рдЪрд╛рдВрдЧрд▓реЗ рджреЗрддреЗ. рдкрдг рдХрд╛рд╣реА рдкреНрд░рд╢реНрди рддрд┐рдереЗ рдЕрд╡рдШрдб рдЬрд╛рддрд╛рдд, рдореНрд╣рдгреВрди рд╢рд╛рд│рд╛ рдЗрддрд░ рдЦреЛрд▓реНрдпрд╛ рдмрд╛рдВрдзрддрд╛рдд:
- Document рдЦреЛрд▓реА ЁЯУД (MongoDB): рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдореНрд╣рдгрдЬреЗ рдПрдХ folder, рдЬреНрдпрд╛рдд рд╕рдЧрд│реЗ рдЖрдд рдЖрд╣реЗ тАФ nested, рд▓рд╡рдЪрд┐рдХ, рдард░рд▓реЗрд▓реЗ headings рдирд╛рд╣реАрдд. рдкреНрд░рддреНрдпреЗрдХ record рдкреВрд░реНрдг рд╡рд╛рдЪрд▓рд╛ рдЬрд╛рддреЛ рддреЗрд╡реНрд╣рд╛ рдЙрддреНрддрдо; рдЕрдиреЗрдХ folders рдордзреНрдпреЗ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддрд╛рдирд╛ рдЕрд╡рдШрдб.
- Key-value рдЦреЛрд▓реА ЁЯФС (Redis, DynamoDB): рдПрдХ label, рдПрдХ рдЙрддреНрддрд░, microseconds рдордзреНрдпреЗ. Sessions, counters, рдзрдбрд╛ 10 рдордзрд▓рд╛ cache.
- Columnar рдЦреЛрд▓реА ЁЯУК (BigQuery, ClickHouse): рдиреЛрдВрджрд╡рд╣реНрдпрд╛ column рдиреБрд╕рд╛рд░ рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛, рдореНрд╣рдгреВрди "рджрд╣рд╛ рд╡рд░реНрд╖рд╛рдВрдЪреА рд╣рдЬреЗрд░реА рдмреЗрд░реАрдЬ рдХрд░рд╛" рдЭрдЯрдХреНрдпрд╛рдд рд╣реЛрддреЗ; рдПрдХ рдУрд│ рдмрджрд▓рдгреЗ рд╣рд│реВ. Analytics рд╕рд╛рдареА, рд░реЛрдЬрдЪреНрдпрд╛ counter рд╕рд╛рдареА рдирд╛рд╣реА.
- Graph рдЦреЛрд▓реА ЁЯХ╕я╕П (Neo4j): "рдПрдХрд╛рдЪ рд╡рд░реНрдЧрд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдореИрддреНрд░рд┐рдгреАрдВрдЪреНрдпрд╛ рдореИрддреНрд░рд┐рдгреА" тАФ рдиреЛрдВрджрд╡рд╣реНрдпрд╛рдВрдордзрд▓реЗ JOINs рдирд╛рд╣реАрдд, рддрд░ рдЧреЛрд╖реНрдЯреАрдВрдордзрд▓реНрдпрд╛ рдЙрдбреНрдпрд╛ (hops).
- рдЕрд░реНрдерд╛рдЪреЗ рд╕рднрд╛рдЧреГрд╣ ЁЯЧ║я╕П (vector databases тАФ VectorDB рд╢рд╛рд│рд╛): рдЕрд░реНрдерд╛рдиреЗ рд╕рд░реНрд╡рд╛рдд рдЬрд╡рд│рдЪреЗ, search рдЖрдгрд┐ RAG рд╕рд╛рдареА.
рдирд┐рдпрдо: рдЦреЛрд▓реА рдкреНрд░рд╢реНрдирд╛рдЪреНрдпрд╛ рдорд╛рдЧреЗ рдпреЗрддреЗ. relational рдЦреЛрд▓реАрддреВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░рд╛; рддреА рдЬреНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдЙрддреНрддрд░ рд╡рд╛рдИрдЯ рджреЗрддреЗ рддреНрдпрд╛рд╕рд╛рдареАрдЪ рджреБрд╕рд░реА рдЦреЛрд▓реА рдмрд╛рдВрдзрд╛ тАФ рдЖрдгрд┐ рд╕рддреНрдп рдПрдХрд╛рдЪ рдард┐рдХрд╛рдгреА рдареЗрд╡рд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
rel["ЁЯЧДя╕П relational тАФ the default room<br/>rules, JOINs, transactions"]
doc["ЁЯУД document<br/>one folder per thing, flexible shape"]
kv["ЁЯФС key-value<br/>one label тЖТ one answer, ┬╡s"]
col["ЁЯУК columnar<br/>sum a billion rows"]
gr["ЁЯХ╕я╕П graph<br/>hops between things"]
vec["ЁЯЧ║я╕П vector<br/>nearest by meaning"]
q["ЁЯзн the room follows the question"] --> rel
rel -.->|"a question it answers badly"| doc & kv & col & gr & vec
тЭУ рдХрд╛рдп
- Document: JSON records, schema-on-read, nested arrays; fields рд╡рд░ indexes; documents рдкрд▓реАрдХрдбрдЪреЗ transactions рдХрдордХреБрд╡рдд (рд╕реБрдзрд╛рд░рдд рдЖрд╣реЗрдд). рдЬреЗрд╡реНрд╣рд╛ record рд╣реЗрдЪ рдХрд╛рдорд╛рдЪреЗ рдПрдХрдХ рдЕрд╕рддреЗ (product page, profile) рддреЗрд╡реНрд╣рд╛ рдЬрд┐рдВрдХрддреЗ.
- Key-value: hash lookups; TTLs; рд╕рд╛рдзреНрдпрд╛ data structures (Redis lists, sets). рдкреНрд░рд╢реНрдирд╛рдВрд╕рд╛рдареА рдирд╛рд╣реА ("рд╕рд░реНрд╡ keys рдЬрд┐рдереЗтАж").
- Columnar / warehouse: рдореБрдЦреНрдпрддрдГ append, batch loads, aggregate queries; transactional рдЦреЛрд▓реАрдкрд╛рд╕реВрди рд╡реЗрдЧрд│реА (ETL/ELT рддрд┐рд▓рд╛ data рдкреБрд░рд╡рддреЗ).
- Graph: nodes рдЖрдгрд┐ edges; рдЬреЗ traversals рд╕рд╣рд╛ self-JOINs рдЭрд╛рд▓реЗ рдЕрд╕рддреЗ.
- Vector: embeddings + approximate nearest neighbour; RAG рдЪрд╛ рдкрд╛рди
рд╢реЛрдзрдгрд╛рд░рд╛. рдордзреНрдпрдо рдкреНрд░рдорд╛рдгрд╛рд╕рд╛рдареА Postgres рдХрдбреЗ
pgvectorрдЖрд╣реЗ. - Time-series, search (Elasticsearch/OpenSearch) тАФ рдЕрдзрд┐рдХ рдкреНрд░рд╢реНрдирд╛рдВрд╕рд╛рдареА рдЕрдзрд┐рдХ рдЦреЛрд▓реНрдпрд╛; рдирд┐рдпрдо рддреЛрдЪ.
- CAP / consistency: distributed рдЦреЛрд▓реНрдпрд╛ partition рдЪреНрдпрд╛ рд╡реЗрд│реА availability рд╕рд╛рдареА consistency рд╕реЛрдбрддрд╛рдд; "eventually consistent" рдореНрд╣рдгрдЬреЗ рддреБрдордЪрд╛ read рдЬреБрдирд╛ рдЕрд╕реВ рд╢рдХрддреЛ тАФ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢реНрдирд╛рд╕рд╛рдареА рддреЗ рдЪрд╛рд▓реЗрд▓ рдХрд╛ рд╣реЗ рдард░рд╡рд╛.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдореЛрдЬрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рд╢рд┐рд╡рд╛рдп "scale рд╕рд╛рдареА NoSQL" рдХреЗрд▓реНрдпрд╛рдиреЗ рдЕрдиреЗрдХ teams рдиреА рддреНрдпрд╛рдВрдЪреЗ constraints, JOINs рдЖрдгрд┐ transactions рдЧрдорд╛рд╡рд▓реЗ тАФ рдЖрдгрд┐ рддреЗ рдореЛрдареА рдХрд┐рдВрдордд рджреЗрдКрди рдкрд░рдд рд╡рд┐рдХрдд рдШреЗрддрд▓реЗ. рдЖрдгрд┐ рдЙрд▓рдЯреА рдЪреВрдХрд╣реА рдЦрд░реА рдЖрд╣реЗ: analytics рдХрд┐рдВрд╡рд╛ рдЕрд░реНрде-search transactional рдЦреЛрд▓реАрддреВрди рдЬрдмрд░рджрд╕реНрддреАрдиреЗ рдЪрд╛рд▓рд╡рдгреЗ. рдЖрдзреА рдкреНрд░рд╢реНрдирд╛рд▓рд╛ рдирд╛рд╡ рджреНрдпрд╛; рдордЧ рдЦреЛрд▓реАрд▓рд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
SQLite рдкреНрд░рд╛рдорд╛рдгрд┐рдХрдкрдгреЗ рджреЛрди рдЦреЛрд▓реНрдпрд╛ рдмрдирддреЗ: relational (рдкреНрд░рддреНрдпреЗрдХ рдзрдбреНрдпрд╛рдд) рдЖрдгрд┐,
JSON column рд╕рд╣, рдПрдХ рдЫреЛрдЯреА document рдЦреЛрд▓реА тАФ рдЦрд╛рд▓рдЪрд╛ рд╕рд░рд╛рд╡. рд╢реЗрдЬрд╛рд░рдЪреЗ
рдЕрд░реНрдерд╛рдЪреЗ рд╕рднрд╛рдЧреГрд╣ рдореНрд╣рдгрдЬреЗ VectorDB рд╢рд╛рд│реЗрдЪреЗ vectordb/vectordb.py.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 - <<'EOF'
import sqlite3, json; c = sqlite3.connect("db/school.db")
c.execute("CREATE TABLE IF NOT EXISTS profiles (student_id INTEGER PRIMARY KEY REFERENCES students(id), doc TEXT NOT NULL)")
c.execute("INSERT OR REPLACE INTO profiles VALUES (2, ?)", (json.dumps({"clubs": ["chess", "robotics"], "guardian": {"name": "R. Rao", "phone": "555-0102"}}),))
c.commit()
print(c.execute("SELECT s.name, json_extract(p.doc, '$.guardian.name'), json_extract(p.doc, '$.clubs[0]') FROM profiles p JOIN students s ON s.id = p.student_id").fetchall())
print(c.execute("SELECT s.name FROM profiles p JOIN students s ON s.id=p.student_id, json_each(p.doc, '$.clubs') j WHERE j.value = 'robotics'").fetchall())
EOF
# paper exercise: for each question, name the room тАФ (a) 'how many students were present each month for 10 years?'
# (b) 'is the session token valid?' (c) 'which students share two clubs with Katrina?' (d) 'find the policy paragraph closest in meaning to this question' (e) 'transfer Aishwarya to 3B and update the counts'
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
Document рд╕рд░рд╛рд╡ relational row рдордзрд▓реНрдпрд╛ JSON рдордзреВрди рдХрддрд░рд┐рдирд╛рдЪреЗ рдкрд╛рд▓рдХ рдЖрдгрд┐ рдкрд╣рд┐рд▓рд╛ club рдЫрд╛рдкрддреЛ, рдЖрдгрд┐ json_each рдиреЗ robotics рдЪреЗ рд╕рджрд╕реНрдп рд╢реЛрдзрддреЛ тАФ рд░реЗрдХреЙрд░реНрдб рд░реВрдордЪреНрдпрд╛ рдЖрдд рдПрдХ document рдЦреЛрд▓реА, key рдорд╛рддреНрд░ рдЕрдЬреВрдирд╣реА relational. рдХрд╛рдЧрджрд╛рд╡рд░: (a) columnar, (b) key-value, (c) graph (рдХрд┐рдВрд╡рд╛ рдпрд╛ рдЖрдХрд╛рд░рд╛рдд self-JOIN), (d) vector, (e) relational тАФ transaction.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдЦреЛрд▓реНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рдиреБрд╕рд╛рд░ рдирд┐рд╡рдбрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд, рдЖрдгрд┐ relational рдЦреЛрд▓реА рдЖрдкрд▓реНрдпрд╛ keys рди рд╕реЛрдбрддрд╛ рдПрдХ рдЫреЛрдЯреА document рдЦреЛрд▓реА рд╕рд╛рдорд╛рд╡реВ рд╢рдХрддреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- fashion рдХрд┐рдВрд╡рд╛ "рдХрд╛рдп scale рд╣реЛрддреЗ" рдпрд╛рд╡рд░реВрди рдЦреЛрд▓реА рдирд┐рд╡рдбрдгреЗ тАФ рдкреНрд░рд╢реНрди рдореЛрдЬрд╛
- рдПрдХрдЪ рд╕рддреНрдп рджреЛрди рдЦреЛрд▓реНрдпрд╛рдВрдордзреНрдпреЗ, рдорд╛рд▓рдХ рдХреЛрдгреАрдЪ рдирд╛рд╣реА тАФ рддреНрдпрд╛ рдПрдХрдореЗрдХрд╛рдВрд╢реА рдЬреБрд│рдгрд╛рд░ рдирд╛рд╣реАрдд
- рд╕рдХрд╛рд│реА 9 рд╡рд╛рдЬрддрд╛ transactional рдЦреЛрд▓реАрд╡рд░ analytics рдЪрд╛рд▓рд╡рдгреЗ
- рдкреИрд╕реЗ рдХрд┐рдВрд╡рд╛ рдЬрд╛рдЧрд╛рдВрд╕рд╛рдареА "eventually consistent" рдЪрд╛рд▓реЗрд▓ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рдгреЗ
- "schema рд╕рддрдд рдмрджрд▓рддреЛ" рдореНрд╣рдгреВрди document store тАФ рд╣реА modelling рдЪреА рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ (рдзрдбрд╛ 05), рдЦреЛрд▓реАрдЪреА рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдмрд╣реБрддреЗрдХ рдЦрд▒реНрдпрд╛ systems рдореНрд╣рдгрдЬреЗ Postgres + Redis + рдПрдХ analytics рдЦреЛрд▓реА, рдЖрдгрд┐ product рд▓рд╛ рдЧрд░рдЬ рдкрдбрд▓реНрдпрд╛рд╡рд░ search рдХрд┐рдВрд╡рд╛ vector рдЦреЛрд▓реА. Interview рдордзрд▓рд╛ рдкреНрд░рд╢реНрди рдХрдзреАрдЪ "рдХреЛрдгрддреА рд╕рд░реНрд╡реЛрддреНрддрдо" рдирд╕рддреЛ тАФ рддреЛ рдЕрд╕рддреЛ "рдХреЛрдгрддрд╛ рдкреНрд░рд╢реНрди, рдЖрдгрд┐ рддреА рдЦреЛрд▓реА рдХрд╛рдп рд╕реЛрдбреВрди рджреЗрддреЗ".
тПня╕П рдкреБрдвреЗ
рд╢реЗрд╡рдЯрдЪрд╛ рдЯрдкреНрдкрд╛: performance рдЖрдгрд┐ operations тАФ рд╣рд│реВ queries рдЪреА рддрдкрд╛рд╕рдгреА, N+1, рдЖрдгрд┐ рд░реЗрдХреЙрд░реНрдб рд░реВрдорд╕рд╛рдареА on-call рдЪреЗрдХрд▓рд┐рд╕реНрдЯ.
git checkout lesson-12-performance-ops