ЁЯПл The SchoolтА║ЁЯЧДя╕П DatabasesтА║ЁЯЧДя╕П рдзрдбрд╛ 01 тАФ database рдХрд╛: рд░реЗрдХреЙрд░реНрдб рд░реВрдо
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯЧДя╕П рдзрдбрд╛ 01 тАФ database рдХрд╛: рд░реЗрдХреЙрд░реНрдб рд░реВрдо

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-tables-rows-keys


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

database рдХреЛрдгрддрд╛ рдкреНрд░рд╢реНрди рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗрдд тАФ рдЖрдгрд┐ рддреА рддреАрди рд╡рдЪрдиреЗ (рдЯрд┐рдХрд╛рдК, рд╕рд╛рдорд╛рдпрд┐рдХ, рдЙрддреНрддрд░ рджреЗрдгрд╛рд░реА) рдЬреА рдХреЛрд░реНрд╕рдЪреНрдпрд╛ рдкреБрдврдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ design рдирд┐рд░реНрдгрдпрд╛рдЪреЗ рдХрд╛рд░рдг рд╕рд╛рдВрдЧрддрд╛рдд. рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рд▓ рдЕрд╢рд╛ рдЦрд▒реНрдпрд╛ files:

ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЖрдзреА: рддреБрдореНрд╣рд╛рд▓рд╛ Python 3 рд╣рд╡реЗ тАФ рддреНрдпрд╛рдЪреЗ built-in sqlite3 module рд╣реАрдЪ рд╕рдВрдкреВрд░реНрдг рд░реЗрдХреЙрд░реНрдб рд░реВрдо рдЖрд╣реЗ; server рдирд╛рд╣реА, Docker рдирд╛рд╣реА, cloud рдирд╛рд╣реА. Postgres рдЖрдгрд┐ MySQL рдордзреНрдпреЗ рдХрд▓реНрдкрдирд╛ рддреНрдпрд╛рдЪ рдЖрд╣реЗрдд; рдЬрд┐рдереЗ рдлрд░рдХ рдЖрд╣реЗ рддрд┐рдереЗ рдзрдбреЗ рддрд╕реЗ рд╕рд╛рдВрдЧрддрд╛рдд. рдЪрд╛рдВрдЧрд▓реЗ рд╢реЗрдЬрд╛рд░реА: API рд╢рд╛рд│рд╛ (рдпрд╛ рдЦреЛрд▓реАрд╕рдореЛрд░рдЪрд╛ counter) рдЖрдгрд┐ VectorDB рд╢рд╛рд│рд╛ (рд╢реЗрдЬрд╛рд░рдЪрд╛ рдЕрд░реНрдерд╛рдЪрд╛ рд╣реЙрд▓).

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рд╢рд╛рд│рд╛ рдЖрдкрд▓реНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдмрджреНрджрд▓рдЪреЗ рд╕рддреНрдп рдХреБрдареЗ рдареЗрд╡рддреЗ? рдЬреБрдиреНрдпрд╛ рд╡рд╛рдИрдЯ рджрд┐рд╡рд╕рд╛рдВрдд: рдЪрд┐рдХрдЯ рдЪрд┐рдареНрдареНрдпрд╛ рдЖрдгрд┐ spreadsheets ЁЯУЭ. рдХреНрд░реАрдбрд╛ рд╢рд┐рдХреНрд╖рд┐рдХреЗрдХрдбреЗ рдПрдХ рдпрд╛рджреА рд╣реЛрддреА, office рдХрдбреЗ рджреБрд╕рд░реА, canteen app рдЪреА рд╕реНрд╡рддрдГрдЪреА file. рддреАрди рдпрд╛рджреНрдпрд╛, рдХрддрд░рд┐рдирд╛рдЪреНрдпрд╛ рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рддреАрди рдЖрд╡реГрддреНрддреНрдпрд╛. office рдЪрд╛ laptop рдПрдХрд╛ рд╢реБрдХреНрд░рд╡рд╛рд░реА рдмрдВрдж рдкрдбрд▓рд╛ рдЖрдгрд┐ grades рд╕реЛрдмрдд рдШреЗрдКрди рдЧреЗрд▓рд╛. рдЖрдгрд┐ рдПрдХ рд╕рд╛рдзрд╛ рдкреНрд░рд╢реНрди тАФ "maths рдордзреНрдпреЗ A рдорд┐рд│рд╛рд▓реЗрд▓реЗ 3A рдЪреЗ рд╕рд░реНрд╡ рд╡рд┐рджреНрдпрд╛рд░реНрдереА" тАФ рддреАрди files рдЖрдгрд┐ calculator рдЙрдШрдбрд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдХреЛрдгрд╛рд▓рд╛рдЪ рд╕реЛрдбрд╡рддрд╛ рдпреЗрдд рдирд╡реНрд╣рддрд╛.

рдореНрд╣рдгреВрди рд╢рд╛рд│реЗрдиреЗ рдПрдХ рд░реЗрдХреЙрд░реНрдб рд░реВрдо ЁЯЧДя╕П рдмрд╛рдВрдзрд▓реА: рдПрдХрдЪ рдЬрд╛рдЧрд╛, рдПрдХрд╛ рджрдкреНрддрд░рджрд╛рд░рд╛рдХрдбреВрди рдЪрд╛рд▓рд╡рд▓реА рдЬрд╛рдгрд╛рд░реА, рддреАрди рд╡рдЪрдирд╛рдВрд╕рд╣:

  1. рдЯрд┐рдХрд╛рдК тАФ рдЪрд┐рдХрдЯ рдЪрд┐рдареНрдареАрд╡рд░ рдирд╡реНрд╣реЗ, рддрд░ рдХрдкрд╛рдЯрд╛рддрд▓реНрдпрд╛ рдмрд╛рдВрдзрд▓реЗрд▓реНрдпрд╛ рдиреЛрдВрджрд╡рд╣реНрдпрд╛рдВрдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ. laptop рдмрдВрдж рдкрдбрддреЛ; рдиреЛрдВрджрд╡рд╣реНрдпрд╛ рд░рд╛рд╣рддрд╛рдд.
  2. рд╕рд╛рдорд╛рдпрд┐рдХ тАФ рдкреНрд░рддреНрдпреЗрдХ clerk, app рдЖрдгрд┐ рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рддреНрдпрд╛рдЪ рдиреЛрдВрджрд╡рд╣реНрдпрд╛ рдкрд╛рд╣рддрд╛рдд, рдЖрдгрд┐ рдПрдХрд╛рдЪ рд╡реЗрд│реА рд▓рд┐рд╣рд┐рдгрд╛рд░реЗ рджреЛрди clerks рдкрд╛рди рдлрд╛рдбрдгрд╛рд░ рдирд╛рд╣реАрдд рдпрд╛рдЪреА рджрдкреНрддрд░рджрд╛рд░ рдХрд╛рд│рдЬреА рдШреЗрддреЛ (рдзрдбрд╛ 07).
  3. рдЙрддреНрддрд░ рджреЗрдгрд╛рд░реА тАФ рддреБрдореНрд╣реА рдкреНрд░рдорд╛рдгрд┐рдд рдкрджреНрдзрддреАрдиреЗ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддрд╛ ("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

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдХрд╛рд░рдг "рдлрдХреНрдд 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 рдиреЗ рд╣рд╛ рдХреЛрд░реНрд╕ рд╢рд┐рдХрд╡рдгрд╛рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдЙрддреНрддрд░ рджрд┐рд▓реЗ.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: "рд╣рд░рд╡рд▓реЗ", "рд╡рд┐рд╕рдВрдЧрдд" рдХрд┐рдВрд╡рд╛ "рд╣рд│реВ" рд╣реЗ рд╢рдмреНрдж рдЕрд╕рд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ incident рдореНрд╣рдгрдЬреЗ рддреАрдирдкреИрдХреА рдПрдХ рд╡рдЪрди рдореЛрдбрд▓реЗрд▓реЗ рдЕрд╕рддреЗ. рдХреЛрдгрддреЗ рд╡рдЪрди рдореЛрдбрд▓реЗ рддреЗ рдУрд│рдЦрдгреЗ рд╣реА рдкреНрд░рддреНрдпреЗрдХ database рдЪрд░реНрдЪреЗрдЪреА рдкрд╣рд┐рд▓реА рдкрд╛рдпрд░реА рдЖрд╣реЗ.

тПня╕П рдкреБрдвреЗ

рдиреЛрдВрджрд╡рд╣реА рдореНрд╣рдгрдЬреЗ рдирдХреНрдХреА рдХрд╛рдп? Tables, rows рдЖрдгрд┐ keys тАФ рдЖрдгрд┐ key рдХрдзреАрдЪ рд╢реВрдиреНрдпрд╛рдХрдбреЗ рдмреЛрдЯ рдХрд╛ рджрд╛рдЦрд╡реВ рд╢рдХрдд рдирд╛рд╣реА.

git checkout lesson-02-tables-rows-keys

ЁЯЧДя╕П Lesson 01 тАФ Why databases: the record room

ЁЯУН You are here: Lesson 01 of 18 ┬╖ Next: lesson-02-tables-rows-keys


ЁЯУж What's in this branch

The problem databases exist to solve тАФ and the three promises (durable, shared, answerable) that explain every design choice in the rest of the course. Real files you will use all the way through:

ЁЯОТ Before you start: you need Python 3 тАФ its built-in sqlite3 module is the whole record room; no server, no Docker, no cloud. The ideas are the same in Postgres and MySQL; the lessons say where they differ. Good neighbours: the API school (the counter in front of this room) and the VectorDB school (the meaning hall next door).

ЁЯзТ Explain like I'm 5

Where does the school keep the truth about its students? In the bad old days: sticky notes and spreadsheets ЁЯУЭ. The sports teacher had a list, the office had another, the canteen app kept its own file. Three lists, three versions of Katrina's class. The office laptop died on a Friday and took the grades with it. And nobody could answer a simple question тАФ "every 3A student with an A in maths" тАФ without opening three files and a calculator.

So the school built a record room ЁЯЧДя╕П: one place, run by an archivist, with three promises:

  1. Durable тАФ written into bound registers on the shelf, not on a sticky note. The laptop dies; the registers stay.
  2. Shared тАФ every clerk, app and teacher consults the same registers, and the archivist makes sure two clerks writing at once do not tear a page (lesson 07).
  3. Answerable тАФ you ask a question in a standard way ("every 3A student with an A in maths") and the archivist finds it тАФ quickly, with a card catalogue (lesson 06).

That record room is a database. The registers are tables, the question language is SQL, and the archivist is the database engine.

ЁЯЧ║я╕П Diagram

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

тЭУ What

ЁЯдФ Why

Because "just keep it in a file" fails on all three promises at once, and each failure is expensive: lost data, two versions of the truth, and questions nobody can answer. Every scaling, backup and modelling lesson that follows is one of the three promises kept under pressure.

ЁЯФз How (in this repo)

python3 db/demo.py builds db/school.db from schema.sql + seed.sql and runs every section of the course. Today you only run it and read.

ЁЯзк Try it (60 seconds тАФ the whole course, live)

python3 db/demo.py

You should see, trimmed:

ЁЯЧДя╕П  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

тЬЕ Verify тАФ what you should see

The script ends with тЬЕ done; db/school.db exists (ls -la db/); running it again rebuilds the room from scratch (it deletes and recreates the file тАФ that is on purpose while learning).

ЁЯПБ What you just proved

A real database needs nothing installed: one schema file, one seed file, and Python's built-in SQLite answered every question this course will teach.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: every incident with the words "lost", "inconsistent" or "slow" in it is one of the three promises broken. Naming which one is the first step of every database conversation.

тПня╕П Next

What exactly is a register? Tables, rows and keys тАФ and why a key can never point nowhere.

git checkout lesson-02-tables-rows-keys
тЖР Course homeall lessonsNext тЖТtables rows keys

This page is the lesson's README from the lesson-01-why-databases branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.