Мақола аз як силсила дар бораи эҷоди лоиҳаи Java (пайвандҳо ба дигар маводҳо дар охир мебошанд). Ҳадафи он таҳлor технологияҳои калидӣ мебошад, ки натиҷааш навиштани боти телеграмма мебошад.
Салом ба ҳама, пиронсолон ва калонсолони ояндаи нармафзор. Тавре ки ман дар қисми қаблӣ гуфтам ( тафтиши вазифаи хонагӣ ), имрӯз маводи нав хоҳад буд. Барои онҳое, ки махсусан ҳавас доранд, ман як вазифаи хонагии ҷолибро кофтаам, то онҳое, ки ҳама чизро медонанд ва онҳое, ки намедонанд, аммо мехоҳанд, ки онро гугл кунанд, машқ кунанд ва маҳорати худро санҷанд. Имрӯз мо дар бораи намудҳои пайвастшавӣ ва пайвастҳо сӯҳбат хоҳем кард.
Маълум буд, ки чӣ гуна намудҳои пайвасти қаблиро дар SQL муқаррар кардан мумкин аст: мо танҳо ID-и онро ба он сабтҳо мегузорем, ки онҳо бисёранд, дуруст? Як кишвар ID-и худро ҳамчун калиди хориҷӣ ба бисёр шаҳрҳо медиҳад. Бо муносибатҳои бисёр ба бисёр чӣ бояд кард ? Ин усул мувофиқ нест. Мо бояд ҷадвали дигареро илова кунем, ки ду ҷадвалро мепайвандад. Масалан, биёед ба MySQL меравем, базаи нави бисёртоманияро эҷод мекунем, ду ҷадвал, муаллиф ва китоб эҷод мекунем, ки танҳо номҳо ва ID-ҳои онҳоро дар бар мегиранд: CREATE DATABASE manytomany; ИСТИФОДА БАРОИ бисьёр; CREATE TABLE муаллиф (id INT AUTO_INCREMENT, ном VARCHAR(100), PRIMARY KEY (id) ); CREATE TABLE book (id INT AUTO_INCREMENT, номи VARCHAR(100), PRIMARY KEY (id) ); Акнун биёед ҷадвали сеюмеро созем, ки аз ҷадвалҳои муаллиф ва китобҳои мо ду калиди хориҷӣ дошта бошад ва ин пайванд беназир хоҳад буд. Яъне, сабтро бо як калидҳо ду маротиба илова кардан ғайриимкон аст: CREATE TABLE authors_x_books ( book_id INT NOT NULL, author_id INT NO NULL, FREIGN KEY (book_id) REFERENCES book(id), FREIGN KEY (author_id) REFERANS муаллифи (id ), UNIQUE (id of book, author_id) ); Дар ин ҷо мо якчанд хусусиятҳои навро истифода бурдем, ки бояд алоҳида шарҳ дода шаванд:
Намудҳои муносибатҳо дар базаи маълумот
Барои фаҳмидани он ки муносибатҳо чист, шумо бояд дар хотир доред, ки калиди хориҷӣ чист. Барои онҳое, ки фаромӯш кардаанд, ба оғози силсила хуш омадед .Як ба бисёр
Биёед мисоли худро бо кишварҳо ва шаҳрҳо ба ёд орем. Маълум аст, ки шаҳр бояд кишваре дошта бошад. Чӣ тавр як кишварро ба шаҳр пайваст кардан мумкин аст? Ба хар як шахр идентификатори (ID) нодири мамлакате, ки ба он тааллук дорад, замима кардан лозим аст: мо ин корро аллакай анчом додем. Инро яке аз намудҳои пайвастҳо меноманд - як ба бисёр (инчунин хуб мебуд, ки versionи англисӣ - як ба бисёр). Ба ибораи дигар, мо метавонем бигӯем: якчанд шаҳрҳо метавонанд ба як кишвар тааллуқ дошта бошанд. Ҳамин тавр шумо бояд онро дар хотир доред: муносибати як ба бисёр. То ҳол равшан аст, дуруст? Агар не, пас ин аст расми аввал аз Интернет: Ин нишон медиҳад, ки муштариён ва фармоишҳои онҳо ҳастанд. Ин маънои онро дорад, ки як муштарӣ метавонад зиёда аз як фармоиш дошта бошад. Як ба бисёр вуҷуд дорад :) Ё мисоли дигар: Се ҷадвал вуҷуд дорад: ношир, муаллиф ва китоб. Ҳар ношире, ки муфлис шудан намехоҳад ва муваффақ шудан мехоҳад, беш аз як муаллиф дорад, оё шумо розӣ нестед? Дар навбати худ, ҳар як муаллиф метавонад зиёда аз як китоб дошта бошад - ба ин ҳам шубҳае нест. Ва ин боз ҳам пайвастани як муаллиф ба китобҳои зиёд, як ношир ба бисёр муаллифон аст . Боз бисьёр мисолхо овардан мумкин аст. Мушкorи дарк дар аввал метавонад танҳо дар омӯхтани тафаккури абстрактӣ бошад: аз берун нигоҳ кардан ба ҷадвалҳо ва таъсири мутақобилаи онҳо.Як ба як (як ба як)
Инро метавон гуфт, ки як ҳолати махсуси муоширати як ба бисёр аст. Ҳолате, ки дар он як сабт дар як ҷадвал танҳо ба як сабти ҷадвали дигар алоқаманд аст. Аз ҳаёт чӣ гуна мисол овардан мумкин аст? Агар бисёрзаниро истисно кунем, пас метавон гуфт, ки дар байни зану шавҳар муносибати як ба як вуҷуд дорад. Ҳарчанд агар бигӯем, ки бисёрзанӣ иҷозат аст, пас ҳар зан метавонад танҳо як шавҳар дошта бошад. Дар бораи падару модарон низ хаминро гуфтан мумкин аст. Ҳар як шахс метавонад танҳо як падари биологӣ ва танҳо як модари биологӣ дошта бошад. Муносибати як ба як равшан. Ҳангоми навиштани ин сухан ба сари ман як фикре омад: пас чаро муносибати як ба якро ба ду сабт дар ҷадвалҳои гуногун тақсим кунед, агар онҳо аллакай муносибати як ба як дошта бошанд? Ман худам ҷавоб ёфтам. Ин сабтҳо инчунин метавонанд ба дигар сабтҳо бо роҳҳои дигар пайваст карда шаванд. Ман дар бораи чӣ гап мезанам? Мисоли дигари робитаҳои як ба як миёни кишвар ва президент аст. Оё дар чадвали «кишвар» тамоми маълумотро дар бораи президент навиштан мумкин аст? Бале, шумо метавонед, SQL чизе намегӯяд. Аммо агар шумо фикр кунед, ки президент ҳам як шахс аст... Ва ӯ низ метавонад зан (муносибати дигари як ба як) ва фарзандон (муносибати як ба бисёр) дошта бошад ва баъд маълум мешавад, ки зарур аст, ки кишвар бо зану фарзандони президент пайваст шавад…. Девона садо медиҳад, дуруст? :D Барои ин алока мисолхои дигар низ овардан мумкин аст. Гузашта аз ин, дар чунин вазъият, шумо метавонед калиди хориҷиро ба ҳарду ҷадвал илова кунед, бар хилофи муносибати як ба бисёр.Бисёр-ба-бисёр
Аллакай дар асоси ном, шумо метавонед тахмин кунед, ки мо дар бораи чӣ сӯҳбат хоҳем кард. Аксар вақт дар ҳаёт ва мо ҳаёти худро барномарезӣ мекунем, ҳолатҳое мешаванд, ки намудҳои дар боло зикршуда барои тавсифи чизҳои ба мо зарурӣ кофӣ нестанд. Мо аллакай дар бораи нашриёт, китоб ва муаллифон сухан ронда будем. Дар ин ҷо робитаҳои зиёд вуҷуд доранд... Ҳар як нашрия метавонад якчанд муаллиф дошта бошад - алоқаи як ба бисёр. Дар баробари ин, хар як муаллиф метавонад чанд ношир дошта бошад (чаро не, нависанда дар як чо нашр шуд, барои пул чанг кард, масалан, ба нашриёти дигар рафт). Ва ин боз як муносибати як ба бисёр аст. Ё ин ки: ҳар як муаллиф метавонад якчанд китоб дошта бошад, аммо ҳар як китоб метавонад якчанд муаллиф дошта бошад. Боз, муносибати як ба бисёр байни муаллиф ва китоб, китоб ва муаллиф. Аз ин мисол мо метавонем хулосаи бештар расмӣ барем:
Агар мо ду ҷадвали А ва В дошта бошем. A метавонад ба B ҳамчун як ба бисёр алоқаманд бошад. Аммо B инчунин метавонад ба А, чунон ки яке ба бисёриҳо дахл дорад. Ин маънои онро дорад, ки онҳо муносибати бисёр ба бисёр доранд. |
- NO NULL маънои онро дорад, ки майдон бояд ҳамеша пур карда шавад ва агар мо ин тавр накунем, SQL ба мо мегӯяд;
- UNIQUE мегӯяд, ки майдон ё як қатор майдонҳо бояд дар ҷадвал беназир бошанд. Аксар вақт рӯй медиҳад, ки ба ғайр аз идентификатори беназир, як майдони дигар барои ҳар як сабт бояд беназир бошад. Ва UNIQUE маҳз барои ин масъала масъул аст.
Пайвастшавӣ (пайвастшавӣ)
Дар қисми қаблӣ, ман шуморо омода карда будам, ки фавран фаҳмед, ки ҳамроҳшавӣ чист ва онҳоро дар куҷо истифода баред. Зеро ман боварии амиқ дорам, ки баробари фаро расидани фаҳмиш ҳама чиз дарҳол хеле содда мешавад ва ҳама мақолаҳо дар бораи пайвастшавӣ мисли чашми кӯдак равшан хоҳанд шуд :D Тахминан ва умуман, пайвастанҳо аз якчанд ҷадвалҳо ба воситаи воситаҳо натиҷа мегиранд. аз JOIN (ҳамроҳ шудан аз забони англисӣ join). Ва ин ҳама...) Ва барои ҳамроҳ шудан, шумо бояд майдонеро, ки дар он ҷадвалҳо пайваст карда мешаванд, муайян кунед. Иблис он қадар даҳшатнок нест, ки вай ранг карда шудааст, дуруст?) Баъдан, мо танҳо дар бораи он сӯҳбат мекунем, ки кадом намудҳои пайвастшавӣ вуҷуд доранд ва чӣ гуна истифода бурдани онҳо. Намудҳои пайвастагиҳо зиёданд ва мо ҳамаи онҳоро баррасӣ намекунем. Танҳо онҳое, ки ба мо воқеан лозиманд. Аз ин рӯ, мо ба чунин пайвастагиҳои экзотикӣ, ба монанди Cross and Natural, таваҷҷӯҳ зоҳир намекунем. Ман комилан фаромӯш кардам, мо бояд як нозукии дигарро дар хотир дорем: ҷадвалҳо ва майдонҳо метавонанд тахаллусҳо - тахаллус дошта бошанд. Онҳо барои пайвастшавӣ ба осонӣ истифода мешаванд. Масалан, шумо метавонед ин корро кунед: SELECT * FROM table1; агар дархост аксар вақт table1-ро истифода барад, шумо метавонед ба он тахаллус диҳед: SELECT* FROM table1 ҳамчун t1; ё ҳатто осонтар навиштан: SELECT * FROM table1 t1; ва баъдтар дар дархост t1-ро ҳамчун тахаллус барои ин ҷадвал истифода бурдан мумкин аст .ҲАМРОҲИИ ДОХИЛӢ
Пайвастшавӣ маъмултарин ва оддӣ. Дар он гуфта мешавад, ки вақте ки мо ду ҷадвал ва майдоне дорем, ки тавассути он онро пайваст кардан мумкин аст, ҳамаи сабтҳое, ки муносибатҳои онҳо дар ду ҷадвал вуҷуд доранд, интихоб карда мешаванд. Бо кадом рох гуфтан душвор буд. Биёед мисолро дида бароем: Биёед ба базаи шаҳрҳои худ як сабт илова кунем. Як вуруд барои шаҳрҳо ва дигаре барои кишварҳо: $ INSERT INTO INTO VALUES (5, "Ӯзбекистон", 34036800); ва $ INSERT INTO шаҳр (ном, аҳолӣ) VALUES (“Тбorси”, 1171100); Мо кишвареро илова кардем, ки дар ҷадвали мо шаҳре надорад ва шаҳре, ки дар ҷадвали мо бо кишваре алоқаманд нест. Ҳамин тавр, INNER JOIN ба додани ҳама сабтҳо барои он пайвастҳо, ки дар ду ҷадвал ҷойгиранд, машғул аст. Вақте ки мо мехоҳем ба ду ҷадвали table1 ва table2 пайваст шавем, синтаксиси умумӣ чунин менамояд: SELECT * FROM table1 t1 INNER JOIN table2 ON t1.id = t2.t1_id; ва он гоҳ ҳама сабтҳое, ки дар ду ҷадвал робита доранд, баргардонида мешаванд. Барои ҳолати мо, вақте ки мо мехоҳем, ки дар баробари шаҳрҳо маълумотро барои кишварҳо гирем, он чунин мешавад: $ SELECT * FROM city ci INNER JOIN country co ON ci.country_id = co.id; Дар ин чо, гарчанде номхо якхела бошанд хам, равшан дида мешавад, ки дар навбати аввал майдонхои шахрхо, баъд сахрохои кишвархо меоянд. Аммо ду сабте, ки мо дар боло илова кардем, дар он ҷо нестанд. Зеро маҳз ҳамин тавр INNER JOIN кор мекунад.ЧАП ХАМРОХ
Ҳолатҳое вуҷуд доранд ва аксар вақт, ки мо аз гум шудани майдонҳои ҷадвали асосӣ қаноатманд намешавем, зеро дар ҷадвали ҳамсоя сабти он вуҷуд надорад. Ин аст он чизест, ки ҶАҲОНИ ЧАП барои он аст. Агар дар дархости қаблии худ мо ба ҷои ИННЕР ЧАПро нишон диҳем, мо дар ҷавоб шаҳри дигарро илова мекунем - Тбorси: $ SELECT * FROM city ci LEFT JOIN country co ON ci.country_id = co.id; Воридоти нав дар бораи Тбorси вуҷуд дорад ва ҳама чизе, ки ба ин кишвар марбут аст, беэътибор аст . Аксар вақт ин тавр истифода мешавад.ДУРУСТ ХАМРОХ
Дар ин ҷо фарқият аз LEFT JOIN дар он хоҳад буд, ки ҳама майдонҳо на аз тарафи чап, балки дар рости пайваст интихоб карда мешаванд. Яъне, на шаҳрҳо, балки ҳамаи кишварҳо гирифта мешаванд: $ ИНТИХОБ * АЗ шаҳр ci ҲУҚУҚ ҲАМРОХ БА кишвар co ON ci.country_id = co.id; Акнун маълум аст, ки дар ин сурат Тбorси нест, вале мо Узбакистонро дорем. Чизе монанди ин…))Таъмини пайвастагиҳо
Ҳоло ман мехоҳам ба шумо як тасвири маъмулиро нишон диҳам, ки наврасон пеш аз мусоҳиба ба онҳо боварӣ мебахшанд, ки онҳо моҳияти пайвастшавиро мефаҳманд: Дар ин ҷо ҳама чиз дар шакли маҷмӯаҳо нишон дода шудааст, ҳар як давра як ҷадвал аст. Ва он ҷойҳое, ки дар он ранг карда шудааст, он қисмҳое мебошанд, ки дар SELECT нишон дода мешаванд. Биёед бубинем:- INNER JOIN танњо буриши маљмўъњо, яъне он сабтњоест, ки ба ду љадвал - А ва В пайваст мешаванд;
- LEFT JOIN ҳамаи сабтҳои ҷадвали А, аз ҷумла ҳамаи сабтҳои ҷадвали B, ки бурриш (пайванд) бо A доранд;
- RIGHT JOIN комилан муқобor ҶАП ҶАҲОН аст - ҳама сабтҳо дар ҷадвали B ва сабтҳо аз А, ки робита доранд.
Вазифаи хонагӣ
Ин дафъа вазифаҳо хеле ҷолиб хоҳанд буд ва ҳамаи онҳое, ки онҳоро бомуваффақият ҳал мекунанд, итминон дошта метавонанд, ки онҳо омодаанд ба кор дар тарафи SQL оғоз кунанд! Супоришҳо канда нашудаанд ва барои хонандагони синфҳои миёна навишта шудаанд, бинобар ин барои шумо осон ва дилгиркунанда нахоҳад буд :) Ман ба шумо як ҳафта вақт медиҳам, ки супоришҳоро худатон иҷро кунед ва баъд мақолаи алоҳида бо таҳлor муфассал нашр мекунам. дар бораи халли вазифахое, ки ман ба шумо додам.Вазифаи воқеӣ:
- Барои сохтани ҷадвали 'Student' бо майдонҳои зерин скрипти SQL нависед: id (калиди ибтидоӣ), ном, насаб, почтаи электронӣ (нодир).
- Барои сохтани ҷадвали 'Китоб' бо майдонҳои зерин скрипти SQL нависед: id, унвон (id + унвон = калиди ибтидоӣ). Пайванди "Донишҷӯ" ва "Китоб" -ро бо муносибати "Донишҷӯ" як ба бисёр "Китоб".
- Барои сохтани ҷадвали 'Муаллим' бо майдонҳои зерин скрипти SQL нависед: id (калиди ибтидоӣ), ном, насаб, почтаи электронӣ (нодир), мавзӯъ.
- Пайванди "Донишҷӯ" ва "Муаллим" -ро бо муносибати "Донишҷӯ"-и бисёр-ба-бисёр Муаллим'.
- "Донишҷӯ" -ро интихоб кунед, ки дар насабашон "оро" дорад, масалан "Сид оро в", "В оро новски".
- Аз ҷадвали 'Student' ҳамаи насабҳо ('familia_name') ва шумораи такрори онҳоро интихоб кунед. Ба назар гиред, ки дар базаи маълумотҳо номҳо мавҷуданд. Аз рӯи миқдор бо тартиби кам ҷудо кунед. Он бояд чунин бошад:
насаб миқдор Peterов 15 Ivanов 12 Сидоров 3 - 3 номҳои бештар такроршавандаро аз 'Student' интихоб кунед. Аз рӯи миқдор бо тартиби кам ҷудо кунед. Он бояд чунин бошад:
ном миқдор Искандар 27 Сергей 10 Peterус 7 - "Донишҷӯён" -ро интихоб кунед, ки шумораи бештари "Китоб" ва "Муаллим"-ро доранд. Аз рӯи миқдор бо тартиби кам ҷудо кунед. Он бояд чунин бошад:
Surname_муаллим Номи_насаби донишҷӯ Миқдори китоб Peterов Сидоров 7 Ivanов Смит 5 Peterов Канкава 2> - 'Муаллим'-ро, ки шумораи бештари 'Китоб'-ро аз тамоми 'Шогирдаш' дорад, интихоб кунед. Аз рӯи миқдор бо тартиби кам ҷудо кунед. Он бояд чунин бошад:
Surname_муаллим Миқдори китоб Peterов 9 Ivanов 5 - "Муаллим" -ро интихоб кунед, ки шумораи "Китоб" барои ҳамаи "Шогирди" ӯ аз 7 то 11 аст. Аз рӯи миқдор бо тартиби кам ҷудо кунед. Он бояд чунин бошад:
Surname_муаллим Миқдори китоб Peterов ёздаҳ Сидоров 9 Ivanов 7 - Ҳама 'ном_насаб' ва 'ном'-и ҳама 'Муаллим' ва 'Донишҷӯ'-ро бо майдони 'навъ' (донишҷӯ ё муаллим) чоп кунед. Аз рӯи алифбо аз рӯи 'name_name' мураттаб кунед. Он бояд чунин бошад:
насаб навъи Ivanов донишҷӯ Канкава муаллим Смит донишҷӯ Сидоров муаллим Peterов муаллим - Ба ҷадвали мавҷудаи 'Student' сутуни "ставка" илова кунед, ки курси ҳозираи донишҷӯро нигоҳ медорад (қимати ададӣ аз 1 то 6).
- Ин адад зарур нест, балки як плюс хоҳад буд. Функсияеро нависед, ки аз тамоми "Китобҳо" мегузарад ва ҳама "унвонҳо" -ро бо вергул ҷудо карда мебарорад.
GO TO FULL VERSION