ЁЯЧДя╕П рдзрдбрд╛ 08 тАФ Data ownership: рд╕рд╛рдорд╛рдпрд┐рдХ рдХрдкрд╛рдЯ, рдПрдХ рдЦрд┐рдбрдХреА, рдХреА рдиреЛрдЯрд┐рд╢реАрдЪреА рдкреНрд░рдд
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 08 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-07-events-cqrs ┬╖ рдкреБрдврдЪрд╛: lesson-09-fitness-functions
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ07, рдЖрдгрд┐ рдмрд╣реБрддреЗрдХ рд▓реЛрдХ рд╡рд┐рд╕рд░рддрд╛рдд рддреА рдорд╛рд░реНрдЧрд┐рдХрд╛: data. рджреЛрди рд╡рд┐рднрд╛рдЧ code рдордзреНрдпреЗ рдкреВрд░реНрдгрдкрдгреЗ
рд╡реЗрдЧрд│реЗ рдЕрд╕реВрдирд╣реА рдПрдХрд╛рдЪ рд╕рд╛рдорд╛рдпрд┐рдХ table рдореБрд│реЗ рдПрдХрдореЗрдХрд╛рдВрдирд╛ рдЪрд┐рдХрдЯрд▓реЗрд▓реЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд. рджреБрд╕рд▒реНрдпрд╛ рд╡рд┐рднрд╛рдЧрд╛рдЪрд╛ data
рдорд┐рд│рд╡рдгреНрдпрд╛рдЪреЗ рддреАрди рдорд╛рд░реНрдЧ тАФ shared database, API, рдХрд┐рдВрд╡рд╛ events (рд╕реНрд╡рддрдГрдЪреА copy рдареЗрд╡рд╛) тАФ рдЖрдгрд┐
рдорд╛рд▓рдХ рд╡рд┐рднрд╛рдЧ рдЖрдкрд▓рд╛ data рдмрджрд▓рддреЛ рдХрд┐рдВрд╡рд╛ рдмрдВрдж рдкрдбрддреЛ рддреЗрд╡реНрд╣рд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреА рдХрд┐рдВрдордд рдХрд╛рдп. integration()
arch/models.py рдордзреНрдпреЗ рдЖрдгрд┐ data() arch/demo.py рдордзреНрдпреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Fee рдЪреНрдпрд╛ рдкрд╛рд╡рддреНрдпрд╛ рдЫрд╛рдкрд╛рдпрд▓рд╛ рд╣рд┐рд╢реЛрдм рд╡рд┐рднрд╛рдЧрд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рдЪреЗ рдирд╛рд╡ рд╣рд╡реЗ рдЕрд╕рддреЗ. ЁЯз╛ рддреАрди рдорд╛рд░реНрдЧ:
- рд╕рд╛рдорд╛рдпрд┐рдХ рдХрдкрд╛рдЯ. рд╣рд┐рд╢реЛрдм рд╡рд┐рднрд╛рдЧ admissions office рдордзреНрдпреЗ рдЬрд╛рддреЛ рдЖрдгрд┐ admissions рдЪреА рдиреЛрдВрджрд╡рд╣реА рдереЗрдЯ рд╡рд╛рдЪрддреЛ. рд╕реЛрдкреЗ! рдкрдг рдПрдХреЗ рджрд┐рд╡рд╢реА admissions "name" column рдЪреЗ рдирд╛рд╡ рдмрджрд▓реВрди "full name" рдХрд░рддреЗ. рд╣рд┐рд╢реЛрдм рд╡рд┐рднрд╛рдЧрд╛рдЪреНрдпрд╛ рдкрд╛рд╡рддреНрдпрд╛ рдореЛрдбрддрд╛рдд тАФ рдЖрдгрд┐ рд╣рд┐рд╢реЛрдм рд╡рд┐рднрд╛рдЧрд╛рдиреЗ рдХрд╛рд╣реАрдЪ рдЪреВрдХ рдХреЗрд▓реЗрд▓реА рдирд╕рддреЗ.
- рдЦрд┐рдбрдХреАрд╡рд░ рд╡рд┐рдЪрд╛рд░рд╛. рд╣рд┐рд╢реЛрдм рд╡рд┐рднрд╛рдЧ admissions рдЪреНрдпрд╛ рдЦрд┐рдбрдХреАрд╡рд░ рд╡рд┐рдЪрд╛рд░рддреЛ: "roll number 7 рдЪреЗ рдирд╛рд╡ рд╕рд╛рдВрдЧрд╛рд▓ рдХрд╛?" Admissions рдЖрдкрд▓реА рдиреЛрдВрджрд╡рд╣реА рд╣рд╡реА рддрд╢реА рдкреБрдиреНрд╣рд╛ рдорд╛рдВрдбреВ рд╢рдХрддреЗ; рдЦрд┐рдбрдХреАрд╡рд░рдЪреЗ рдЙрддреНрддрд░ рддреЗрдЪ рд░рд╛рд╣рддреЗ. рдкрдг admissions office рдмрдВрдж рдЕрд╕рд▓реЗ рдХреА рд╣рд┐рд╢реЛрдм рд╡рд┐рднрд╛рдЧрд╛рд▓рд╛ рдЙрддреНрддрд░ рдорд┐рд│рдд рдирд╛рд╣реА.
- рдиреЛрдЯрд┐рд╢реАрдЪреА рдкреНрд░рдд рдХрд░рд╛. Admissions рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдирд╛рд╡ рдмрджрд▓рд▓реЗ рдХреА рдПрдХ рд╕реВрдЪрдирд╛ рд▓рд╛рд╡рддреЗ. рд╣рд┐рд╢реЛрдм рд╡рд┐рднрд╛рдЧ рддреА рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдЫреЛрдЯреНрдпрд╛ рд╡рд╣реАрдд рдЙрддрд░рд╡реВрди рдШреЗрддреЛ. Admissions рдмрдВрдж рдЕрд╕рд▓реЗ рддрд░реА тАФ рд╣рд┐рд╢реЛрдм рд╡рд┐рднрд╛рдЧрд╛рдХрдбреЗ рдирд╛рд╡реЗ рдЕрд╕рддрд╛рдд. рдкрдг рдмрджрд▓ рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рд▓рдЧреЗрдЪ, рд╣рд┐рд╢реЛрдм рд╡рд┐рднрд╛рдЧрд╛рдЪреА рд╡рд╣реА рдереЛрдбреА рдорд╛рдЧреЗ рдЕрд╕рддреЗ.
рдХреЛрдгрддрд╛рдЪ рдорд╛рд░реНрдЧ рдлреБрдХрдЯ рдирд╛рд╣реА. рдХреЛрдгрддреА рдЕрдбрдЪрдг рддреБрдореНрд╣рд╛рд▓рд╛ рдЪрд╛рд▓реЗрд▓ рддреЗ рддреБрдореНрд╣реА рдирд┐рд╡рдбрддрд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
subgraph shared["ЁЯЧДя╕П shared database"]
fee1["ЁЯТ░ fees"] -->|"SELECT name FROM students"| tbl[("admissions table")]
gr1["ЁЯУЭ grades"] -->|"SELECT name тАж"| tbl
end
subgraph api["ЁЯкЯ API"]
fee2["ЁЯТ░ fees"] -->|"GET /students/7"| adm2["ЁЯЧВя╕П admissions"]
end
subgraph ev["ЁЯУМ events"]
adm3["ЁЯЧВя╕П admissions"] -->|"StudentRenamed"| copy[("fees' own copy")]
end
r["rename at tick 5, down ticks 10тАУ12:<br/>shared DB 15 failed, 2 teams broken ┬╖ API 3 failed ┬╖ events 2 stale"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/software-architecture/lesson-diagrams.html#l08
тЭУ рдХрд╛рдп
- Data ownership тАФ data рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧрд╛рдЪрд╛ рдПрдХрдЪ рдорд╛рд▓рдХ рд╡рд┐рднрд╛рдЧ рдЕрд╕рддреЛ, рдЬреЛ рддреЛ рд▓рд┐рд╣рд┐рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рдЖрдХрд╛рд░ рдард░рд╡рддреЛ. рдЗрддрд░ рддреЛ рдлрдХреНрдд рдорд╛рд▓рдХ рдЬреЗ publish рдХрд░рддреЛ рддреНрдпрд╛рддреВрдирдЪ рд╡рд╛рдЪреВ рд╢рдХрддрд╛рдд.
- Shared database (integration database) тАФ рдЕрдиреЗрдХ applications рддреНрдпрд╛рдЪ tables рдордзреНрдпреЗ рд╡рд╛рдЪрддрд╛рдд рдЖрдгрд┐ рд▓рд┐рд╣рд┐рддрд╛рдд. Run time рд▓рд╛ calls рдирд╛рд╣реАрдд, рдкрдг рдкреНрд░рддреНрдпреЗрдХ table рдЕрд╕рд╛ рдХрд░рд╛рд░ рдмрдирддреЛ рдЬреНрдпрд╛рд▓рд╛ рдХреЛрдгреАрдЪ рдорд╛рдиреНрдпрддрд╛ рджрд┐рд▓реЗрд▓реА рдирд╕рддреЗ: рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдЪрдХ рд╢реЛрдзрд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдорд╛рд▓рдХ рдПрдЦрд╛рджреНрдпрд╛ column рдЪреЗ рдирд╛рд╡ рдмрджрд▓реВ рд╢рдХрдд рдирд╛рд╣реА.
- Database per service тАФ рдкреНрд░рддреНрдпреЗрдХ service рдЪреЗ tables рдЦрд╛рдЬрдЧреА рдЕрд╕рддрд╛рдд (Chris Richardson рдпрд╛рдВрдЪреНрдпрд╛ microservices.io рд╡рд░ рд╣рд╛ рдПрдХ pattern рдореНрд╣рдгреВрди рджрд┐рд▓рд╛ рдЖрд╣реЗ). Database рд╣реА implementation рдЪреА рдмрд╛рдм рдЕрд╕рддреЗ.
- API integration тАФ рдорд╛рд▓рдХ рдкреНрд░рдХрд╛рд╢рд┐рдд interface рдордзреВрди requests рдирд╛ рдЙрддреНрддрд░ рджреЗрддреЛ. рдЖрддрд▓реЗ tables рдореЛрдХрд│реЗрдкрдгрд╛рдиреЗ рдмрджрд▓реВ рд╢рдХрддрд╛рдд; API рд▓рд╛ version рдЕрд╕рддреЗ. рдЖрддрд╛ рд╡рд╛рдЪрдХ рдорд╛рд▓рдХ рдЪрд╛рд▓реВ рдЕрд╕рдгреНрдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЛ (runtime coupling) тАФ рдзрдбрд╛ 06 рдордзрд▓рд╛ hop.
- Event-based integration (event-carried state transfer) тАФ рдорд╛рд▓рдХ рдмрджрд▓ publish рдХрд░рддреЛ; рд╡рд╛рдЪрдХ рд╕реНрд╡рддрдГрдЪреА copy рдареЗрд╡рддрд╛рдд. рдорд╛рд▓рдХ рдмрдВрдж рдЕрд╕рддрд╛рдирд╛рд╣реА рдЪрд╛рд▓рддреЗ; event process рд╡реНрд╣рд╛рдпрд▓рд╛ рд▓рд╛рдЧрдгрд╛рд▒реНрдпрд╛ рд╡реЗрд│реЗрдкрд░реНрдпрдВрдд copy stale рдЕрд╕рддреЗ (lag).
- Change data capture (CDC) тАФ рдорд╛рд▓рдХрд╛рдЪреНрдпрд╛ database рдЪрд╛ log рд╡рд╛рдЪреВрди row рдордзреАрд▓ рдмрджрд▓рд╛рдВрдЪреЗ events рдмрдирд╡рдгреЗ (PostgreSQL, MySQL рдЖрдгрд┐ рдЗрддрд░рд╛рдВрд╕рд╛рдареА Debezium рд╣реЗ рдХрд░рддреЗ). рд╕реЛрдпреАрдЪреЗ, рдкрдг рдордЧ events table рдЪреЗрдЪ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЕрд╕рддрд╛рдд, рдореНрд╣рдгреВрди рддреНрдпрд╛рд╡рд░ рдПрдХ рд╕реНрдерд┐рд░ event рдЖрдХрд╛рд░ publish рдХрд░рд╛.
- Schema coupling рд╡рд┐рд░реБрджреНрдз runtime coupling тАФ shared tables рдЯреАрдореНрд╕рдирд╛ design time рд▓рд╛ рдЬреЛрдбрддрд╛рдд; synchronous calls рддреНрдпрд╛рдВрдирд╛ run time рд▓рд╛ рдЬреЛрдбрддрд╛рдд; copies рджреЛрдиреНрд╣реАрдВрдЪреНрдпрд╛ рдмрджрд▓реНрдпрд╛рдд staleness рдШреЗрддрд╛рдд.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг shared table рд╣реА рд╕рд░реНрд╡рд╛рдд рд░реБрдВрдж рдорд╛рд░реНрдЧрд┐рдХрд╛ рдЖрд╣реЗ тАФ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдЪрдХ рдорд╛рд▓рдХрд╛рдЪреЗ рдЦрд╛рдЬрдЧреА model import рдХрд░рддреЛ, рдЖрдгрд┐ рдХреЛрдгрддрд╛рд╣реА import checker рддреЗ рдкрд╛рд╣реВ рд╢рдХрдд рдирд╛рд╣реА. "Microservices" рдордзреНрдпреЗ рдХреЗрд▓реЗрд▓реА рд╡рд┐рднрд╛рдЧрдгреА рд╢реЗрд╡рдЯреА distributed monolith рдирд┐рдШрдгреНрдпрд╛рдЪреЗ (рдзрдбрд╛ 06) рд╣реЗрдЪ рд╕рд░реНрд╡рд╛рдд рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдг рдЖрд╣реЗ. рд╣реЗрддреБрдкреВрд░реНрд╡рдХ ownership рдирд┐рд╡рдбрд▓реНрдпрд╛рдиреЗ рдХреЛрдгрд╛рд▓рд╛ meeting рд╢рд┐рд╡рд╛рдп рдХрд╛рдп рдмрджрд▓рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рдЖрд╣реЗ рд╣реЗ рдард░рддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
arch/models.py рдордзрд▓реЗ integration(style, ticks, rename_at, down, lag, readers)
рдПрдХ рд╢рд┐рдХрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ model рдЪрд╛рд▓рд╡рддреЗ: fees 20 ticks рд╕рд╛рдареА рдкреНрд░рддреНрдпреЗрдХ tick рд▓рд╛ рдПрдХрджрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдЪреЗ рдирд╛рд╡
рд╡рд╛рдЪрддреЗ; tick 5 рд▓рд╛ admissions name рдЪреЗ рдирд╛рд╡ рдмрджрд▓реВрди full_name рдХрд░рддреЗ; ticks 10тАУ12 рдордзреНрдпреЗ admissions
рдмрдВрдж рдЕрд╕рддреЗ. Shared database: рдирд╛рд╡ рдмрджрд▓рд▓реНрдпрд╛рдирдВрддрд░рдЪреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдЪрди рдЕрдкрдпрд╢реА рд╣реЛрддреЗ (рд╡рд╛рдЪрдХрд╛рдВрдЪреЗ SQL рдЕрдЬреВрдирд╣реА
name рдореНрд╣рдгрддреЗ) рдЖрдгрд┐ readers рдЯреАрдореНрд╕рдЪрд╛ code рдореЛрдбрддреЛ. API: admissions рдмрдВрдж рдЕрд╕рддрд╛рдирд╛рдЪ рд╡рд╛рдЪрди рдЕрдкрдпрд╢реА рд╣реЛрддреЗ.
Events: рдХрд╛рд╣реАрдЪ рдЕрдкрдпрд╢реА рд╣реЛрдд рдирд╛рд╣реА; рдмрджрд▓рд╛рдирдВрддрд░ lag ticks рдкрд░реНрдпрдВрдд рд╡рд╛рдЪрди stale рдЕрд╕рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 arch/demo.py data
python3 - <<'EOF'
import sys; sys.path.insert(0, "arch"); from models import integration
print("API, admissions down 10 ticks тЖТ", integration("API", down=(10, 20)))
print("events, 5 ticks of lag тЖТ", integration("events", lag=5))
print("shared DB, 5 teams read it тЖТ", integration("shared database", readers=5))
print("shared DB, rename at tick 19 тЖТ", integration("shared database", rename_at=19))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
data рд╣реЗ рдЫрд╛рдкрддреЗ:
тФАтФА fees needs a student's name 20 times; at tick 5 admissions renames name тЖТ full_name; ticks 10тАУ12 admissions is down
shared database failed reads 15 ┬╖ stale reads 0 ┬╖ other teams' code broken by the rename 2
API failed reads 3 ┬╖ stale reads 0 ┬╖ other teams' code broken by the rename 0
events failed reads 0 ┬╖ stale reads 2 ┬╖ other teams' code broken by the rename 0
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:
API, admissions down 10 ticks тЖТ {'failed': 10, 'stale': 0, 'broken': 0}
events, 5 ticks of lag тЖТ {'failed': 0, 'stale': 5, 'broken': 0}
shared DB, 5 teams read it тЖТ {'failed': 15, 'stale': 0, 'broken': 5}
shared DB, rename at tick 19 тЖТ {'failed': 1, 'stale': 0, 'broken': 2}
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдкреНрд░рддреНрдпреЗрдХ рд╢реИрд▓реА рдЖрдкрд▓реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рдЕрдкрдпрд╢реА рд╣реЛрддреЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ knob рдлрдХреНрдд рдЖрдкрд▓реАрдЪ рдХрд┐рдВрдордд рд╣рд▓рд╡рддреЛ. Admissions рдмрдВрдж рдЖрд╣реЗ рдпрд╛рдЪреА shared database рд▓рд╛ рдкрд░реНрд╡рд╛ рдирд╡реНрд╣рддреА тАФ рдкрдг рдПрдХрд╛ рдирд╛рд╡-рдмрджрд▓рд╛рдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдЪрдХ рдореЛрдбрд▓рд╛ (2, рдордЧ 5 рдЯреАрдореНрд╕), рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЯреАрдо рдЖрдкрд▓реЗ SQL рджреБрд░реБрд╕реНрдд рдХрд░реЗрдкрд░реНрдпрдВрдд рддреЗ рдЕрдкрдпрд╢реА рд╣реЛрдд рд░рд╛рд╣рддреЗ. API рдирд╛рд╡-рдмрджрд▓рд╛рддреВрди рдЯрд┐рдХрд▓реЗ рдЖрдгрд┐ рдорд╛рд▓рдХ рдмрдВрдж рдЕрд╕рддрд╛рдирд╛ рдиреЗрдордХреЗ рддреЗрд╡рдвреЗрдЪ рдЕрдкрдпрд╢реА рдЭрд╛рд▓реЗ (3 ticks, рдордЧ 10). Events рдХрдзреАрдЪ рдЕрдкрдпрд╢реА рдЭрд╛рд▓реЗ рдирд╛рд╣реАрдд, рдкрдг lag рдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ tick рдореНрд╣рдгрдЬреЗ рдПрдХ stale рд╡рд╛рдЪрди (2, рдордЧ 5). рдХреЛрдгрддрд╛рд╣реА "рдмрд░реЛрдмрд░" рдирд╛рд╣реА: fee рдкрд╛рд╡рддреАрд▓рд╛ 2 ticks рдЬреБрдиреЗ рдирд╛рд╡ рдЪрд╛рд▓реВ рд╢рдХрддреЗ; payment balance рд▓рд╛ рдмрд╣реБрдзрд╛ рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- "рдЖрдореНрд╣реА services рдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реЗ" рдкрдг рдкреНрд░рддреНрдпреЗрдХ service рдЕрдЬреВрдирд╣реА рддреЗрдЪ tables рд╡рд╛рдЪрддреЗ
- рджреЛрди рд╡рд┐рднрд╛рдЧ рд▓рд┐рд╣рд┐рддрд╛рдд рдЕрд╕рд╛ рдПрдХ table тАФ рдордЧ рддреНрдпрд╛рдЪреНрдпрд╛ рдирд┐рдпрдорд╛рдВрдЪрд╛ рдорд╛рд▓рдХ рдХреЛрдгреАрдЪ рдирд╕рддреЛ
- CDC row рдмрджрд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд░рд╛рд░ рдореНрд╣рдгреВрди publish рдХрд░рдгреЗ тАФ table рдЪрд╛ рдЖрдХрд╛рд░ рдмрд╛рд╣реЗрд░ рдЧрд│рддреЛ
- local copy рд╣реЛрдК рд╢рдХрдгрд╛рд▒реНрдпрд╛ data рд╕рд╛рдареА synchronous API calls (рд╡рд┐рдирд╛рдХрд╛рд░рдг runtime coupling)
- backfill, replay рдХрд┐рдВрд╡рд╛ "рдХрд┐рддреА stale рдореНрд╣рдгрдЬреЗ рдЬрд╛рд╕реНрдд stale" рдпрд╛рдЪреА рдХреЛрдгрддреАрд╣реА рдпреЛрдЬрдирд╛ рдирд╕рд▓реЗрд▓реНрдпрд╛ local copies
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ project рд╡рд░ тАФ рдПрдХрдЪ PostgreSQL server рдЕрд╕рддрд╛рдирд╛рд╣реА рддреБрдореНрд╣реА ownership рдЦрд░реА рдХрд░реВ рд╢рдХрддрд╛: рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рднрд╛рдЧрд╛рд╕рд╛рдареА рдПрдХ schema, рдЖрдгрд┐ рдЗрддрд░ рдлрдХреНрдд рд╡рд╛рдЪреВ рд╢рдХрддреАрд▓ рдЕрд╕реЗ рдПрдХрдЪ versioned view:
CREATE SCHEMA admissions;
CREATE TABLE admissions.students (form_no int PRIMARY KEY, full_name text, status text);
CREATE VIEW admissions.students_v1 AS
SELECT form_no, full_name AS name FROM admissions.students; -- the published contract
REVOKE ALL ON ALL TABLES IN SCHEMA admissions FROM fees_app;
GRANT USAGE ON SCHEMA admissions TO fees_app;
GRANT SELECT ON admissions.students_v1 TO fees_app;
рдЖрддрд╛ admissions рдЖрдкрд▓реНрдпрд╛ column рдЪреЗ рдирд╛рд╡ рдмрджрд▓реВ рд╢рдХрддреЗ рдЖрдгрд┐ view рдордзрд▓реЗ name рддрд╕реЗрдЪ рдареЗрд╡реВ рд╢рдХрддреЗ тАФ lab рдордзреНрдпреЗ
2 рдЯреАрдореНрд╕ рдореЛрдбрдгрд╛рд░рд╛ рдирд╛рд╡-рдмрджрд▓ рдЖрддрд╛ рдХреЛрдгрд╛рд▓рд╛рдЪ рдореЛрдбрдд рдирд╛рд╣реА. рд▓рд┐рд╣реВрди рдареЗрд╡рд▓реЗрд▓рд╛ API рдХрд░рд╛рд░ (OpenAPI) HTTP рд╕рд╛рдареА рд╣реЗрдЪ
рдХрд╛рдо рдХрд░рддреЛ:
paths:
/students/{roll_no}:
get:
responses:
"200":
content:
application/json:
schema: { type: object, properties: { roll_no: { type: integer }, name: { type: string } } }
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдкреНрд░рддреНрдпреЗрдХ table рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рдПрдХрдЪ рдорд╛рд▓рдХ рдпрд╛рдВрдЪреА рдпрд╛рджреА рдХрд░рд╛. рджреЛрди рд▓рд┐рд╣рд┐рдгрд╛рд░реЗ рдЕрд╕рд▓реЗрд▓рд╛, рдХрд┐рдВрд╡рд╛ рдорд╛рд▓рдХ рд╡рд┐рднрд╛рдЧрд╛рдмрд╛рд╣реЗрд░ рд╡рд╛рдЪрдХ рдЕрд╕рд▓реЗрд▓рд╛ рдХреЛрдгрддрд╛рд╣реА table рд╣реА рд▓рдкрд▓реЗрд▓реА рдорд╛рд░реНрдЧрд┐рдХрд╛ рдЖрд╣реЗ тАФ рддреНрдпрд╛рд▓рд╛ рд╣реЗрддреБрдкреВрд░реНрд╡рдХ view, API рдХрд┐рдВрд╡рд╛ event рджреНрдпрд╛.
тПня╕П рдкреБрдвреЗ
рдЖрддрд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдирд┐рдпрдо рдорд╛рд╣реАрдд рдЖрд╣реЗрдд: cycles рдирд╛рд╣реАрдд, arrows рдЖрддрд▓реНрдпрд╛ рджрд┐рд╢реЗрдиреЗ, рд╡рд┐рднрд╛рдЧ рд╡реЗрдЧрд│реЗ, data рд▓рд╛ рдорд╛рд▓рдХ. рд╢реБрдХреНрд░рд╡рд╛рд░реА рджреБрдкрд╛рд░реА рддреЗ рдХреЛрдг рддрдкрд╛рд╕рдгрд╛рд░? Fitness functions тАФ CI рдордзреАрд▓ architecture tests.
git checkout lesson-09-fitness-functions