# ഡാറ്റയുമായി പ്രവർത്തിക്കൽ: ബന്ധപരമായ ഡാറ്റാബേസുകൾ |![ Sketchnote by [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/05-RelationalData.png)| |:---:| | ഡാറ്റയുമായി പ്രവർത്തിക്കൽ: ബന്ധപരമായ ഡാറ്റാബേസുകൾ - _Sketchnote by [@nitya](https://twitter.com/nitya)_ | നിങ്ങൾ മുമ്പ് വിവരങ്ങൾ സൂക്ഷിക്കാൻ സ്പ്രെഡ്‌ഷീറ്റ് ഉപയോഗിച്ചിട്ടുണ്ടാകാം. നിങ്ങൾക്കു് ഒരു നിരകളും കോളങ്ങളുമുള്ള ഒരു സെറ്റ് ഉണ്ടായിരുന്നു, അവിടെ നിരകൾ വിവരങ്ങൾ (അഥവാ ഡാറ്റ) ഉൾക്കൊണ്ടിരുന്നു, കോളങ്ങൾ വിവരങ്ങളെ വിവരിച്ചിരുന്നു (കഴിഞ്ഞപ്പോൾ മെറ്റാഡേറ്റ എന്ന് വിളിക്കപ്പെടുന്നു). ഒരു ബന്ധപരമായ ഡാറ്റാബേസ് ഈ കോളങ്ങളും നിരകളും ഉള്ള ടേബിളുകളുടെ അടിസ്ഥാന സിദ്ധാന്തത്തിൽ നിർമ്മിക്കപ്പെട്ടതാണ്, ഇത് നിങ്ങൾക്ക് വിവരങ്ങൾ പല ടേബിളുകളിലായി വ്യാപിപ്പിക്കാൻ അനുവദിക്കുന്നു. ഇത് നിങ്ങൾക്ക് കൂടുതൽ സങ്കീർണ്ണമായ ഡാറ്റയുമായി പ്രവർത്തിക്കാൻ, പുനരാവൃതിയെ ഒഴിവാക്കാൻ, ഡാറ്റ പരിശോധിക്കുന്ന രീതിയിൽ കൂടുതൽ സൗകര്യം നൽകുന്നു. ബന്ധപരമായ ഡാറ്റാബേസിന്റെ ആശയങ്ങൾ പരിശോധിക്കാം. ## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ds/quiz/8) ## എല്ലാം ടേബിളുകളോടെ ആരംഭിക്കുന്നു ഒരു ബന്ധപരമായ ഡാറ്റാബേസിന്റെ മദ്ധ്യത്തിൽ ടേബിളുകളുണ്ട്. സ്പ്രെഡ്‌ഷീറ്റിനൊപ്പം പോലെ, ഒരു ടേബിൾ കോളങ്ങളും നിരകളും ഉള്ള ഒരു ശേഖരമാണ്. നിരയിൽ നാം പ്രവർത്തിക്കാൻ ആഗ്രഹിക്കുന്ന ഡാറ്റ അല്ലെങ്കിൽ വിവരങ്ങൾ അടങ്ങിയിരിക്കുന്നു, ഉദാഹരണത്തിന് ഒരു നഗരത്തിന്റെ പേര് അല്ലെങ്കിൽ മഴവെള്ളത്തിന്റെ അളവ്. കോളങ്ങൾ അവർ സൂക്ഷിക്കുന്ന ഡാറ്റയെ വിവരിക്കുന്നു. നഗരങ്ങളെക്കുറിച്ചുള്ള വിവരങ്ങൾ സൂക്ഷിക്കാൻ ഒരു ടേബിൾ ആരംഭിച്ച് നോക്കാം. നാം അവരുടെ പേര്, രാജ്യം തുടങ്ങിയവ തുടങ്ങാം. നിങ്ങൾ ഇത് ഒരു ടേബിളിൽ ഇങ്ങനെ സൂക്ഷിക്കാം: | നഗരം | രാജ്യം | | -------- | ------------- | | ടോക്കിയോ | ജപ്പാൻ | | അറ്റ്ലാന്റാ | യുണൈറ്റഡ് സ്റ്റേറ്റ്സ് | | ഓക്ലാൻഡ് | ന്യൂസിലാൻഡ് | **നഗരം**, **രാജ്യം** എന്നീ കോളം പേരുകൾ സൂക്ഷിക്കുന്ന ഡാറ്റയെ വിവരിക്കുന്നു, ഓരോ നിരയും ഒരു നഗരത്തെക്കുറിച്ചുള്ള വിവരങ്ങൾ ഉൾക്കൊള്ളുന്നു. ## ഒറ്റ ടേബിൾ സമീപനത്തിന്റെ പരിമിതികൾ മുകളിൽ കാണിച്ച ടേബിൾ നിങ്ങൾക്ക് പരിചിതമായതായിരിക്കാം. നമുക്ക് നമ്മുടെ ഡാറ്റാബേസിൽ കൂടുതൽ ഡാറ്റ ചേർക്കാം - വാർഷിക മഴവെള്ളം (മില്ലിമീറ്ററിൽ). നാം 2018, 2019, 2020 വർഷങ്ങളിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കും. ടോക്കിയോയ്ക്ക് ഇത് ചേർക്കുകയാണെങ്കിൽ ഇങ്ങനെ കാണാം: | നഗരം | രാജ്യം | വർഷം | അളവ് | | ----- | ------- | ---- | ------ | | ടോക്കിയോ | ജപ്പാൻ | 2020 | 1690 | | ടോക്കിയോ | ജപ്പാൻ | 2019 | 1874 | | ടോക്കിയോ | ജപ്പാൻ | 2018 | 1445 | നമ്മുടെ ടേബിളിൽ നിങ്ങൾ എന്ത് ശ്രദ്ധിക്കുന്നു? നഗരത്തിന്റെ പേര്, രാജ്യം ആവർത്തിച്ച് പുനരാവൃതിയാകുന്നു. ഇത് വലിയ സംഭരണശേഷി ഉപയോഗിക്കാം, പല പകർപ്പുകൾ ആവശ്യമില്ല. ടോക്കിയോയ്ക്ക് നാം ആഗ്രഹിക്കുന്ന ഒരു പേര് മാത്രമേ ഉള്ളൂ. ശരി, മറ്റൊരു ശ്രമം ചെയ്യാം. ഓരോ വർഷത്തിനും പുതിയ കോളങ്ങൾ ചേർക്കാം: | നഗരം | രാജ്യം | 2018 | 2019 | 2020 | | -------- | ------------- | ---- | ---- | ---- | | ടോക്കിയോ | ജപ്പാൻ | 1445 | 1874 | 1690 | | അറ്റ്ലാന്റാ | യുണൈറ്റഡ് സ്റ്റേറ്റ്സ് | 1779 | 1111 | 1683 | | ഓക്ലാൻഡ് | ന്യൂസിലാൻഡ് | 1386 | 942 | 1176 | ഇത് നിര പുനരാവൃത്തി ഒഴിവാക്കുന്നു, പക്ഷേ മറ്റൊരു വെല്ലുവിളി ഉണ്ടാക്കുന്നു. ഓരോ പുതിയ വർഷവും ടേബിളിന്റെ ഘടന മാറ്റേണ്ടി വരും. കൂടാതെ, വർഷങ്ങൾ കോളങ്ങളായി ഉള്ളത് മൂലം ഡാറ്റ പുനഃപ്രാപനം, കണക്കുകൂട്ടൽ കൂടുതൽ ബുദ്ധിമുട്ടാകും. ഇതിനാൽ നമുക്ക് പല ടേബിളുകളും ബന്ധങ്ങളും ആവശ്യമുണ്ട്. ഡാറ്റ വിഭജിച്ച് പുനരാവൃത്തി ഒഴിവാക്കി, കൂടുതൽ സൗകര്യപ്രദമായി ഡാറ്റ കൈകാര്യം ചെയ്യാം. ## ബന്ധങ്ങളുടെ ആശയങ്ങൾ നമ്മുടെ ഡാറ്റ തിരിച്ചറിയാം, എങ്ങനെ വിഭജിക്കാമെന്ന് തീരുമാനിക്കാം. നഗരങ്ങളുടെ പേര്, രാജ്യം സൂക്ഷിക്കാൻ ഒരു ടേബിൾ മതിയാകും. | നഗരം | രാജ്യം | | -------- | ------------- | | ടോക്കിയോ | ജപ്പാൻ | | അറ്റ്ലാന്റാ | യുണൈറ്റഡ് സ്റ്റേറ്റ്സ് | | ഓക്ലാൻഡ് | ന്യൂസിലാൻഡ് | പിന്നീട് അടുത്ത ടേബിൾ സൃഷ്ടിക്കുന്നതിന് മുമ്പ്, ഓരോ നഗരത്തെയും എങ്ങനെ സൂചിപ്പിക്കാമെന്ന് കണ്ടെത്തണം. ഒരു തിരിച്ചറിയൽ, ഐഡി അല്ലെങ്കിൽ (ടെക്നിക്കൽ ഡാറ്റാബേസ് പദങ്ങളിൽ) പ്രൈമറി കീ ആവശ്യമുണ്ട്. പ്രൈമറി കീ ഒരു ടേബിളിലെ ഒരു പ്രത്യേക നിര തിരിച്ചറിയാൻ ഉപയോഗിക്കുന്ന മൂല്യമാണ്. ഇത് ഒരു മൂല്യത്തെ അടിസ്ഥാനമാക്കാമെങ്കിലും (ഉദാഹരണത്തിന് നഗരത്തിന്റെ പേര്), സാധാരണയായി ഇത് ഒരു സംഖ്യ അല്ലെങ്കിൽ മറ്റൊരു തിരിച്ചറിയൽ ആയിരിക്കണം. ഐഡി മാറാതിരിക്കണം, കാരണം അത് ബന്ധം തകരാറിലാക്കും. സാധാരണയായി പ്രൈമറി കീ സ്വയം സൃഷ്ടിക്കപ്പെട്ട സംഖ്യയാണ്. > ✅ പ്രൈമറി കീ സാധാരണയായി PK എന്ന് ചുരുക്കി പറയുന്നു ### നഗരങ്ങൾ | city_id | നഗരം | രാജ്യം | | ------- | -------- | ------------- | | 1 | ടോക്കിയോ | ജപ്പാൻ | | 2 | അറ്റ്ലാന്റാ | യുണൈറ്റഡ് സ്റ്റേറ്റ്സ് | | 3 | ഓക്ലാൻഡ് | ന്യൂസിലാൻഡ് | > ✅ ഈ പാഠത്തിൽ "id"യും "primary key"യും പരസ്പരം ഉപയോഗിക്കുന്നതായി കാണും. ഈ ആശയങ്ങൾ DataFrames-ലും ബാധകമാണ്, പിന്നീട് നിങ്ങൾ അവ പരിശോധിക്കും. DataFrames "primary key" പദം ഉപയോഗിക്കാറില്ല, പക്ഷേ അവ സമാനമായി പ്രവർത്തിക്കുന്നു. നഗരങ്ങളുടെ ടേബിൾ സൃഷ്ടിച്ചതിനുശേഷം, മഴവെള്ളം സൂക്ഷിക്കാം. നഗരത്തെ പൂർണ്ണമായി പുനരാവർത്തിക്കാതെ, id ഉപയോഗിക്കാം. പുതിയ ടേബിളിലും *id* കോളം ഉണ്ടായിരിക്കണം, എല്ലാ ടേബിളുകൾക്കും id അല്ലെങ്കിൽ പ്രൈമറി കീ ഉണ്ടായിരിക്കണം. ### മഴവെള്ളം | 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 | പുതിയ **rainfall** ടേബിളിലെ **city_id** കോളം ശ്രദ്ധിക്കുക. ഈ കോളം **cities** ടേബിളിലെ ഐഡികളെ സൂചിപ്പിക്കുന്നു. ടെക്നിക്കൽ ബന്ധപരമായ ഡാറ്റ പദങ്ങളിൽ ഇത് **ഫോറൻ കീ** എന്ന് വിളിക്കുന്നു; മറ്റൊരു ടേബിളിലെ പ്രൈമറി കീ ആണ്. ഇത് ഒരു റഫറൻസ് അല്ലെങ്കിൽ പോയിന്റർ ആയി കരുതാം. **city_id** 1 ടോക്കിയോയെ സൂചിപ്പിക്കുന്നു. > [!NOTE] > ഫോറൻ കീ സാധാരണയായി FK എന്ന് ചുരുക്കി പറയുന്നു ## ഡാറ്റ പുനഃപ്രാപനം ഡാറ്റ രണ്ട് ടേബിളുകളായി വിഭജിച്ചപ്പോൾ, എങ്ങനെ പുനഃപ്രാപിക്കാമെന്ന് നിങ്ങൾക്ക് സംശയമുണ്ടാകാം. MySQL, SQL Server, Oracle പോലുള്ള ബന്ധപരമായ ഡാറ്റാബേസുകൾ ഉപയോഗിക്കുമ്പോൾ, Structured Query Language അല്ലെങ്കിൽ SQL എന്ന ഭാഷ ഉപയോഗിക്കാം. SQL (കഴിഞ്ഞപ്പോൾ sequel എന്നും ഉച്ചരിക്കാം) ഒരു സ്റ്റാൻഡേർഡ് ഭാഷയാണ്, ബന്ധപരമായ ഡാറ്റാബേസിൽ ഡാറ്റ പുനഃപ്രാപിക്കാനും മാറ്റാനും ഉപയോഗിക്കുന്നു. ഡാറ്റ പുനഃപ്രാപിക്കാൻ `SELECT` കമാൻഡ് ഉപയോഗിക്കുന്നു. അടിസ്ഥാനത്തിൽ, നിങ്ങൾ കാണാൻ ആഗ്രഹിക്കുന്ന കോളങ്ങൾ **select** ചെയ്യുകയും അവ ഉൾക്കൊള്ളുന്ന ടേബിളിൽ നിന്നാണ് **from** ചെയ്യുകയും ചെയ്യുന്നു. നഗരങ്ങളുടെ പേരുകൾ മാത്രം കാണിക്കാൻ നിങ്ങൾക്ക് താഴെ കാണുന്ന വിധം ഉപയോഗിക്കാം: ```sql SELECT city FROM cities; -- Output: -- Tokyo -- Atlanta -- Auckland ``` `SELECT` നിങ്ങൾ കോളങ്ങൾ പട്ടികപ്പെടുത്തുന്നിടമാണ്, `FROM` ടേബിളുകൾ പട്ടികപ്പെടുത്തുന്നിടമാണ്. > [!NOTE] > SQL സിന്റാക്സ് കേസ്-ഇൻസെൻസിറ്റീവ് ആണ്, അതായത് `select` ഉം `SELECT` ഉം ഒരേ അർത്ഥം വഹിക്കുന്നു. എന്നാൽ, നിങ്ങൾ ഉപയോഗിക്കുന്ന ഡാറ്റാബേസിന്റെ തരം അനുസരിച്ച് കോളങ്ങളും ടേബിളുകളും കേസ്-സെൻസിറ്റീവ് ആകാം. അതിനാൽ, പ്രോഗ്രാമിങ്ങിൽ എല്ലാം കേസ്-സെൻസിറ്റീവ് ആണെന്ന് കരുതുന്നത് മികച്ച പ്രാക്ടീസാണ്. SQL ക്വെറിയുകൾ എഴുതുമ്പോൾ സാധാരണയായി കീവേഡുകൾ മുഴുവൻ അപ്പർകേസ് അക്ഷരങ്ങളിൽ എഴുതുന്നു. മുകളിൽ കാണിച്ച ക്വെറി എല്ലാ നഗരങ്ങളും പ്രദർശിപ്പിക്കും. നമുക്ക് ന്യൂസിലാൻഡിലെ നഗരങ്ങൾ മാത്രം കാണിക്കണമെന്ന് കരുതാം. ഫിൽട്ടർ വേണം. SQL-ൽ ഇതിന് `WHERE` എന്ന കീവേഡ് ഉപയോഗിക്കുന്നു, അർത്ഥം "എവിടെ എന്തെങ്കിലും സത്യമാണെങ്കിൽ". ```sql SELECT city FROM cities WHERE country = 'New Zealand'; -- Output: -- Auckland ``` ## ഡാറ്റ ജോയിൻ ചെയ്യൽ ഇതുവരെ നാം ഒരു ടേബിളിൽ നിന്നുള്ള ഡാറ്റ പുനഃപ്രാപിച്ചു. ഇപ്പോൾ **cities** ഉം **rainfall** ഉം ഉള്ള ഡാറ്റ ഒന്നിച്ച് കൊണ്ടുവരണം. ഇത് *ജോയിൻ* ചെയ്യലിലൂടെ സാധിക്കും. രണ്ട് ടേബിളുകൾ തമ്മിൽ ഒരു സീം സൃഷ്ടിച്ച്, ഓരോ ടേബിളിലെ ഒരു കോളത്തിലെ മൂല്യങ്ങൾ പൊരുത്തപ്പെടുത്തും. നമ്മുടെ ഉദാഹരണത്തിൽ, **rainfall** ലെ **city_id** കോളവും **cities** ലെ **city_id** കോളവും പൊരുത്തപ്പെടുത്തും. ഇത് മഴവെള്ളത്തിന്റെ മൂല്യം അതിന്റെ നഗരത്തോടൊപ്പം പൊരുത്തപ്പെടുത്തും. നാം ചെയ്യാൻ പോകുന്ന ജോയിൻ ഒരു *ഇൻറർ* ജോയിൻ ആണ്, അർത്ഥം മറ്റൊരു ടേബിളിൽ പൊരുത്തപ്പെടാത്ത നിരകൾ പ്രദർശിപ്പിക്കപ്പെടില്ല. നമ്മുടെ കേസിൽ എല്ലാ നഗരത്തിനും മഴവെള്ളം ഉള്ളതിനാൽ എല്ലാം പ്രദർശിപ്പിക്കും. 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) ## അവലോകനം & സ്വയം പഠനം SQL-ഉം ബന്ധപരമായ ഡാറ്റാബേസ് ആശയങ്ങളും തുടർ പഠനത്തിനായി [Microsoft Learn](https://docs.microsoft.com/learn?WT.mc_id=academic-77958-bethanycheum) ൽ നിരവധി വിഭവങ്ങൾ ലഭ്യമാണ് - [ബന്ധപരമായ ഡാറ്റയുടെ ആശയങ്ങൾ വിവരിക്കുക](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-ന്റെ ഒരു പതിപ്പാണ്) - [Microsoft Learn-ൽ SQL ഉള്ളടക്കം](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) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.