Ачааллж байна...
Түвшин 4-т тавтай морилно уу. Өнгөрсөн гурван түвшинд та SQL хэлийг эзэмшиж, өгөгдлийн санг зохион байгуулж, хүчирхэг тайлангийн query-нүүд бичиж сурсан — бүгдийг нь SQLite дээр. Бүлэг 1-д бид энэ сонголтыг санаатайгаар хийсэн: SQLite нь server суулгах, нууц үг тохируулах ачаалалгүйгээр SQL хэлийг хамгийн цэвэр орчинд сурах боломж олгодог. Тэр үед “SQL танд айдас төрүүлэхээ больсон үед PostgreSQL руу шилжинэ” гэж хэлсэн. Тэр цаг ирлээ.
Энэ хичээлд бид юу ч суулгахгүй, нэг ч query бичихгүй. Үүний оронд нэг суурь асуултад хариулна: SQLite ажиллаж байхад PostgreSQL яагаад хэрэгтэй вэ? Хариулт нь хоёр өгөгдлийн сангийн ялгаатай бүтцэд оршдог — нэг нь файл, нөгөө нь server. Энэ ялгааг ойлгосноор хэзээ алийг нь сонгох, яагаад таны FastAPI сургалтын төсөл шиг вэб програмууд бараг үргэлж server өгөгдлийн сан ашигладгийг мэдэх болно.
Эхлээд нэг тайвшруулах үнэн: таны сурсан SQL бараг бүхэлдээ PostgreSQL дээр ажиллана. SELECT, WHERE, JOIN, GROUP BY, subquery — бүгд ижил. Ялгаа нь хэлэнд биш, хэлийг сонсож буй "хүн"-ий зан чанарт байна. Бид энэ сургалтын турш “SQLite үүнийг зөвшөөрдөг, PostgreSQL зөвшөөрдөггүй” гэсэн тэмдэглэлүүдийг олон удаа хийсэн — тэдгээр нь энэ шилжилтэд таныг бэлтгэж байсан.
Бүлэг 1-д SQLite-ийг хувийн дэвтэртэй зүйрлэсэн: та түүнийг өөрийн ширээн дээр нээж, хүссэн үедээ бичдэг. Дэвтэр нэг газар, нэг хүний гарт байдаг. Хэрэв хамт олон тань ч бичих шаардлагатай бол тэд таны ширээн дээр ирж, ээлжээ хүлээх ёстой — нэг үзэг, нэг дэвтэр.
PostgreSQL бол архивын алба юм. Архив тусдаа байранд, мэргэжлийн ажилтантайгаар ажилладаг. Та бичиг баримтад өөрөө гар хүрдэггүй — цонхоор хүсэлт өгнө: "Энэ хавтсыг үзүүлээч", "Энэ бичгийг нэмж хадгалаач." Ажилтан хүсэлт бүрийг хүлээн авч, гүйцэтгэж, хариу өгнө. Олон хүн нэгэн зэрэг өөр өөр цонхоор хүсэлт өгч болох бөгөөд ажилтан тэднийг эмх цэгцтэй зохицуулдаг. Архивын алба хэн ямар хавтсанд хандах эрхтэйг шалгадаг, журмаа чанд мөрдөнө, бичиг баримтын хуулбарыг тогтмол хадгалдаг.
Өмнөх сургалтуудын зүйрлэлийг санаж байгаа бол энэ нь "зочин ба зөөгч"-ийн зарчим — FastAPI сургалтад client ба server-ийг ингэж тайлбарласан. Таны програм бол зочин, PostgreSQL бол зөөгч: зочин гал тогоо руу ордоггүй, захиалгаа өгч, хариугаа хүлээж авдаг.
Энэ хоёр өгөгдлийн сангийн бүтцийн ялгааг тодорхой болгоё.
SQLite нь таны програмын дотор амьдардаг жижиг сан (library) юм. DB Browser ч, Python програм ч SQLite-ийг өөртөө агуулж, library2.db файлыг шууд нээж, уншиж, бичдэг. Тусдаа ажиллаж буй програм байхгүй — програм хаагдахад SQLite ч хаагдана, үлдэх нь зөвхөн файл. Бүлэг 1-д бид "файл ба програм хоёр тусдаа" гэж сурсан нь яг энэ: дэвтэр (файл) ба түүнийг нээсэн ширээ (програм).
PostgreSQL нь тусдаа, үргэлж ажиллаж байдаг програм — server. Түүнийг асаахад тэр компьютерийн арын хэсэгт ажиллаж эхэлж, хүсэлт хүлээдэг. Өгөгдөл нь мөн файлуудад хадгалагддаг ч тэдгээр файлд зөвхөн PostgreSQL server л гар хүрдэг. Таны програм файлыг огт нээдэггүй — харин server-тэй сүлжээгээр холбогдож (connection), SQL query илгээж, үр дүнг хүлээж авдаг. Холбогдохын тулд хаана байгаа (хаяг), аль "цонх" (порт — PostgreSQL-ийнх ихэвчлэн 5432), хэн бэ (хэрэглэгчийн нэр ба нууц үг), аль өгөгдлийн сан гэдгийг хэлэх шаардлагатай. Эдгээрийг Бүлэг 11-д нэг бүрчлэн задална.
Энд нэг түгээмэл төөрөгдлийг шууд арилгая: “server” гэдэг нь заавал өөр компьютер гэсэн үг биш. Server бол програмын үүрэг. Бүлэг 10-ийн дараагийн хичээлд та PostgreSQL server-ийг өөрийн компьютерт суулгана — таны компьютер нэгэн зэрэг зочин ба зөөгч хоёулаа болно. Холболт сүлжээгээр дамжих ч энэ "сүлжээ" нь таны компьютерийн дотор үлдэх бөгөөд интернэт огт шаардлагагүй.
Server өгөгдлийн сангийн хамгийн чухал давуу талыг нэг төсөөллөөр харъя. Номын сан гурван салбартай болсон: төв салбар, Дархан, Эрдэнэт. Салбар бүрт номын санч ажиллаж, өдрийн турш зээл бүртгэж, буцаалт хүлээн авдаг. Бүгд нэг өгөгдлийн сантай ажиллах ёстой — эс бөгөөс Дарханд зээлэгдсэн номыг төв салбар "байгаа" гэж харуулна.
SQLite-ээр үүнийг хийх гэвэл гурван асуудал гарна. Нэгдүгээрт, library2.db файл нэг компьютерт байдаг — Дархан, Эрдэнэтийн компьютерууд түүнийг хэрхэн нээх вэ? Файлыг сүлжээгээр хуваалцах нь SQLite-ийн албан ёсны баримт бичигт хүртэл анхааруулагдсан эрсдэлтэй зам юм. Хоёрдугаарт, Бүлэг 1, Хичээл 2-т database is locked гэсэн мессежтэй уулзсан: SQLite нэг мөчид зөвхөн нэг бичигчийг зөвшөөрдөг. Гурван номын санч зэрэг зээл бүртгэхэд хоёр нь хүлээх эсвэл алдаа авах болно. Гуравдугаарт, бүх номын санч файлд шууд гар хүрдэг тул хэн нэгэн санамсаргүй DB Browser-оор нээгээд хүснэгт устгахаас юу ч хамгаалахгүй.
PostgreSQL-ээр бол зураг өөр. Server нэг газар ажиллаж, гурван салбарын програмууд түүнтэй сүлжээгээр холбогдоно. Server олон холболтыг нэгэн зэрэг хүлээн авч, тэдгээрийн бичилтийг хооронд нь мөргөлдүүлэлгүйгээр зохицуулна — Бүлэг 12-т энэ хэрхэн ажилладгийг (transaction ба түгжрэл) судална. Номын санч бүр өөрийн хэрэглэгчийн нэр, эрхтэй: салбарын номын санч зээл бүртгэж чадна, гэвч хүснэгт устгаж чадахгүй. Архивын албаны бүх давуу тал энд бий.
Жишээ 1: вэб програм ба салангид server-үүд
FastAPI сургалтын Номын сангийн API-гаа интернэтэд байршуулахыг төсөөлөөд үзээрэй. Орчин үеийн байршуулалтад вэб програм ихэвчлэн нэг биш, олон хуулбараар ажилладаг — хэрэглэгчид олшрох тусам систем шинэ хуулбаруудыг автоматаар асааж, багасах үед унтраадаг. Хуулбар бүр өөр компьютерт байж болно. Тэдгээр бүгд нэг л өгөгдлийн сантай ажиллах ёстой.
SQLite файл нэг компьютерийн дискэн дээр байдаг тул бусад хуулбарууд түүнийг харахгүй. Үүнээс гадна олон орчин үеийн байршуулах үйлчилгээ програмын файлын системийг түр зуурын гэж үздэг — програм дахин эхлэх бүрт файлууд эхлэл байдалдаа буцна. Тэнд SQLite файлд бичсэн бүх зээл дараагийн дахин эхлэлтэд алга болно. Тиймээс вэб програмууд өгөгдлөө тусдаа server өгөгдлийн санд хадгалдаг: програмын хуулбарууд ирж, явж болно, өгөгдөл нэг газар, найдвартай үлдэнэ. Түвшин 5-ын төгсгөлийн төсөлд бид яг энэ шилжилтийг хийж, Номын сангийн API-г PostgreSQL руу шилжүүлнэ.
Жишээ 2: SQLite хаана үнэхээр зөв сонголт вэ
Энэ бүхнийг уншаад "тэгвэл SQLite муу юм байна" гэж дүгнэх нь буруу. Бүлэг 1-ийн Түгээмэл алдаанууд хэсэгт SQLite дэлхийн хамгийн өргөн тархсан өгөгдлийн сангуудын нэг гэж хэлсэн — энэ үнэн хэвээр. Ухаалаг утасны харилцагчдын жагсаалт, вэб хөтчийн түүх, олон десктоп програмын тохиргоо SQLite файлд хадгалагддаг. Тэдгээр бүгдэд нэг нийтлэг зүйл бий: нэг програм, нэг хэрэглэгч, нэг төхөөрөмж. Тэнд server суулгах нь хэрэггүй ачаалал болно.
SQLite мөн жижиг вэб сайт, дотоод хэрэгсэл, туршилт (test), өгөгдөл шинжилгээний ажилд маш тохиромжтой. Энэ сургалтын эхний гурван түвшин нь өөрөө нотолгоо: SQL сурахад SQLite төгс байлаа. Шударга дүрэм: нэг програм, нэг бичигч, нэг газар бол SQLite; олон програм, олон зэрэг бичигч, сүлжээ бол server өгөгдлийн сан. Энэ бол "сайн ба муу" биш, "хувийн дэвтэр ба архивын алба" — хоёулаа өөрийн газартаа зөв.
Жишээ 3: таны одоо ашиглаж буй платформ
Хамгийн ойрын жишээ яг таны өмнө бий. Таны уншиж буй энэ сургалтын платформ PostgreSQL дээр ажилладаг — тэр нь Neon гэдэг үйлчилгээгээр интернэтэд байршуулагдсан PostgreSQL server. Та энэ хичээлийг "дүүргэсэн" гэж тэмдэглэх мөчид таны хөтөч платформын програм руу хүсэлт илгээж, програм тэр хүсэлтийг SQL болгон PostgreSQL server руу сүлжээгээр дамжуулж, server таны ахицын мөрийг хүснэгтэд бичнэ. Бүлэг 5-ийн олон-олон харилцааны хичээлд дурдсан элсэлтийн хүснэгт, Бүлэг 7-д тайлбарласан бүлэг, хичээлийн JOIN — бүгд тэр server дээр ажиллаж байна. Хэдэн зуун суралцагч зэрэг хичээл үзэж, ахицаа хадгалж байгаа нь Анхны жишээний "олон зэрэг бичигч"-ийн бодит хэрэгжилт.
Нэг зүйлийг маш тодорхой хэлье: энэ сургалт тэр платформын өгөгдлийн санд хэзээ ч, ямар ч байдлаар хүрэхгүй. Таны бүх дасгал өөрийн компьютерт, өөрийн суулгасан PostgreSQL server дээр, өөрийн үүсгэсэн өгөгдлийн сан дээр явагдана. Тэр нь таны хувийн туршилтын талбай — хүссэнээрээ эвдэж, засаж, устгаж болно, хэнд ч нөлөөлөхгүй.
Мөн энэ жишээ PostgreSQL-ийг хаана ажиллуулах хоёр замыг харуулж байна. Нэгдүгээрт, өөрөө суулгах — таны компьютерт, эсвэл өөрийн server-т. Хоёрдугаарт, удирдлагатай үйлчилгээ (managed service) — Neon шиг компани server-ийг ажиллуулж, шинэчилж, backup хийж, танд зөвхөн холбогдох хаягийг өгдөг. Эдгээр хоёр замын SQL нь яг ижил. Энэ сургалтад бид эхний замыг сонгоно, учир нь server-ийг өөрийн гараар суулгаж, асааж, холбогдох нь түүнийг жинхэнэ ойлгох хамгийн шууд арга.
Энэ сургалтын турш бид SQLite-ийн хэд хэдэн "өршөөлт" зан чанарыг тэмдэглэсэн. PostgreSQL дээр тэдгээр нь хууль болно. Тэдгээрийг нэг дор санацгаая:
Баганын төрөл. SQLite-д зөвлөмж (Бүлэг 4), PostgreSQL-д хууль — бүхэл тоон баганад "үнэгүй" бичвэл алдаа.
FOREIGN KEY. SQLite-д тохиргоогоор асаах шаардлагатай (Бүлэг 5), PostgreSQL-д үргэлж мөрдөгдөнө.
PRIMARY KEY ба NULL. SQLite-д бүхэл тоон бус түлхүүр NULL зөвшөөрдөг (Бүлэг 4), PostgreSQL-д хэзээ ч.
ON-гүй JOIN. SQLite чимээгүй үржүүлдэг (Бүлэг 7), PostgreSQL алдаа өгнө.
GROUP BY-ийн дүрэм. SQLite сагснаас дурын утга сонгодог (Бүлэг 8), PostgreSQL алдаа өгнө.
Текстийн хашилт. SQLite давхар хашилтыг ч текст гэж өршөөдөг (Бүлэг 2), PostgreSQL-д давхар хашилт зөвхөн нэр.
LIKE ба том жижиг үсэг. SQLite латин үсгийн том жижгийг ялгадаггүй (Бүлэг 2), PostgreSQL ялгадаг бөгөөд ялгахгүй хайлтад ILIKE бий.
Энэ жагсаалтыг харахад PostgreSQL "хатуу" мэт санагдаж магадгүй. Үнэндээ эдгээр хатуу дүрэм бүр нь бидний SQLite дээр чимээгүй алдаа гэж харсан зүйлийг тэр даруй, ил тод алдаа болгодог. Бүлэг 1-ээс хойш бид "алдааны мессеж бол тусламж, алдаагүй буруу үр дүн бол аюул" гэж давтсаар ирсэн — PostgreSQL энэ зарчмыг илүү нухацтай мөрддөг. Мөн энэ сургалтын турш бид сайн дураараа PostgreSQL-ийн дүрмийг мөрдөж ирсэн тул таны бичсэн query-нүүдийн ихэнх нь өөрчлөлтгүйгээр ажиллана. Бүлэг 10-ийн сүүлийн хичээлд эдгээр ялгааг өгөгдөл дээр нэг бүрчлэн туршина.
Хэрэв сонирхож байвал өдөр бүр ашигладаг таван програм эсвэл вэб сайтаа бодоод үзээрэй: тэдгээрийн өгөгдөл хувийн дэвтэрт (таны төхөөрөмж дээрх файлд) хадгалагддаг уу, эсвэл архивын албанд (олон хүнтэй хуваалцсан server-т)? Утасныхаа тэмдэглэлийн програм, банкны програм, нийгмийн сүлжээ, тоглоом, имэйл. Сэжүүр: хэрэв таны өгөгдөл өөр төхөөрөмж дээр (утас, компьютер) ижил харагддаг эсвэл бусад хүмүүс таны өөрчлөлтийг хардаг бол server бараг лавтай оролцож байна. Эдгээр нь зөвхөн санал бөгөөд дараагийн хичээлүүд тэдгээрийг хийсэн гэж тооцохгүй.
Энэ хичээлд код бичээгүй тул алдааны мессеж байхгүй. Харин server өгөгдлийн сангийн тухай түгээмэл буруу ойлголтуудыг харъя.
“PostgreSQL бол өөр хэл.” PostgreSQL нь таны мэдэх SQL-ийг ярьдаг. Өгөгдлийн сангууд бие биеэсээ бага зэрэг өөр "аялгуутай" (dialect) — жишээ нь SQLite-ийн group_concat-ийн оронд PostgreSQL-д string_agg — гэвч бүтэц, сэтгэлгээ, query-ний 90-ээс илүү хувь нь ижил. Шинэ хэл сурч байгаа биш, мэддэг хэлээрээ шинэ газар ярьж байна.
“Server гэдэг нь заавал өөр компьютер.” Server бол програмын үүрэг. Дараагийн хичээлд PostgreSQL-ийг таны компьютерт суулгах бөгөөд таны програмууд түүнтэй “localhost” — "энэ компьютер" гэсэн хаягаар холбогдоно.
“PostgreSQL ашиглахад интернэт хэрэгтэй.” Өөрийн компьютерт суулгасан PostgreSQL-д интернэт огт шаардлагагүй — холболт компьютерийн дотор үлдэнэ. Интернэт зөвхөн өөр газар байрлах server-т (Neon гэх мэт) холбогдоход хэрэгтэй.
“PostgreSQL руу шилжвэл миний хүснэгтийн бүтэц автоматаар сайжирна.” Server өгөгдлийн сан нь давхардалтай, буруу зохиосон хүснэгтийг засахгүй — Бүлэг 6-ийн гажуудлууд PostgreSQL-д ч яг адилхан үүснэ. Түвшин 2-т сурсан зохион байгуулалтын ур чадвар өгөгдлийн сангаас үл хамааран таны хамгийн чухал хэрэгсэл хэвээр.
“SQLite-ийн мэдлэг дэмий болно.” Эсрэгээр — SQLite-д бичсэн query-нүүд, schema-ийн шийдвэрүүд, JOIN, aggregate-ийн сэтгэлгээ бүгд шууд шилжинэ. Мөн SQLite нь туршилт, жижиг хэрэгсэл, хувийн програмд таны хэрэгслийн хайрцагт үлдэх үнэ цэнтэй багаж юм.
Энэ хичээлд та файл өгөгдлийн сан ба server өгөгдлийн сангийн ялгааг ойлголоо. SQLite нь таны програмын дотор амьдарч, файлыг шууд нээдэг хувийн дэвтэр — нэг програм, нэг бичигч, нэг газарт төгс. PostgreSQL нь тусдаа, үргэлж ажилладаг server — архивын алба — бөгөөд програмууд түүнтэй сүлжээгээр холбогдож, query илгээдэг; олон зэрэг бичигч, хэрэглэгчийн эрх, олон програмын хуулбартай вэб системд зайлшгүй. Server нь өөр компьютер биш, програмын үүрэг бөгөөд таны компьютерт ч ажиллаж болно. Таны ашиглаж буй энэ платформ ч PostgreSQL дээр ажилладаг ч энэ сургалт тэр өгөгдлийн санд хэзээ ч хүрэхгүй — бүх дасгал таны өөрийн server дээр. SQLite-ийн өршөөлт зан чанарууд PostgreSQL-д хууль болох бөгөөд энэ нь чимээгүй алдааг ил тод алдаа болгодог.
Дараагийн хичээлд бид PostgreSQL-ийг Windows компьютерт алхам алхмаар суулгана. Суулгагчийг татах, хэрэглэгчийн нууц үгийг зөв сонгож хадгалах, server нь компьютерийн арын хэсэгт "үйлчилгээ" болон хэрхэн ажилладгийг, 5432 портыг, мөн суулгах явцад гарч болох алдаа бүрийг яг тэр алхам дээр нь харна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.