SQL vs NoSQL. Ո՞ր տվյալների բազան պետք է օգտագործի ձեր ծրագիրը
SQL տվյալների բազաները (կոչվում են նաև հարաբերական) տվյալները պահում են սահմանված կառուցվածքով աղյուսակներում՝ տողերով և սյունակներով, և կապում են առնչվող աղյուսակները։ Հարցումները կատարվում են SQL լեզվով։ Օրինակներ են Postgres-ը, MySQL-ը և SQLite-ը։ NoSQL տվյալների բազաները տվյալները պահում են այլ եղանակներով՝ փաստաթղթեր, բանալի-արժեք զույգեր, լայն սյունակներ կամ գրաֆներ, և սովորաբար թույլ են տալիս ավելի ճկուն կառուցվածք։ Օրինակներ են MongoDB-ն, Redis-ը, DynamoDB-ն և Firestore-ը։ Բիզնես ծրագրերի մեծամասնության համար SQL տվյալների բազան խելամիտ լռելյայն ընտրություն է, իսկ NoSQL-ը փայլում է կոնկրետ խնդիրների մեջ։
Ինչու է այս ընտրությունը կարևոր AI-ով կառուցելիս
Տվյալների բազան հետագայում փոխելու ամենադժվար մասերից մեկն է ծրագրում։ Էկրանները կարելի է վերաձևավորել մեկ կեսօրում. տարիների հաճախորդների տվյալները մեկ այլ տեսակի տվյալների բազա տեղափոխելը նախագիծ է։
Երբ AI ծրագրերի կառուցողը տվյալների պահոց է ավելացնում ձեզ համար, նա ընտրում է այս տարբերակներից մեկը։ Տարբերությունը իմանալը օգնում է ձեզ.
- Հասկանալ, թե ինչ տեսք ունեն ձեր տվյալները և կարող են արդյոք պատասխանել այն հարցերին, որոնք հետագայում կտաք («եկամուտը ամսական ըստ ապրանքի»)։
- Գնահատել հարթակների ընտրությունը. Որոշ հարթակներ կառուցված են փաստաթղթային տվյալների բազայի, մյուսները՝ հարաբերականի վրա։ Տե՛ս Supabase vs Firebase՝ յուրաքանչյուրի հայտնի օրինակի համար։
- Խուսափել կախվածությունից։ SQL-ը ընդհանուր ստանդարտ է, ուստի հարաբերական տվյալները սովորաբար ավելի հեշտ է տեղափոխել մատակարարների միջև։
Ամենօրյա անալոգիա
SQL տվյալների բազան նման է խիստ սյունակներով մանրակրկիտ նախագծված աղյուսակների շարքի. մեկ թերթ՝ հաճախորդների, մեկ՝ պատվերների, և յուրաքանչյուր պատվերի տող ID-ով ցույց է տալիս հաճախորդի տողին։ Թերթի յուրաքանչյուր տող ունի նույն սյունակները։ Պլանավորում է պահանջում, բայց հարցեր տալը թերթերի միջև հեշտ է, և տվյալները մնում են կարգավորված։
NoSQL փաստաթղթային տվյալների բազան նման է թղթապանակների արկղի։ Յուրաքանչյուր հաճախորդի թղթապանակում կարող են միասին լինել նրա տվյալները և պատվերները, և մի թղթապանակում կարող են լինել լրացուցիչ թղթեր, որոնք մյուսներում չկան։ Մեկ հաճախորդի ամբողջ պատմությունը արագ է ստանալ։ Պատասխանել «ի՞նչ պատվիրեցին բոլորը անցյալ ամիս» հարցին նշանակում է բացել շատ թղթապանակներ։
Իրական տարբերությունները
| SQL (հարաբերական) | NoSQL | |
|---|---|---|
| Տվյալների ձև | Սահմանված սյունակներով աղյուսակներ | Փաստաթղթեր, բանալի-արժեք, լայն սյունակներ կամ գրաֆներ |
| Կառուցվածք | Սխեման սահմանվում է նախապես, փոխվում է միգրացիաներով | Հաճախ ճկուն. կառուցվածքը պարտադրվում է ծրագրի կոդով, եթե պարտադրվում է ընդհանրապես |
| Կապեր | Ներկառուցված են. արտաքին բանալիներ և միացումներ | Սովորաբար լուծվում են տվյալների ներդրմամբ կամ ծրագրի կոդով |
| Հարցումների լեզու | SQL, ընդհանուր ստանդարտ | Յուրաքանչյուր արտադրանքի համար տարբեր |
| Հետևողականություն | Ուժեղ գործարքները ստանդարտ են | Կախված է արտադրանքից և կարգավորումներից. շատերը այժմ առաջարկում են գործարքներ |
| Մասշտաբավորում | Ավանդաբար մեծանում է ուղղահայաց (ավելի մեծ սերվեր). հորիզոնական մասշտաբավորումը հնարավոր է, բայց ավելի դժվար | Շատերը նախագծված են բաշխվելու շատ սերվերների վրա |
| Լավ է | Բիզնես տվյալներ, հաշվետվություններ, ամեն ինչ շատ կապերով | Շատ մեծ ծավալի պարզ գրառումներ, քեշավորում, ճկուն բովանդակություն |
| Օրինակներ | Postgres, MySQL, SQLite, SQL Server | MongoDB, Redis, DynamoDB, Firestore, Cassandra, Neo4j |
«NoSQL»-ը մեկ բան չէ։ Հիմնական տեսակները.
| Տեսակ | Ինչպես է պահում տվյալները | Սովորական օգտագործում |
|---|---|---|
| Փաստաթղթային (MongoDB, Firestore) | JSON-ի նման փաստաթղթեր | Բովանդակություն, կատալոգներ, տարբեր գրառումներով ծրագրեր |
| Բանալի-արժեք (Redis, DynamoDB) | Արժեք, որը փնտրվում է բանալիով | Քեշավորում, սեսիաներ, հաշվիչներ |
| Լայն սյունակ (Cassandra) | Տողեր՝ ճկուն սյունակների հավաքածուներով | Հսկայական գրառումներով տվյալների բազմաթիվ խմբեր |
| Գրաֆ (Neo4j) | Հանգույցներ և կապեր | Սոցիալական ցանցեր, առաջարկություններ |
Աշխատած օրինակ. նույն խանութի տվյալները երկու եղանակով
Վերցրեք փոքր առցանց խանութ, հաճախորդ և նրա պատվերները։
SQL (հարաբերական). տվյալները բաժանված են աղյուսակների և կապված են ID-ներով։
-- customers: id=1, name='Lena Ortiz'
-- orders: id=101, customer_id=1, total=42.00
-- id=103, customer_id=1, total=25.00
SELECT c.name, SUM(o.total)
FROM customers c JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
Եթե Լենան փոխում է իր էլ. փոստը, այն փոխվում է մեկ տեղում։ «Ամսվա վաճառքների գումարը յուրաքանչյուր հաճախորդի համար» հարցումը մեկ հարցում է։
NoSQL (փաստաթուղթ). նրա պատվերները կարող են գտնվել իր փաստաթղթի ներսում։
{
"_id": "cust_1",
"name": "Lena Ortiz",
"email": "lena@example.com",
"orders": [
{ "id": 101, "total": 42.00, "items": ["Green tea"] },
{ "id": 103, "total": 25.00, "items": ["Teapot"] }
]
}
Նրա պրոֆիլի էջը բոլոր պատվերներով բեռնելը մեկ ընթերցում է։ Բայց հարցերը, որոնք անցնում են բոլոր հաճախորդների վրայով՝ ամսվա ամենավաճառվող ապրանքը, ավելի շատ աշխատանք են պահանջում, և եթե նույն ապրանքի տվյալները պատճենվում են շատ պատվերներում, դրանց համաժամեցումը դառնում է ծրագրի խնդիր։
Ոչ մեկն սխալ չէ։ Հարցն այն է, թե որ օրինաչափությամբ է ձեր ծրագիրը աշխատում առավել հաճախ։
Ինչպես ընտրել
Հարաբերական SQL տվյալների բազան սովորաբար ճիշտ լռելյայն ընտրությունն է, եթե.
- Ձեր տվյալներն ունեն շատ կապեր. օգտատերեր, թիմեր, ամրագրումներ, հաշիվներ, ապրանքներ։
- Ձեզ անհրաժեշտ կլինեն հաշվետվություններ, զտիչներ և գումարներ գրառումների վրա։
- Ճշգրտությունը կարևոր է. գումար, պաշարի մակարդակ, թույլտվություններ։
NoSQL տվյալների բազան արժե դիտարկել, եթե.
- Ձեզ անհրաժեշտ է արագ քեշ կամ սեսիայի պահոց. այստեղ հաճախ օգտագործվում է Redis-ը, սովորաբար SQL տվյալների բազայի կողքին։
- Ձեր գրառումները թվով շատ են, պարզ են և անկախ, ինչպես իրադարձությունների մատյանները կամ սենսորների ընթերցումները։
- Դուք աշխատում եք մի հարթակի վրա, որը կառուցված է դրա շուրջ, օրինակ՝ Firebase-ի Firestore-ը, և նրա իրական ժամանակի հնարավորությունները հիմնական գրավչությունն են։
Շատ ծրագրեր օգտագործում են երկուսն էլ. SQL-ը՝ որպես հիմնական ճշմարտության աղբյուր, իսկ NoSQL պահոցը՝ քեշավորման կամ կոնկրետ հատկանիշի համար։
Հիմնական տերմիններ
| Տերմին | Նշանակություն |
|---|---|
| Հարաբերական տվյալների բազա | Կապված աղյուսակներից բաղկացած SQL տվյալների բազա։ |
| Սխեմա | Տվյալների սահմանված կառուցվածքը։ |
| Միացում (join) | Երկու աղյուսակների առնչվող տողերի համադրում մեկ հարցումում։ |
| Փաստաթուղթ | Ինքնուրույն, JSON-ի նման գրառում փաստաթղթային տվյալների բազայում։ |
| Դենորմալիզացիա | Տվյալների պատճենումը մի քանի տեղում՝ ավելի արագ ընթերցման համար։ |
| ACID | Երաշխիքներ, որ գործարքները հուսալի են. ամբողջը կամ ոչինչ, հետևողական, մեկուսացված և մշտական։ |
| Հորիզոնական մասշտաբավորում | Տվյալների բաշխում շատ սերվերների վրա, այլ ոչ թե մեկ ավելի մեծի։ |
Տարածված սխալ պատկերացումներ
- «NoSQL-ը նշանակում է առանց սխեմայի». Ձեր տվյալներն միշտ ունեն ձև։ NoSQL-ում տվյալների բազան կարող է այն չպարտադրել, ուստի ձեր կոդը պետք է դա անի։
- «SQL-ը չի մասշտաբավորվում». Հարաբերական տվյալների բազաները աշխատեցնում են շատ մեծ ծառայություններ։ Շատ ծրագրեր երբեք չեն մոտենում իրենց սահմաններին։
- «NoSQL-ը միշտ արագ է». Միայն այն օրինաչափությունների համար, որոնց համար այն նախագծված է։ Բազմաբնույթ հաշվետվությունը կարող է դանդաղ լինել։
- «Պետք է ընտրեք մեկը հավիտյան». Շատ ծրագրեր համատեղում են երկուսը։ Իսկ Postgres-ի նման SQL տվյալների բազաները նույնպես պահում են JSON, ուստի մի քանի ճկուն դաշտեր չեն պահանջում NoSQL։
- «NoSQL-ը նշանակում է, որ չեք կարող օգտագործել SQL». Անունը սովորաբար կարդում են որպես «ոչ միայն SQL», և որոշ NoSQL արտադրանքներ առաջարկում են SQL-ի նման հարցումների լեզուներ։
Ինչ հարցնել ձեր AI կառուցողին
- «Ինչ տեսակի տվյալների բազա է օգտագործում այս ծրագիրը և ինչու է այն հարմար իմ տվյալներին»։
- «Նկարեք աղյուսակները կամ հավաքածուները և թե ինչպես են դրանք կապված»։
- «Ի՞նչ հաշվետվություններ կուզենամ վեց ամսից։ Կարո՞ղ է այս տվյալների բազան դրանք հեշտ պատասխանել»։
- «Եթե որոշ դաշտեր իրոք ճկուն են, պահեք դրանք JSON-ով Postgres-ում՝ երկրորդ տվյալների բազա ավելացնելու փոխարեն»։
- «Քեշ ավելացրեք միայն այն դեպքում, եթե ունենք չափված արագության խնդիր»։
Տվյալների բազաները Mythex-ում
Mythex-ը յուրաքանչյուր նախագծի, որին դա անհրաժեշտ է, տրամադրում է առանձին Postgres տվյալների բազա՝ հարաբերական SQL տվյալների բազա, որն ավելացվում է, երբ ծրագիրն այն պահանջում է. կամ զրույցում հարցնելով, կամ /database հրամանով (Database)։ Դա հարմար է բիզնես ծրագրերի մեծամասնությանը. օգտատերեր, ամրագրումներ, պատվերներ և հաշվետվություններ։ Եթե ձեզ անհրաժեշտ է որևէ արտաքին ծառայություն, ինչպիսին է հոսթավորված փաստաթղթային տվյալների բազան, գործակալը կարող է գրել կոդ, որը միանում է դրան այն բանալիներով, որոնք պահում եք որպես նախագծի գաղտնիքներ։ Լեզվի մասին ավելին իմանալու համար կարդացեք ինչ է SQL-ը։
Հարցեր
Ո՞րն է SQL-ի և NoSQL-ի հիմնական տարբերությունը։
SQL տվյալների բազաները տվյալները պահում են սահմանված կառուցվածքով աղյուսակներում և կապում են առնչվող աղյուսակները. հարցումները կատարվում են SQL-ով։ NoSQL տվյալների բազաները օգտագործում են այլ մոդելներ՝ փաստաթղթեր, բանալի-արժեք զույգեր, լայն սյունակներ կամ գրաֆներ, և սովորաբար թույլ են տալիս ավելի ճկուն կառուցվածք, իսկ յուրաքանչյուր արտադրանք ունի հարցումների իր եղանակը։
NoSQL-ը արագա՞ն է SQL-ից։
Ընդհանուր առմամբ՝ ոչ։ Յուրաքանչյուրը արագ է այն մուտքի օրինաչափությունների համար, որոնց համար նախագծված է։ Բանալի-արժեք պահոցը շատ արագ է մեկ տարրը բանալիով բերելու համար, իսկ հարաբերական տվյալների բազան ուժեղ է առնչվող տվյալների զտման, միացման և ամփոփման մեջ։ Նախագծումն ու ինդեքսավորումը ավելի կարևոր են, քան կատեգորիան։
Ո՞րն է ավելի լավ ստարտափի կամ փոքր ծրագրի համար։
Բիզնես ծրագրերի մեծամասնության համար՝ հաճախորդներ, պատվերներ, ամրագրումներ, օգտատերեր և թույլտվություններ, հարաբերական SQL տվյալների բազան, ինչպիսին է Postgres-ը, անվտանգ լռելյայն ընտրություն է։ NoSQL-ը իմաստ ունի կոնկրետ խնդիրների համար, ինչպիսիք են քեշավորումը, որոշ հարթակներում իրական ժամանակի համաժամեցումը կամ պարզ, անկախ գրառումների շատ մեծ ծավալները։
MongoDB-ն SQL է, թե NoSQL։
MongoDB-ն NoSQL փաստաթղթային տվյալների բազա է։ Այն գրառումները պահում է ճկուն, JSON-ի նման փաստաթղթերում, այլ ոչ թե աղյուսակների տողերում։
Կարո՞ղ է SQL տվյալների բազան պահել JSON։
Այո։ Postgres-ն ունի jsonb տիպ JSON-ը պահելու և հարցելու համար, իսկ MySQL-ը և SQLite-ը նույնպես աջակցում են JSON-ին։ Դա թույլ է տալիս շատ ծրագրերի պահել հարաբերական հիմք մի քանի ճկուն դաշտերով՝ առանց առանձին NoSQL տվյալների բազայի։