Ачааллж байна...
Та "Өгөгдлийн сан ба SQL" сургалтыг дуусгалаа. Энэ хичээл шинэ сэдэв, шинэ тушаал авчрахгүй. Оронд нь гурван зүйл хийнэ: сургалтын эхэнд хаана байснаа, одоо хаана байгаагаа харьцуулна; энэ мэдлэгийг өдөр тутамдаа авч явах дадлуудыг нэгтгэнэ; эндээс цааш ямар замууд нээлттэйг харна.
Сургалтын хамгийн эхний хичээлийг санаарай. Тэр хичээл нэг энгийн санаагаар эхэлсэн: FastAPI сургалтад та өгөгдлийн сантай өдөр бүр ажилладаг байсан ч тэр яриаг хэзээ ч сонсож байгаагүй. SQLModel таны оронд SQL бичдэг орчуулагч байсан бөгөөд та түүний хэлж буй үг бүрт сохроор итгэдэг байсан. session.add(book) гэж бичихэд ном "хадгалагддаг" байсан — яаж, хаана, ямар дүрмээр гэдэг нь нууц байсан.
Одоо тэр нууц алга. session.add(book) ба session.commit() нь INSERT INTO books (...) VALUES (...) RETURNING id болон COMMIT гэдгийг та мэднэ. Тэр INSERT нь NOT NULL, CHECK, UNIQUE, FOREIGN KEY гэсэн дүрмүүдээр хамгаалагдсан гэдгийг, тэр COMMIT нь бүхэл байдлын баталгаа гэдгийг мэднэ. Хэрэв тэр хуудас удаан бол echo гаралтаас 1201 query-г, EXPLAIN ANALYZE-ээс Seq Scan-ийг олж чадна. Орчуулагч одоо таны ажилтан.
Шинэ хотод нүүж ирсэн хүнийг төсөөлөөрэй. Эхний долоо хоногт тэр зөвхөн таксигаар явдаг: хаяг хэлж, суугаад, хүрдэг. Хот түүний хувьд цэгүүдийн цуглуулга — гэр, ажил, дэлгүүр — хооронд нь юу байгааг мэдэхгүй. Хэдэн сарын дараа тэр хотыг явганаар туулж, автобусны чиглэл, богино зам, түгжрэлтэй уулзвар бүрийг мэддэг болно. Тэр одоо ч таксигаар явдаг — ихэнхдээ энэ хамгийн тохиромжтой. Харин такси буруу эргэвэл тэр анзаардаг, жолооч төөрвөл зам зааж өгч чаддаг, шаардлагатай үед өөрөө алхдаг. Хот өөрчлөгдөөгүй — түүний хотыг харах нүд өөрчлөгдсөн.
Сургалтыг Түвшин бүрээр эргэн харъя — гэхдээ сэдвийн жагсаалтаар биш, одоо юу хийж чадах болсноор нь.
Түвшин 1: SQL хэлтэй нүүр тулах. Та DB Browser for SQLite-д анхны SELECT-ээ бичсэн. Одоо та өгөгдлийн сангаас ямар ч асуултын хариуг асууж чадна: WHERE-ээр шүүх, LIKE-аар хайх, ORDER BY-гаар эрэмбэлэх. Хамгийн чухал нь та NULL-ийн үнэнийг мэднэ — = NULL хэзээ ч үнэн биш, NOT IN NULL-тэй хамт чимээгүй хоосон үр дүн өгдөг. Мөн WHERE-гүй UPDATE-ийн аюулыг хаягдах хуулбар дээр өөрийн нүдээр харсан бөгөөд "эхлээд SELECT, дараа нь UPDATE" дадал таны гарт суусан.
Түвшин 2: Schema зохион байгуулалт. Та хүснэгтийг зөвхөн өгөгдөл хадгалах сав биш, дүрмийн систем гэж харж сурсан. NOT NULL, UNIQUE, CHECK, DEFAULT, PRIMARY KEY, FOREIGN KEY — алдааг програм хүрэхээс өмнө өгөгдлийн сангийн хаалган дээр зогсоох хамгаалалтууд. Дулмаагийн loan_log дээр давхардал хэрхэн гурван төрлийн чимээгүй алдаа үүсгэдгийг харж, нэг-олон, олон-олон харилцааг зөв талд нь байрлуулж сурсан. Та одоо шинэ төслийн schema-г цаасан дээр зурж, хүснэгт бүр "нэг зүйлийн тухай" эсэхийг шалгаж чадна.
Түвшин 3: Хүчирхэг query. JOIN-оор хүснэгтүүдийг холбож, LEFT JOIN-оор хэзээ ч зээлээгүй гишүүдийг олж, GROUP BY ба HAVING-ээр тайлан гаргаж, subquery-гээр асуулт дотор асуулт тавьж сурсан. Мөн хурдны тухай анх удаа хэмжилтээр бодож эхэлсэн: нэг сая мөр дээр index хэрхэн SCAN-ийг SEARCH болгодгийг, WHERE дотор функц хэрхэн index-ийг алдгийг харсан. Таван тайлангийн query бүхий reports.sql — таны анхны бодит ажлын бүтээл.
Түвшин 4: PostgreSQL. Та файлаас server руу шилжсэн. PostgreSQL-ийг Windows дээр суулгаж, psql ба pgAdmin-оор удирдаж, SQLite-аас ялгаатай хатуу төрлүүд, IDENTITY, DATE, BOOLEAN-тэй ажилласан. Python-оос холбогдож, f-string injection-ийг өөрийн нүдээр харж, параметрээр хамгаалж сурсан. Connection pool, with блокийн баталгаа, idle-in-transaction-ийн аюулыг ойлгосон. Бат, Сараа хоёрын 30 000 төгрөг алга болохыг харж, транзакц, COMMIT, ROLLBACK, түгжээ, deadlock-ийн утгыг гүнзгий ойлгосон.
Түвшин 5: Мэргэжлийн дадал. Та өгөгдлийн сангийн бүтцийг кодтой хамт, түүхтэй, бүх орчинд ижил хэрэгжүүлэх аргыг — Alembic migration-ийг — эзэмшсэн, өгөгдөлтэй хүснэгтэд NOT NULL багана аюулгүй нэмэх гурван алхамыг хүртэл. ORM-ийн relationship, lazy loading, N+1-ийг хэмжиж засварлах, ORM ба цэвэр SQL-ийн хилийг тогтоох аргыг сурсан. Эцэст нь бүх зүйлийг Capstone-д нэгтгэсэн: migration-оор бүтээгдсэн schema, 30 000 зээлтэй өгөгдөл, туршигдсан backup, EXPLAIN ANALYZE-ээр хэмжигдэж partial index-ээр хурдассан тайлан, түгжээтэй транзакцаар хамгаалагдсан ном олгох үйлдэл.
Сургалтын туршид олон тушаал сурсан ч хамгийн удаан хадгалагдах нь тушаалууд биш, дадлууд. Эдгээрийг нэг газар цуглуулъя.
Өөрчлөхөөсөө өмнө харах. UPDATE эсвэл DELETE бичихээс өмнө ижил WHERE-тэй SELECT ажиллуулж, ямар мөрүүд хөндөгдөхийг хар. Migration ажиллуулахаас өмнө --sql-ээр SQL-ийг уншаад, "энэ бол миний хүссэн зүйл мөн үү" гэж асуу.
Дүрмийг өгөгдлийн санд тавих. Програмын код өөрчлөгддөг, олон програм нэг өгөгдлийн санд хандаж болно. NOT NULL, CHECK, FOREIGN KEY, UNIQUE нь ямар ч кодоос үл хамааран өгөгдлийг хамгаална.
Утга бүр параметрээр. Хэзээ ч хэрэглэгчийн өгөгдлийг SQL текстэд f-string-ээр бүү нийлүүл. Энэ дүрэмд онцгой тохиолдол байхгүй.
Таамаглахгүй, хэмжих. "Энэ хурдан байх ёстой" гэдэг нь хэмжилт биш. EXPLAIN ANALYZE, query тоологч, echo гаралт — тэдгээр бол таны хэмжүүрүүд. Бодит хэмжээний өгөгдөл дээр хэмж.
Бүхэл байдлыг транзакцаар. Хамтдаа үнэн байх ёстой өөрчлөлтүүд нэг транзакцад. Транзакцыг богино байлга. Хүлээлтийн хооронд түгжээ бүү барь.
Бүтэц migration-оор, өгөгдөл backup-аар. Бүтцийн өөрчлөлт бүр migration файлд, кодтой нэг commit-д. Backup хийх бүрт сэргээж турш — сэргээгдэхгүй backup бол backup биш.
Алдааны мессежийг унших. Сургалтын туршид бид алдаа бүрийг санаатайгаар үүсгэж, монгол хэл рүү орчуулж уншсан. PostgreSQL-ийн мессежүүд ихэвчлэн юу болсныг, хаана болсныг, заримдаа юу хийхийг ч (HINT) яг хэлдэг. Сандрахын оронд унш.
Энэ сургалт өгөгдлийн сангийн суурийг өгсөн. Түүний дээр хэд хэдэн зам нээгдэж байна — аль нь танд сонирхолтой байхаас хамаарна.
PostgreSQL-ийн гүнзгий боломжууд. Window function-ууд (ROW_NUMBER(), RANK(), SUM(...) OVER (...)) — GROUP BY-гаар мөрүүдийг нэгтгэлгүйгээр тэдгээрийн хооронд тооцоолол хийх, жишээлбэл "төрөл бүрийн хамгийн их зээлэгдсэн гурван ном." CTE (WITH ... ) — нарийн query-г нэртэй алхмуудад хуваах, Бүлэг 9-ийн FROM доторх subquery-г илүү уншигдахуйц болгох. JSONB — нэг баганад бүтэцтэй өгөгдөл хадгалж, түүнээс index-тэй хайх. Full-text search — Бүлэг 2-ын LIKE-аас хамаагүй ухаалаг хайлт. Бүгд эдгээр таны одоогийн мэдлэг дээр шууд тулгуурлана.
Гүйцэтгэл. Бүлэг 9 ба Capstone-ийн хэмжилтүүд эхлэл байсан. Олон баганат index, index-ийн баганын дараалал, covering index, query planner-ийн шийдвэрийг гүнзгий унших — өгөгдлийн сан өсөхөд эдгээр нь хуудас 5 секунд эсвэл 50 миллисекунд ачаалагдахыг шийддэг.
Өгөгдлийн сангийн удирдлага. Backup-ын стратеги (тогтмол backup, point-in-time recovery), хэрэглэгчийн эрх ба role-ууд (GRANT, REVOKE — програм бүрт зөвхөн хэрэгтэй эрхийг өгөх), replication, мониторинг. Энэ бол өгөгдлийн сангийн администраторын (DBA) зам.
Өгөгдлийн загварчлал. Бодит бизнесийн асуудлыг хүснэгтүүд болгон хувиргах нь өөрөө урлаг. Түвшин 2-ын гурван дүрэм суурь байсан — цаашид нормалчлалыг хэзээ зөрчих, түүх хадгалах (audit trail), олон түрээслэгчтэй системийн бүтэц гэх мэт сэдвүүд бий.
Эх сурвалжууд. PostgreSQL-ийн албан ёсны баримт бичиг (postgresql.org/docs) нь программ хангамжийн хамгийн сайн баримт бичгүүдийн нэг гэж тооцогддог — таны одоогийн мэдлэгээр та түүнийг шууд уншиж чадна. SQLAlchemy ба Alembic-ийн баримт бичиг ORM болон migration-ий гүнзгий сэдвүүдэд. Use The Index, Luke (use-the-index-luke.com) нь index ба гүйцэтгэлийн тухай үнэ төлбөргүй, маш сайн тайлбартай ном. Англи хэл дээрх эдгээр эх сурвалжийг уншихад сургалтын туршид техникийн нэр томъёог англиар хадгалсан нь яг энэ мөчид тус болно.
Хэрэв сонирхож байвал сургалтын хамгийн эхний хичээлүүдийн нэгийг нээж, тэнд бичсэн хамгийн анхны SELECT-ээ харж, түүнийг одоо бичих байсан шигээ — JOIN-тэй, GROUP BY-тэй, PostgreSQL дээр, EXPLAIN ANALYZE-тэй — дахин бичиж үзээрэй. Эсвэл өөрийн сонирхсон сэдвээр — хувийн номын сан, спортын тэмцээний үр дүн, өрхийн зардал — шинэ жижиг төсөл эхлүүлж, Capstone-ийн дарааллаар явж болно: цаасан дээрх schema, migration-ууд, seed, тайлангууд, backup. Эдгээр нь зөвхөн санал — та тэдгээрийг хэзээ, хийх эсэхийг өөрөө шийднэ.
Сургалтын дараах нийтлэг бүдрэлтүүдийг дурдъя.
ORM руу буцаж очоод SQL-ээ "мартах." Өдөр тутмын ажилд SQLModel хэрэглэх нь зөв. Гэвч echo-г хэзээ ч асаахгүй, EXPLAIN хэзээ ч ажиллуулахгүй байвал энэ сургалтын үнэ цэнэ аажмаар алга болно. Хаа нэгтээ дор хаяж сард нэг удаа орчуулагчийг сонс.
Жинхэнэ өгөгдөл дээр туршилт хийх. Сургалтын туршид бид хаягдах хуулбар, туршилтын сан (n1_demo, library_restore) үүсгэж ирсэн. Энэ дадлыг хадгал: шинэ санаа, эргэлзээтэй UPDATE, шинэ migration-ийг хэзээ ч эхлээд жинхэнэ хэрэглэгчдийн өгөгдөл дээр бүү турш.
Бүх зүйлийг нэг дор сурах гэж оролдох. Дээрх "Цааш хаашаа явах вэ" хэсэгт олон зам бий. Тэдгээрийг бүгдийг зэрэг биш, бодит төсөлд хэрэгтэй болох үед нэг нэгээр нь сурах нь хамгийн сайн тогтдог — энэ сургалтын бүлэг бүрийн нэгэн адил.
Энэ сургалтын туршид та нуугдмал орчуулагчийн хэлж байсан хэлийг эзэмшсэн. Түвшин 1-д асуулт тавьж, өгөгдөл өөрчилж; Түвшин 2-т дүрэмтэй, давхардалгүй бүтэц зохион байгуулж; Түвшин 3-т хүснэгтүүдийг холбож, тайлан гаргаж, хурдыг хэмжиж; Түвшин 4-т PostgreSQL server-тэй Python-оос аюулгүй ярьж, транзакцаар бүхэл байдлыг хамгаалж; Түвшин 5-д бүтцийг migration-оор удирдаж, ORM-ийг гүнзгий ойлгож, бүх зүйлийг бодит хэмжээний Capstone-д нэгтгэсэн. Өөрчлөхөөсөө өмнө харах, дүрмийг өгөгдлийн санд тавих, утга бүрийг параметрээр, таамаглахгүй хэмжих, транзакцыг богино, бүтцийг migration-оор, backup-ыг туршиж, алдааны мессежийг унших — эдгээр дадлууд таны цаашдын ажил бүрт хамт явна.
Баяр хүргэе. Таны бичих дараагийн програм — ямар ч хэлээр, ямар ч framework-ээр бичигдсэн бай — хаа нэгтээ өгөгдлийн сантай ярина. Одоо та тэр ярианы хоёр талыг хоёуланг нь ойлгоно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.