Дерекқор жасақтамасында жасалған қателер

Сіз жүздеген жазбаларды немесе миллиондаған жазбаларды ұстайтын дерекқормен жұмыс жасайсыз ба, тиісті дерекқор жасау әрдайым маңызды. Ол ақпаратты оңай шығарып қана қоймай, болашақта дерекқорды кеңейтуді жеңілдетеді. Өкінішке орай, болашақта қиындықтар тудыруы мүмкін бірнеше тұзаққа түсу оңай.

Дерекқорды қалыпқа келтіру тақырыбында жазылған барлық кітаптар бар, бірақ егер бұл жай қателерден аулақ болсаңыз, дұрыс деректер базасын жасау үшін дұрыс жолда боласыз.

Дерекқор қатесі № 1: Кестеде қайталанатын өрістер

Жақсы дерекқордың дизайны үшін негізгі ереже қайталанатын деректерді тану және қайталанатын бағандарды өз кестесінде орналастыру болып табылады. Кестеде қайталанатын өрістер электрондық кестелер әлемінен келген адамдар үшін ортақ, бірақ электрондық кестелер дизайн бойынша тегіс болғанымен, дерекқорлар реляциялық болуы керек. Ол 2D-ден 3D-ге дейін барады.

Бақытымызға орай, қайталанатын өрістер, әдетте, оңай байқалады. Осы кестеге қарап:

Тапсырыс идентификаторы Өнім1 Өнім2 Өнім3
1 Тедди Аюрс Jelly Beans
2 Jelly Beans

Тапсырыста төрт өнім болғанда не болады? Үшден астам өнімді қолдау үшін кестеге тағы бір өрісті қосу керек. Егер деректерді енгізуге көмектесу үшін кестеге айналған клиенттік қосымшаны салсақ, оны жаңа өнім өрісімен өзгерту қажет болуы мүмкін. Және бұйрықта Jellybeans-дің барлық тапсырыстарын қалай табуға болады? Кестедегі әрбір өнім өрісін сұратуға мәжбүр боламыз: SELECT * FROM Өнімдер WHERE Product1 = 'Jelly Beans' OR Product2 = 'Jelly Beans' OR PRODUCT3 = 'Jelly Beans'.

Барлық мәліметтерді біріктіретін бір кестені құрастырудың орнына бізде әрқайсысы нақты ақпаратқа ие үш кесте болуы керек. Бұл мысалда Тапсырыс кестесін тапсырыс туралы ақпаратты, барлық өнімдеріміз бар Өнімдер кестесін және өнімді тапсырысқа байланыстыратын ProductOrders планшетін алғымыз келеді.

Тапсырыс идентификаторы CustomerID Тапсырыс күні Барлығы
1 7 1/24/17 19.99
2 9 1/25/17 24.99
ProductID Өнім Count
1 Тедди Аюрс 1
2 Jelly Beans 100
ProductOrderID ProductID Тапсырыс идентификаторы
101 1 1
102 2 1

Әр кестенің өзінің бірегей ID өрісі бар екенін ескеріңіз. Бұл негізгі кілт. Кестелерді басқа кілтдегі сыртқы кілт сияқты бастапқы кілт мәнімен байланыстырамыз. Негізгі пернелер және шетел кілттері туралы қосымша ақпарат.

Дерекқор қатесі № 2: Кестедегі кестені ендіру

Бұл тағы бір қателік болып табылады, бірақ ол әрдайым қайталанатын өрістер сияқты әрдайым ерекшеленбейді. Дерекқорды жасаған кезде, кестедегі барлық деректердің өзімен байланысты екенін тексергіңіз келеді. Бұл баланың басқа нәрсені табу туралы ойына ұқсас. Егер сізде банан, құлпынай, шабдалы және теледидар болса, онда теледидар басқа жерде де болуы мүмкін.

Сол сызықтармен қатар, сіз сатылымдар кестесі бар адамдар болса, сол кестедегі барлық ақпарат сол сатушыға қатысты болуы керек. Осы сатушы адам үшін ерекше емес кез-келген қосымша ақпарат сіздің дерекқорыңызда болуы мүмкін.

SalesID Біріншіден Соңғы Мекенжай Телефон нөмірі Office OfficeNumber
1 Сам Эллиот 118 Main St, Остин, Техас қ (215) 555-5858 Остин орталығы (212) 421-2412
2 Алиса Смит 504 2nd Street, New York, NY (211) 122-1821 Нью-Йорк (Шығыс) (211) 855-4541
3 Джо Парыз 428 Акер С, Остин, Техас (215) 545-5545 Остин орталығы (212) 421-2412

Бұл кесте жеке сауда өкіліне қатысты болғанымен, кестеде көрсетілген кесте бар. Office және OfficeNumber «Austin Downtown» -мен қалай қайталанатынын ескеріңіз. Қызметтік телефон нөмірі өзгерсе не болады? Деректердің біртұтас бөлшегінің өзгеруі үшін барлық деректер жиынтығын жаңартыңыз, бұл ешқашан жақсы нәрсе емес. Бұл өрістерді өз кестесіне жылжыту керек.

SalesID Біріншіден Соңғы Мекенжай Телефон нөмірі OfficeID
1 Сам Эллиот 118 Main St, Остин, Техас қ (215) 555-5858 1
2 Алиса Смит 504 2nd Street, New York, NY (211) 122-1821 2
3 Джо Парыз 428 Акер С, Остин, Техас (215) 545-5545 1
OfficeID Office OfficeNumber
1 Остин орталығы (212) 421-2412
2 Нью-Йорк (Шығыс) (211) 855-4541

Дизайнердің бұл түрі сізге Office үстеліне қосымша ақпаратты қосу мүмкіндігін береді, бұл сату адамының кестесіндегі үйлесімділік қасіретін жасамайды. Көше мекен-жайын, қаланың, мемлекеттің және пошталық индекстердің жай-күйін қадағалаудың қаншалықты жұмысты атқаратындығын елестетіп көріңіз, егер бұл ақпарат сатушының жеке кестесінде болса!

Дерекқордың қатесі № 3: Бір немесе бірнеше өріске ақпарат беру

Кеңсе туралы ақпаратты сатушының жеке кестесіне ендіру сол дерекқормен жалғыз емес проблема болған жоқ. Мекенжай өрісінде үш бөлік ақпарат бар: көше мекен-жайы, қала және мемлекет. Дерекқордағы әр өрісте тек бір ғана ақпарат болуы керек. Бір өрістегі ақпараттың бірнеше бөлігіне ие болғанда, дерекқорға ақпаратты сұрату қиын болуы мүмкін.

Мысалы, егер біз Остиндегі барлық сатушыларға сұрауды іске қосқымыз келсе не істеу керек? Бізге мекен-жай бойынша іздеу керек, ол тек тиімсіз, бірақ жаман ақпарат қайтара алады. Өйткені, егер біреу Портленд, Орегон штатындағы Остин көшесінде тұрса не болды?

Кесте келесідей көрінуі керек:

SalesID Біріншіден Соңғы Мекен-жай 1 Мекенжай2 Қала Мемлекет Zip Телефон
1 Сам Эллиот 118 Негізгі Остин TX 78720 2155555858
2 Алиса Смит 504 2-ші қ Нью Йорк NY 10022 2111221821
3 Джо Парыз 428 Ақер қ 304-сурет Остин TX 78716 2155455545

Мұнда айтатын бірнеше нәрсе бар. Біріншіден, «Мекенжай1» және «Мекенжай2» қайталанатын өрістер қателігіне ұқсайды.

Дегенмен, бұл жағдайда олар жеке кестеге кіретін деректердің қайталанатын тобына емес, сатушыға тікелей қатысты деректердің жеке бөліктеріне сілтеме жасайды.

Сондай-ақ, бонустық қате болдырмау үшін телефон нөміріне арналған форматтау кестеден қалай алынатынын байқаңыз. Мүмкіндігінше, өрістердің форматы сақталмауы керек. Телефон нөмірлерінде адамдар 215-555-5858 немесе (215) 555-5858 телефон нөмірін бірнеше жолмен жазады. Бұл сатушыдан телефон нөмірімен іздейді немесе сол аймақ кодының сатушыларын іздеуді қиындатады.

Дерекқорға Қателік # 4: Түпнұсқа негізгі кілтін пайдаланбаңыз

Көптеген жағдайларда негізгі кілтіңіз үшін автоматты түрде көбейтетін нөмірді немесе басқа жасалынған нөмірді немесе әріптік-сандық пайдаланғыңыз келеді. Жақсы идентификатор жасау сияқты көрінсе де, бастапқы кілт үшін кез-келген нақты ақпаратты пайдаланудан аулақ болу керек.

Мысалы, бізде әрқайсымыз өзіміздің жеке әлеуметтік сақтандыру нөміріміз бар, сондықтан қызметкерлердің деректер базасына әлеуметтік қауіпсіздік нөмірін пайдалану жақсы идея сияқты көрінуі мүмкін. Бірақ сирек болса да, әлеуметтік қауіпсіздік нөмірінің өзгеруі мүмкін және біз ешқашан негізгі кілтті өзгертуді қаламаймыз.

Және бұл шын мәніндегі ақпаратты негізгі құндылық ретінде пайдаланудағы проблема. Ол өзгеруі мүмкін.

Дерекқор қатесі №5: атау туралы конвенцияны пайдаланбайды

Бұл деректер базасын жобалауды алғаш бастаған кезде үлкен мәміле сияқты көрінбеуі мүмкін, бірақ ақпарат алу үшін дерекқорға қатысты сұраулар жазу нүктесіне жеткеннен кейін, атау туралы конвенция жасай отырып, өріс атауларын есте сақтаңыз.

Аттардың аты, LastName бір кестеде және бірінші_мән, басқа кестедегі last_name аттарында сақталған кезде бұл процестің қаншалықты күрделі екенін елестетіңіз.

Ең танымал екі атау конвенциясы өрістегі әрбір сөздің бірінші әріпін немесе астын сызу арқылы бөлектеу сөздерін бас әріппен жазады. Кейбір әзірлеушілер бірінші сөзден басқа әр сөздің бірінші әрпін бас әріппен жазуға болады: firstName, lastName.

Сондай-ақ, сіз сингулярлы кесте атауларын немесе көпше кесте атауларын пайдалану туралы шешім қабылдағыңыз келеді. Тапсырыс кестесі немесе тапсырыстар кестесі ма? Клиент кестесі немесе тұтынушылар кестесі ма? Тағы да сіз Тапсырыс кестесімен және Тапсырыс берушілер кестесімен тоқталғыңыз келмейді.

Сіз таңдаған атау туралы конвенция атау туралы конвенцияны іс жүзінде таңдап алу және жабысу процесі сияқты маңызды емес.

Дерекқор қатесі № 6: дұрыс емес индекстеу

Индекстеу - дұрыс шешім қабылдау үшін ең қиын нәрселердің бірі. Барлық негізгі кілттер және шетелдік кілттер индекстелуі керек. Бұл сілтеме кестелерін біріктіреді, сондықтан индекссіз, сіздің дерекқорыңыздың нашар өнімділігін көресіз.

Бірақ басқа да өрістер өте жиі жіберілмейді. Бұл «WHERE» өрісі. Егер сіз жиі WHERE тармағындағы өрісті пайдалана отырып, іздеуді тарылтатын болсаңыз, осы өріске индексті қою туралы ойланғыңыз келеді. Дегенмен, сіз кестені индексациялауды қаламайсыз, ол өнімділікті бұзуы мүмкін.

Қалай шешуге болады? Бұл дерекқордың дизайн өнерінің бөлігі. Кестеге қанша индексті қою керектігі туралы ешқандай шектеулер жоқ. Ең алдымен, WHERE тармағында жиі пайдаланылатын кез келген өрісті индекстеп көргіңіз келеді. Дерекқорыңызды дұрыс индекстеу туралы қосымша ақпарат алыңыз.