ЁЯЧДя╕П рдзрдбрд╛ 01 тАФ database рдХрд╛: рд░реЗрдХреЙрд░реНрдб рд░реВрдо
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-tables-rows-keys
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
database рдХреЛрдгрддрд╛ рдкреНрд░рд╢реНрди рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗрдд тАФ рдЖрдгрд┐ рддреА рддреАрди рд╡рдЪрдиреЗ (рдЯрд┐рдХрд╛рдК, рд╕рд╛рдорд╛рдпрд┐рдХ, рдЙрддреНрддрд░ рджреЗрдгрд╛рд░реА) рдЬреА рдХреЛрд░реНрд╕рдЪреНрдпрд╛ рдкреБрдврдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ design рдирд┐рд░реНрдгрдпрд╛рдЪреЗ рдХрд╛рд░рдг рд╕рд╛рдВрдЧрддрд╛рдд. рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рд▓ рдЕрд╢рд╛ рдЦрд▒реНрдпрд╛ files:
- db/schema.sql тАФ рдиреЛрдВрджрд╡рд╣реНрдпрд╛, рдиреАрдЯ рдЖрдЦрд▓реЗрд▓реНрдпрд╛
- db/seed.sql тАФ рдкрд╛рдЪ рд╡рд┐рджреНрдпрд╛рд░реНрдереА, рджрд╣рд╛ grades
- db/demo.py тАФ рдкреНрд░рддреНрдпреЗрдХ рдзрдбреНрдпрд╛рдЪреНрдпрд╛ queries, рдкреНрд░рддреНрдпрдХреНрд╖, рдЦрд▒реНрдпрд╛ SQLite database рд╡рд░
ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЖрдзреА: рддреБрдореНрд╣рд╛рд▓рд╛ Python 3 рд╣рд╡реЗ тАФ рддреНрдпрд╛рдЪреЗ built-in
sqlite3module рд╣реАрдЪ рд╕рдВрдкреВрд░реНрдг рд░реЗрдХреЙрд░реНрдб рд░реВрдо рдЖрд╣реЗ; server рдирд╛рд╣реА, Docker рдирд╛рд╣реА, cloud рдирд╛рд╣реА. Postgres рдЖрдгрд┐ MySQL рдордзреНрдпреЗ рдХрд▓реНрдкрдирд╛ рддреНрдпрд╛рдЪ рдЖрд╣реЗрдд; рдЬрд┐рдереЗ рдлрд░рдХ рдЖрд╣реЗ рддрд┐рдереЗ рдзрдбреЗ рддрд╕реЗ рд╕рд╛рдВрдЧрддрд╛рдд. рдЪрд╛рдВрдЧрд▓реЗ рд╢реЗрдЬрд╛рд░реА: API рд╢рд╛рд│рд╛ (рдпрд╛ рдЦреЛрд▓реАрд╕рдореЛрд░рдЪрд╛ counter) рдЖрдгрд┐ VectorDB рд╢рд╛рд│рд╛ (рд╢реЗрдЬрд╛рд░рдЪрд╛ рдЕрд░реНрдерд╛рдЪрд╛ рд╣реЙрд▓).
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│рд╛ рдЖрдкрд▓реНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдмрджреНрджрд▓рдЪреЗ рд╕рддреНрдп рдХреБрдареЗ рдареЗрд╡рддреЗ? рдЬреБрдиреНрдпрд╛ рд╡рд╛рдИрдЯ рджрд┐рд╡рд╕рд╛рдВрдд: рдЪрд┐рдХрдЯ рдЪрд┐рдареНрдареНрдпрд╛ рдЖрдгрд┐ spreadsheets ЁЯУЭ. рдХреНрд░реАрдбрд╛ рд╢рд┐рдХреНрд╖рд┐рдХреЗрдХрдбреЗ рдПрдХ рдпрд╛рджреА рд╣реЛрддреА, office рдХрдбреЗ рджреБрд╕рд░реА, canteen app рдЪреА рд╕реНрд╡рддрдГрдЪреА file. рддреАрди рдпрд╛рджреНрдпрд╛, рдХрддрд░рд┐рдирд╛рдЪреНрдпрд╛ рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рддреАрди рдЖрд╡реГрддреНрддреНрдпрд╛. office рдЪрд╛ laptop рдПрдХрд╛ рд╢реБрдХреНрд░рд╡рд╛рд░реА рдмрдВрдж рдкрдбрд▓рд╛ рдЖрдгрд┐ grades рд╕реЛрдмрдд рдШреЗрдКрди рдЧреЗрд▓рд╛. рдЖрдгрд┐ рдПрдХ рд╕рд╛рдзрд╛ рдкреНрд░рд╢реНрди тАФ "maths рдордзреНрдпреЗ A рдорд┐рд│рд╛рд▓реЗрд▓реЗ 3A рдЪреЗ рд╕рд░реНрд╡ рд╡рд┐рджреНрдпрд╛рд░реНрдереА" тАФ рддреАрди files рдЖрдгрд┐ calculator рдЙрдШрдбрд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдХреЛрдгрд╛рд▓рд╛рдЪ рд╕реЛрдбрд╡рддрд╛ рдпреЗрдд рдирд╡реНрд╣рддрд╛.
рдореНрд╣рдгреВрди рд╢рд╛рд│реЗрдиреЗ рдПрдХ рд░реЗрдХреЙрд░реНрдб рд░реВрдо ЁЯЧДя╕П рдмрд╛рдВрдзрд▓реА: рдПрдХрдЪ рдЬрд╛рдЧрд╛, рдПрдХрд╛ рджрдкреНрддрд░рджрд╛рд░рд╛рдХрдбреВрди рдЪрд╛рд▓рд╡рд▓реА рдЬрд╛рдгрд╛рд░реА, рддреАрди рд╡рдЪрдирд╛рдВрд╕рд╣:
- рдЯрд┐рдХрд╛рдК тАФ рдЪрд┐рдХрдЯ рдЪрд┐рдареНрдареАрд╡рд░ рдирд╡реНрд╣реЗ, рддрд░ рдХрдкрд╛рдЯрд╛рддрд▓реНрдпрд╛ рдмрд╛рдВрдзрд▓реЗрд▓реНрдпрд╛ рдиреЛрдВрджрд╡рд╣реНрдпрд╛рдВрдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ. laptop рдмрдВрдж рдкрдбрддреЛ; рдиреЛрдВрджрд╡рд╣реНрдпрд╛ рд░рд╛рд╣рддрд╛рдд.
- рд╕рд╛рдорд╛рдпрд┐рдХ тАФ рдкреНрд░рддреНрдпреЗрдХ clerk, app рдЖрдгрд┐ рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рддреНрдпрд╛рдЪ рдиреЛрдВрджрд╡рд╣реНрдпрд╛ рдкрд╛рд╣рддрд╛рдд, рдЖрдгрд┐ рдПрдХрд╛рдЪ рд╡реЗрд│реА рд▓рд┐рд╣рд┐рдгрд╛рд░реЗ рджреЛрди clerks рдкрд╛рди рдлрд╛рдбрдгрд╛рд░ рдирд╛рд╣реАрдд рдпрд╛рдЪреА рджрдкреНрддрд░рджрд╛рд░ рдХрд╛рд│рдЬреА рдШреЗрддреЛ (рдзрдбрд╛ 07).
- рдЙрддреНрддрд░ рджреЗрдгрд╛рд░реА тАФ рддреБрдореНрд╣реА рдкреНрд░рдорд╛рдгрд┐рдд рдкрджреНрдзрддреАрдиреЗ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддрд╛ ("maths рдордзреНрдпреЗ A рдорд┐рд│рд╛рд▓реЗрд▓реЗ 3A рдЪреЗ рд╕рд░реНрд╡ рд╡рд┐рджреНрдпрд╛рд░реНрдереА") рдЖрдгрд┐ рджрдкреНрддрд░рджрд╛рд░ рддреЗ рд╢реЛрдзрддреЛ тАФ рдкрдЯрдХрди, рдХрд╛рд░реНрдб рдХреЕрдЯрд▓реЙрдЧрдЪреНрдпрд╛ рдорджрддреАрдиреЗ (рдзрдбрд╛ 06).
рддреА рд░реЗрдХреЙрд░реНрдб рд░реВрдо рдореНрд╣рдгрдЬреЗрдЪ database. рдиреЛрдВрджрд╡рд╣реНрдпрд╛ рдореНрд╣рдгрдЬреЗ tables, рдкреНрд░рд╢реНрдирд╛рдВрдЪреА рднрд╛рд╖рд╛ рдореНрд╣рдгрдЬреЗ SQL, рдЖрдгрд┐ рджрдкреНрддрд░рджрд╛рд░ рдореНрд╣рдгрдЬреЗ database engine.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
subgraph before["ЁЯУЭ before: sticky notes"]
a1["sports list: Katrina 3A"]
a2["office sheet: Katrina 3B?"]
a3["canteen file: gone with the laptop ЁЯТе"]
end
subgraph after["ЁЯЧДя╕П after: the record room"]
d["1 durable тАФ on the shelf, survives the crash"]
s["2 shared тАФ many clerks, one truth"]
q["3 answerable тАФ ask in SQL, fast with a catalogue"]
end
before -->|"build the record room"| after
тЭУ рдХрд╛рдп
- database рд╣рд╛ рдЕрд╕рд╛ program рдЖрд╣реЗ рдЬреЛ data рдЯрд┐рдХрд╛рдК рдареЗрд╡рддреЛ, рдЕрдиреЗрдХ users рдирд╛ рддреЛ рд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рд╡рд╛рдЪреВ рдЖрдгрд┐ рд▓рд┐рд╣реВ рджреЗрддреЛ, рдЖрдгрд┐ queries рдЪреА рдЙрддреНрддрд░реЗ рджреЗрддреЛ. SQLite (рд╣рд╛ рдХреЛрд░реНрд╕), Postgres рдЖрдгрд┐ MySQL рд╣реЗ relational databases рдЖрд╣реЗрдд: keys рдЕрд╕рд▓реЗрд▓реНрдпрд╛ tables рдордзрд▓рд╛ data.
- рдЯрд┐рдХрд╛рдК = commit рдЭрд╛рд▓реЗрд▓реЗ write crash рдирдВрддрд░рд╣реА рдЯрд┐рдХрддреЗ (рдзрдбрд╛ 04 рдордзреАрд▓ ACID).
- рд╕рд╛рдорд╛рдпрд┐рдХ = locks рдЖрдгрд┐ isolation рд╕рд╣ рдПрдХрд╛рдЪ рд╡реЗрд│реА access (рдзрдбрд╛ 07).
- рдЙрддреНрддрд░ рджреЗрдгрд╛рд░реА = рдПрдХ query рднрд╛рд╖рд╛ рдЖрдгрд┐ indexes (рдзрдбреЗ 03, 06).
- API рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ counter рдорд╛рдЧреЗ рдЕрд╢реАрдЪ рдПрдХ рдЦреЛрд▓реА рдЕрд╕рддреЗ; counter рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдирд╛ рдЦреЛрд▓реАрдмрд╛рд╣реЗрд░ рдареЗрд╡рддреЛ, рдЖрдгрд┐ рдЦреЛрд▓реА рд╕рддреНрдп рдЬрдкрддреЗ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг "рдлрдХреНрдд file рдордзреНрдпреЗ рдареЗрд╡рд╛" рд╣реА рдкрджреНрдзрдд рддрд┐рдиреНрд╣реА рд╡рдЪрдирд╛рдВрд╡рд░ рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдкрдпрд╢реА рдард░рддреЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдпрд╢ рдорд╣рд╛рдЧрдбреЗ рдЕрд╕рддреЗ: рд╣рд░рд╡рд▓реЗрд▓рд╛ data, рд╕рддреНрдпрд╛рдЪреНрдпрд╛ рджреЛрди рдЖрд╡реГрддреНрддреНрдпрд╛, рдЖрдгрд┐ рдХреЛрдгрд╛рд▓рд╛рдЪ рдЙрддреНрддрд░ рджреЗрддрд╛ рди рдпреЗрдгрд╛рд░реЗ рдкреНрд░рд╢реНрди. рдкреБрдвреЗ рдпреЗрдгрд╛рд░рд╛ scaling, backup рдЖрдгрд┐ modelling рдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ рдзрдбрд╛ рдореНрд╣рдгрдЬреЗ рджрдмрд╛рд╡рд╛рдЦрд╛рд▓реА рдкрд╛рд│рд▓реЗрд▓реЗ рдпрд╛рдВрдкреИрдХреА рдПрдХ рд╡рдЪрди.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
python3 db/demo.py рд╣реЗ schema.sql + seed.sql рд╡рд░реВрди db/school.db рдмрдирд╡рддреЗ
рдЖрдгрд┐ рдХреЛрд░реНрд╕рдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдЪрд╛рд▓рд╡рддреЗ. рдЖрдЬ рддреБрдореНрд╣реА рдлрдХреНрдд рддреЗ рдЪрд╛рд▓рд╡рд╛ рдЖрдгрд┐ рд╡рд╛рдЪрд╛.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (60 seconds тАФ рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕, рдкреНрд░рддреНрдпрдХреНрд╖)
python3 db/demo.py
рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрд╕реЗ рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ (рдЫрд╛рдЯрд▓реЗрд▓реЗ):
ЁЯЧДя╕П school.db built from schema.sql + seed.sql
тХРтХРтХР reads тХРтХРтХР ('Aishwarya', '3A-01') ('Dipika', '3A-03')
тХРтХРтХР join тХРтХРтХР ('Aishwarya', '3A', 'maths', 'A') тАж
тХРтХРтХР txn тХРтХРтХР ЁЯТе second update failed: FOREIGN KEY constraint failed тЖТ ROLLBACK
тХРтХРтХР index тХРтХРтХР without an index: SCAN тАж 2.4 ms ┬╖ with the card catalogue: SEARCH тАж 0.0 ms
тХРтХРтХР locks тХРтХРтХР тП│ clerk 1 waited, then: database is locked
тХРтХРтХР backup тХРтХРтХР after the restore тАФ Rohan returns
тЬЕ done тАФ the record room survived every lesson
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
script тЬЕ done рдиреЗ рд╕рдВрдкрддреЗ; db/school.db рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ (ls -la db/); рддреЗ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рд▓реЗ рдХреА рдЦреЛрд▓реА рд╕реБрд░реБрд╡рд╛рддреАрдкрд╛рд╕реВрди рдкреБрдиреНрд╣рд╛ рдмрдирддреЗ (рддреЗ file delete рдХрд░реВрди рдкреБрдиреНрд╣рд╛ рддрдпрд╛рд░ рдХрд░рддреЗ тАФ рд╢рд┐рдХрддрд╛рдирд╛ рд╣реЗ рдореБрджреНрджрд╛рдо рдХреЗрд▓реЗ рдЖрд╣реЗ).
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдЦрд▒реНрдпрд╛ database рд▓рд╛ рдХрд╛рд╣реАрд╣реА install рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрдд рдирд╛рд╣реА: рдПрдХ schema file, рдПрдХ seed file, рдЖрдгрд┐ Python рдЪреНрдпрд╛ built-in SQLite рдиреЗ рд╣рд╛ рдХреЛрд░реНрд╕ рд╢рд┐рдХрд╡рдгрд╛рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдЙрддреНрддрд░ рджрд┐рд▓реЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рджреБрд╕рд▒реНрдпрд╛ folder рдордзреВрди рдЪрд╛рд▓рд╡рдгреЗ тАФ script рдЖрдкрд▓реНрдпрд╛ files
db/рдЪреНрдпрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рд╢реЛрдзрддреЗ, рдкрдг рджрд╛рдЦрд╡рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ repo root рдордзреВрдирдЪ рдЪрд╛рд▓рд╡рд╛ school.dbрд╣рд╛рддрд╛рдиреЗ edit рдХрд░рдгреЗ рдЖрдгрд┐ рдкреБрдврдЪреНрдпрд╛ run рд▓рд╛ рддреЗ рдЧрдорд╛рд╡рдгреЗ тАФ рддреНрдпрд╛рдРрд╡рдЬреАschema.sql/seed.sqlрдмрджрд▓рд╛- "database" рдореНрд╣рдгрдЬреЗ "рдореЛрдард╛ server" рдЕрд╕реЗ рд╕рдордЬрдгреЗ тАФ SQLite рддреБрдордЪреНрдпрд╛ program рдЪреНрдпрд╛ рдЖрддрдЪ рдЪрд╛рд▓рддреЗ рдЖрдгрд┐ рдкреГрдереНрд╡реАрд╡рд░реАрд▓ рд╕рд░реНрд╡рд╛рдзрд┐рдХ deploy рдЭрд╛рд▓реЗрд▓рд╛ database рдЖрд╣реЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: "рд╣рд░рд╡рд▓реЗ", "рд╡рд┐рд╕рдВрдЧрдд" рдХрд┐рдВрд╡рд╛ "рд╣рд│реВ" рд╣реЗ рд╢рдмреНрдж рдЕрд╕рд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ incident рдореНрд╣рдгрдЬреЗ рддреАрдирдкреИрдХреА рдПрдХ рд╡рдЪрди рдореЛрдбрд▓реЗрд▓реЗ рдЕрд╕рддреЗ. рдХреЛрдгрддреЗ рд╡рдЪрди рдореЛрдбрд▓реЗ рддреЗ рдУрд│рдЦрдгреЗ рд╣реА рдкреНрд░рддреНрдпреЗрдХ database рдЪрд░реНрдЪреЗрдЪреА рдкрд╣рд┐рд▓реА рдкрд╛рдпрд░реА рдЖрд╣реЗ.
тПня╕П рдкреБрдвреЗ
рдиреЛрдВрджрд╡рд╣реА рдореНрд╣рдгрдЬреЗ рдирдХреНрдХреА рдХрд╛рдп? Tables, rows рдЖрдгрд┐ keys тАФ рдЖрдгрд┐ key рдХрдзреАрдЪ рд╢реВрдиреНрдпрд╛рдХрдбреЗ рдмреЛрдЯ рдХрд╛ рджрд╛рдЦрд╡реВ рд╢рдХрдд рдирд╛рд╣реА.
git checkout lesson-02-tables-rows-keys