# ការធ្វើការ​ជាមួយ​ទិន្នន័យ៖ មូលដ្ឋាន​ទិន្នន័យ​ទំនាក់ទំនង |![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/05-RelationalData.png)| |:---:| | ការធ្វើការ​ជាមួយ​ទិន្នន័យ៖ មូលដ្ឋាន​ទិន្នន័យ​ទំនាក់ទំនង - _Sketchnote by [@nitya](https://twitter.com/nitya)_ | ការសម្រួលភាព អ្នកប្រហែលជាបានប្រើប្រាស់សន្លឹកគណនា (spreadsheet) នៅអតីតកាលដើម្បីផ្ទុកព័ត៌មាន។ អ្នកមានជួរនិងកូឡាំ, ដែលជួរនោះមានព័ត៌មាន (ឬទិន្នន័យ), ហើយកូឡាំពិពណ៌នាព័ត៌មាន (ដែលម្តងម្កាលហៅថាmetadata)។ មូលដ្ឋានទិន្នន័យទំនាក់ទំនងត្រូវបានបង្កើតឡើងលើគ្រឹះស្នូលនេះនៃកូឡាំនិងជួរនៅក្នុងតារាង, អនុញ្ញាតឱ្យអ្នកមានព័ត៌មានចែកចាយក្នុងតារាងច្រើន។ នេះអនុញ្ញាតឱ្យអ្នកធ្វើការជាមួយទិន្នន័យផ្ទាល់ខ្លួនស្មុគស្មាញជាងនេះ, ជៀសវាងការបញ្ចេញចម្លង, ហើយមានភាពអាចបត់បែនក្នុងវិធីដែលអ្នកស្វែងរកទិន្នន័យ។ យើងមកស្វែងយល់ពីគំនិតនៃមូលដ្ឋានទិន្នន័យទំនាក់ទំនង។ ## [ចម្លើយបឋមមុខវិទ្យាសាស្រ្ត](https://ff-quizzes.netlify.app/en/ds/quiz/8) ## វិធីគិតគ្រប់គ្រងចាប់ផ្តើមពីតារាង មូលដ្ឋានទិន្នន័យទំនាក់ទំនងមាននៅចម្បងតារាង។ ដូចជា spreadsheet, តារាងគឺជាការប្រមូលផ្តុំកូឡាំនិងជួរ។ ជួរមានទិន្នន័យឬព័ត៌មានដែលយើងចង់ធ្វើការ ជាឧទាហរណ៍ឈ្មោះទីក្រុងឬបរិមាណភ្លៀងធ្លាក់។ កូឡាំពិពណ៌នាទិន្នន័យដែលពួកគេផ្ទុក។ យើងចាប់ផ្តើមស្វែងយល់ដោយបង្កើតតារាងដើម្បីផ្ទុកព័ត៌មានអំពីទីក្រុង។ យើងអាចចាប់ផ្តើមជាមួយឈ្មោះនិងប្រទេសរបស់ពួកវា។ អ្នកអាចផ្ទុកវានៅក្នុងតារាងដូចខាងក្រោម៖ | ទីក្រុង | ប្រទេស | | -------- | --------------- | | តូគ្យូ | ជប៉ុន | | អាតឡានតា | សហរដ្ឋអាមេរិក | | អូខ្លិន | នូវហ្សេឡង់ | សម្គាល់ថា ឈ្មោះកូឡាំ **ទីក្រុង**, **ប្រទេស** និង **ប្រជាជន** ពិពណ៌នាទិន្នន័យដែលបានផ្ទុក ហើយជួរមួយៗមានព័ត៌មានអំពីទីក្រុងមួយ។ ## មិនគ្រប់គ្រាន់នៃវិធីសាស្រ្តតារាងតែមួយ ប្រហែលជាតារាងខាងលើមើលទៅស្គាល់ស្រដៀងគ្នា ។ យើងចាប់ផ្តើមបន្ថែមទិន្នន័យបន្ថែមទៅទៅមូលដ្ឋានទិន្នន័យកំពុង៖ ភ្លៀងប្រចាំឆ្នាំ (ជា មីល្លីម៉ែត្រ)។ យើងនឹងផ្តោតទៅលើឆ្នាំ 2018, 2019 និង 2020។ ប្រសិនបើយើងបន្ថែមវាសម្រាប់តូគ្យូ វាអាចរួមទាំងដូចខាងក្រោម៖ | ទីក្រុង | ប្រទេស | ឆ្នាំ | បរិមាណ | | ------- | ------- | ------| ------- | | តូគ្យូ | ជប៉ុន | 2020 | 1690 | | តូគ្យូ | ជប៉ុន | 2019 | 1874 | | តូគ្យូ | ជប៉ុន | 2018 | 1445 | តើអ្នកចាប់អារម្មណ៍អ្វីខ្លះពីតារាងរបស់យើង? អ្នកប្រហែលជាមើលឃើញថាយើងកំពុងចម្លងឈ្មោះនិងប្រទេសរបស់ទីក្រុងម្ដងម្កាល។ ថ្លៃឈ្នួលផ្ទុកអាចបង្កេីតការចំណាយខ្លាំង ហើយវាមិនចាំបាច់ត្រូវមានចម្លងមួយចំនួនទេ។ ជាពិសេស តូគ្យូមានឈ្មោះតែម្ដងដែលយើងចាប់អារម្មណ៍។ ល្អហើយ ក្រោយមកយើងសាកល្បងរឿងផ្សេងទៀត។ យើងបន្ថែមកូឡាំថ្មីសម្រាប់គ្រប់ឆ្នាំៗ៖ | ទីក្រុង | ប្រទេស | 2018 | 2019 | 2020 | | -------- | --------------- | ---- | ---- | ---- | | តូគ្យូ | ជប៉ុន | 1445 | 1874 | 1690 | | អាតឡានតា | សហរដ្ឋអាមេរិក | 1779 | 1111 | 1683 | | អូខ្លិន | នូវហ្សេឡង់ | 1386 | 942 | 1176 | បើទោះបីជាវាមិនបានចម្លងជួរផ្ទាល់, វាក៏បញ្ចូលបញ្ហាផ្សេងទៀតផងដែរ។ យើងត្រូវតែផ្លាស់ប្តូររចនាសម្ព័ន្ធតារាងរបស់យើងគ្រប់ពេលវេលាមានឆ្នាំថ្មីមួយ។ ហើយនៅពេលទិន្នន័យរីកចម្រើន ការមានឆ្នាំជាកូឡាំនឹងធ្វើឱ្យការទាញយកនិងគណនាតម្លៃកាន់តែពិបាក។ នេះហើយជាទីតាំងដែលយើងត្រូវតារាងច្រើននិងទំនាក់ទំនងរវាងពួកវា។ ដោយបំបែកទិន្នន័យយើងអាចជៀសវាងការបញ្ចេញចម្លង ហើយមានភាពបត់បែនក្នុងរបៀបធ្វើការជាមួយទិន្នន័យរបស់យើង។ ## គំនិតនៃទំនាក់ទំនង មកវិញទៅទិន្នន័យរបស់យើង ហើយសម្រេចចិត្តថាអ្នកចង់បំបែកវាយ៉ាងដូចម្តេច។ យើងដឹងថាយើងចង់ផ្ទុកឈ្មោះនិងប្រទេសសម្រាប់ទីក្រុងរបស់យើង, ដូច្នេះវានឹងដំណើរការល្អនៅក្នុងតារាងមួយ។ | ទីក្រុង | ប្រទេស | | -------- | --------------- | | តូគ្យូ | ជប៉ុន | | អាតឡានតា | សហរដ្ឋអាមេរិក | | អូខ្លិន | នូវហ្សេឡង់ | មុននឹងបង្កើតតារាងបន្ទាប់, យើងត្រូវសម្រេចយ៉ាងដូចម្តេចក្នុងការរកឃើញទំនាក់ទំនងជាមួយពួកវា។ យើងត្រូវការសម្ភារណាមួយហៅថា អត្តសញ្ញាណ, ID ឬ (ក្នុងពាក្យបច្ចេកទេសរបស់មូលដ្ឋានទិន្នន័យ) គន្លឹះដើម(primary key)។ គន្លឹះដើមគឺតម្លៃមួយដែលប្រើសម្រាប់កំណត់ជួរតែមួយពិសេសក្នុងតារាងមួយ។ ខណៈដែលវាអាចផ្អែកលើតម្លៃក្នុងខ្លួនវា (យើងអាចប្រើឈ្មោះទីក្រុងបានឧទាហរណ៍), វាគួរតែជាលេខឬក៏សម្គាល់ផ្សេងទៀតជាច្រើនតែម្ដង។ យើងមិនចង់ឲ្យ id ផ្លាស់ប្តូរអ្វីៗទៀតព្រោះវានឹងបំបែកទំនាក់ទំនង។ អ្នកនឹងងាយស្រួលឃើញក្នុងករណីភាគច្រើនគន្លឹះដើមឬid ទៀងទាត់ជាលេខបង្កើតដោយស្វ័យប្រវត្តិ។ > ✅ គន្លឹះដើម តែងតែត្រូវបានចាត់ទុកថា ជា PK ### ទីក្រុង | city_id | ទីក្រុង | ប្រទេស | | ------- | --------- | --------------- | | 1 | តូគ្យូ | ជប៉ុន | | 2 | អាតឡានតា | សហរដ្ឋអាមេរិក | | 3 | អូខ្លិន | នូវហ្សេឡង់ | > ✅ អ្នកនឹងសម្គាល់ថាយើងប្រើពាក្យ "id" និង "primary key" ជាប្រភេទប្រេះប្រា ប្រជុំក្នុងមេរៀននេះ។ គំនិតនៅទីនេះយកទៅប្រើបានជាមួយ DataFrames ដែលអ្នកនឹងស្វែងយល់បន្តិចក្រោយ។ DataFrames មិនប្រើពាក្យ "primary key" ផ្ទាល់ទេ ប៉ុន្តែអ្នកនឹងមើលឃើញម៉េចវាប្រព្រឹត្តទៅដូចគ្នា។ ជាមួយតារាងទីក្រុង, យើងចាប់ផ្តើមផ្ទុកភ្លៀង។ បើវាមានការចម្លងព័ត៌មានពេញលេញអំពីទីក្រុង ត្រូវប្រើ id។ យើងត្រូវប្រាកដថាតារាងថ្មីក៏មានកូឡាំ *id* ផងដែរ ពីព្រោះតារាងទាំងអស់គួរតែមាន id ឬ primary key។ ### ភ្លៀងធ្លាក់ | rainfall_id | city_id | ឆ្នាំ | បរិមាណ | | ----------- | ------- | ---- | ------- | | 1 | 1 | 2018 | 1445 | | 2 | 1 | 2019 | 1874 | | 3 | 1 | 2020 | 1690 | | 4 | 2 | 2018 | 1779 | | 5 | 2 | 2019 | 1111 | | 6 | 2 | 2020 | 1683 | | 7 | 3 | 2018 | 1386 | | 8 | 3 | 2019 | 942 | | 9 | 3 | 2020 | 1176 | សម្គាល់កូឡាំ **city_id** ក្នុងតារាងថ្មី **rainfall**។ កូឡាំនេះមានតម្លៃដែលយោងទៅរក ID ក្នុងតារាង **cities**។ ក្នុងពាក្យបច្ចេកវិទ្យាទិន្នន័យទំនាក់ទំនង វាហៅថា **foreign key**; វាជាគន្លឹះដើមពីតារាងផ្សេងមួយ។ អ្នកអាចគិតថាវាជាការយោង ឬគោលបំណងមួយ។ **city_id** 1 យោងទៅ Tokyo។ > [!NOTE] > foreign key តែងតែត្រូវបានចាត់ទុកថា ជា FK ## ការទាញយកទិន្នន័យ ដោយមានទិន្នន័យបំបែកជា ២ តារាង អ្នកអាចចាប់អារម្មណ៍ថានឹងទាញយកវាយ៉ាងដូចម្តេច។ ប្រសិនបើយើងប្រើមូលដ្ឋានទិន្នន័យទំនាក់ទំនងដូចជា MySQL, SQL Server ឬ Oracle, យើងអាចប្រើភាសាមួយហៅថា Structured Query Language ឬ SQL។ SQL (មួយចំនួនហៅថា sequel) គឺជាភាសាមាត្រយោងសម្រាប់ទាញយកនិងកែប្រែទិន្នន័យក្នុងមូលដ្ឋានទិន្នន័យទំនាក់ទំនង។ មកទាញយកទិន្នន័យ អ្នកប្រើការបញ្ជា `SELECT`។ ដើមគេ, អ្នក **ជ្រើសរើស** កូឡាំដែលអ្នកចង់មើល **ពី** តារាងដែលវាផ្ទុកជុំវិញ។ ប្រសិនបើអ្នកចង់បង្ហាញតែឈ្មោះទីក្រុង អ្នកអាចប្រើដូចខាងក្រោម៖ ```sql SELECT city FROM cities; -- Output: -- Tokyo -- Atlanta -- Auckland ``` `SELECT` គឺជាកន្លែងអ្នករាប់បញ្ជីកូឡាំ ហើយ `FROM` គឺជាកន្លែងបញ្ជីតារាង។ > [!NOTE] > សំណុំបែបបទ SQL មិនប្រកាន់ខណ្ឌពុម្ពអក្សរទេ មានន័យថា `select` និង `SELECT` មានន័យដូចគ្នា។ ទោះយ៉ាងណា, ផ្អែកទៅលើប្រភេទមូលដ្ឋានទិន្នន័យ អ្នកប្រហែលជាអាចមានករណីកូឡាំនិងតារាងមានករណីពុម្ពអក្សរកំណត់។ ដូច្នេះ ជាការអនុវត្តល្អបំផុត ក្នុងការគ្រប់អ្នកវាយកូដគួរតែប្រើរបៀបរៀបចំធំលើពាក្យគន្លឹះSQL ។ សំណួរខាងលើនឹងបង្ហាញទីក្រុងទាំងអស់។ ដូច្នេះគិតថា យើងត្រូវបង្ហាញតែទីក្រុងដែលនៅក្នុង New Zealand។ យើងត្រូវការសំរាប់តម្រងមួយ។ ពាក្យ SQL សម្រាប់នេះគឺ `WHERE`, ឬ "នៅកន្លែងដែលអ្វីមួយពិត។" ```sql SELECT city FROM cities WHERE country = 'New Zealand'; -- Output: -- Auckland ``` ## ការរួមបញ្ចូលទិន្នន័យ រហូតមកដល់ពេលនេះយើងបានទាញយកទិន្នន័យ​ពីតារាងតែមួយ។ ឥឡូវនេះយើងចង់ដង្ហើយទិន្នន័យពីទាំងពីរ **cities** និង **rainfall**។ វាត្រូវបានអនុវត្តដោយ *joining* ពួកវារួមគ្នា។ អ្នកមានការបង្កើតចំណុចភ្ជាប់រវាងតារាងពីរនៅកន្លែងណាមួយ ហើយភ្ជាប់តម្លៃពីកូឡាំមួយពីតារាងមួយទៅកូឡាំពីតារាងមួយទៀត។ នៅក្នុងឧទាហរណ៍លំហូរយើងយួរយកកូឡាំ **city_id** នៅក្នុង **rainfall** ជាមួយកូឡាំ **city_id** នៅក្នុង **cities**។ វានឹងភ្ជាប់តម្លៃភ្លៀងជាមួយទីក្រុងពាក់ព័ន្ធរបស់វា។ ប្រភេទ join ដែលយើងនឹងធ្វើហៅថា *inner* join, មានន័យថាបើជួរណាមួយមិនប៉ះគ្នានឹងអ្វីមួយពីតារាងផ្សេង វានឹងមិនបង្ហាញឡើងទេ។ ក្នុងរឿងរបស់យើង តើមួយៗទីក្រុងមានភ្លៀងទេ, ដូច្នេះអ្វីៗគ្រប់យ៉ាងនឹងបង្ហាញ។ យើងសង់សំណូមពរទាញយកភ្លៀងរបស់ឆ្នាំ 2019 សម្រាប់ទីក្រុងទាំងអស់។ យើងនឹងធ្វើវាជាជំហានៗ។ ជំហានដំបូងគឺបញ្ចូលទិន្នន័យរួមគ្នា ដោយបង្ហាញកូឡាំសម្រាប់ចំណុចភ្ជាប់ - **city_id** ដូចដែលបានបង្ហាញខាងលើ។ ```sql SELECT cities.city rainfall.amount FROM cities INNER JOIN rainfall ON cities.city_id = rainfall.city_id ``` យើងបានពណ៌បង្ហាញពីកូឡាំទាំងពីរដែលយើងចង់បាន ហើយត្រូវចូលរួមតារាងដោយ **city_id**។ ឥឡូវនេះអាចបន្ថែមប្រយោគ `WHERE` ដើម្បីតម្រងអំពីឆ្នាំ 2019 ប៉ុណ្ណោះ។ ```sql SELECT cities.city rainfall.amount FROM cities INNER JOIN rainfall ON cities.city_id = rainfall.city_id WHERE rainfall.year = 2019 -- Output -- city | amount -- -------- | ------ -- Tokyo | 1874 -- Atlanta | 1111 -- Auckland | 942 ``` ## សរុបមេរៀន មូលដ្ឋានទិន្នន័យទំនាក់ទំនងផ្អែកលើការបំបែកព័ត៌មានជាច្រើនតារាងដែលបន្ទាប់មកត្រូវបានយកមកវិញសម្រាប់បង្ហាញនិងវិភាគ។ វាពិចារណាជាកម្រិតខ្ពស់នៃភាពបត់បែនដើម្បីគណនានិងគ្រប់គ្រងទិន្នន័យផ្សេងទៀត។ អ្នកបានឃើញមេរៀនគ្រឹះនៃមូលដ្ឋានទិន្នន័យទំនាក់ទំនង ហើយបានកិច្ចការបញ្ចូលគ្នារវាងតារាងពីរ។ ## 🚀 챌린지 មានមូលដ្ឋានទិន្នន័យទំនាក់ទំនងជាច្រើនដែលមានស្រាប់នៅលើអ៊ីនធឺណិត។ អ្នកអាចស្វែងយល់ទិន្នន័យដោយប្រើជំនាញដែលបានរៀនខាងលើ។ ## ការត្រួតពិនិត្យបន្ទាប់ពីមេរៀន ## [ចម្លើយបន្ទាប់ពីមេរៀន](https://ff-quizzes.netlify.app/en/ds/quiz/9) ## ការត្រួតពិនិត្យ និងការសិក្សាឯកឯក មានធនធានជាច្រើនក្នុង [Microsoft Learn](https://docs.microsoft.com/learn?WT.mc_id=academic-77958-bethanycheum) សម្រាប់អ្នកដើម្បីបន្តស្វែងយល់អំពី SQL និងគំនិតមូលដ្ឋានទិន្នន័យទំនាក់ទំនង - [ពណ៌នាគំនិតនៃទិន្នន័យទំនាក់ទំនង](https://docs.microsoft.com//learn/modules/describe-concepts-of-relational-data?WT.mc_id=academic-77958-bethanycheum) - [ចាប់ផ្តើមស្វែងរកជាមួយ Transact-SQL](https://docs.microsoft.com//learn/paths/get-started-querying-with-transact-sql?WT.mc_id=academic-77958-bethanycheum) (Transact-SQL គឺជារស់ជ្រៅនៃ SQL) - [មាតិការអំពី SQL នៅ Microsoft Learn](https://docs.microsoft.com/learn/browse/?products=azure-sql-database%2Csql-server&expanded=azure&WT.mc_id=academic-77958-bethanycheum) ## កិច្ចការ [បង្ហាញទិន្នន័យអាកាសយានដ្ឋាន](assignment.md) --- **ការបដិសេធ**៖ ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខំប្រឹងប្រសិទ្ធភាពក្នុងការបន្សល់ភាពត្រឹមត្រូវ សូមដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវមួយចំនួន។ ឯកសារដើមនៅក្នុងភាសាតំណាងរបស់វាគួរត្រូវបានចាត់ទុកជាធនធានដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ ការបកប្រែដោយមនុស្សជំនាញម្នាក់គឺត្រូវបានណែនាំ។ យើងមិនមានការទទួលខុសត្រូវចំពោះការយល់បញ្ចូលខុស ឬការបកប្រែមិនត្រឹមត្រូវណាមួយដែលបង្កើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។