Bu gün PostgreSQL-də massivlərlə işləməyə dair maraqlı səyahətimizi yekunlaşdırırıq. Gündəmimizdə — rast gələ biləcəyin tipik səhvlər və ən əsası, onlardan necə qaçmaq olar. Əgər nə vaxtsa "bu massiv yenə nəsə qəribə edir" deyə düşünmüsənsə, bu leksiya tam sənlikdir. Gəlin baxaq nələr var.
Massiv yaradarkən səhvlər: massiv daxilində data tipləri ilə bağlı problemlər
PostgreSQL-də massiv yaradanda yadında saxla ki, massivdəki bütün elementlər eyni tipdə olmalıdır. Məsələn:
SELECT ARRAY[1, 2, 'üç'];
-- Səhv: massivdə elementlər eyni tipdə olmalıdır
PostgreSQL bir massivdə ədədlərlə string-ləri qarışdırmağa icazə vermir. Əgər belə bir şey lazımdırsa, tip çevirməsindən istifadə et:
SELECT ARRAY[1::TEXT, 2::TEXT, 'üç'];
-- İndi massiv string-lərdən ibarətdir
ARRAY[] ilə müxtəlif data tiplərindən istifadə zamanı səhvlər
Default olaraq PostgreSQL massiv tipini içindəki dəyərlərə görə təyin etməyə çalışır. Əgər massivə qeyri-müəyyən data verdinsə, səhv almağa hazır ol:
SELECT ARRAY[1, NULL];
-- Səhv: PostgreSQL NULL-u necə interpretasiya edəcəyini bilmir
Problemi həll etmək üçün data tipini açıq göstər:
SELECT ARRAY[1, NULL]::INTEGER[];
-- Hər şey qaydasındadır
Data çıxarışında səhvlər: massiv indeksləri ilə bağlı problemlər
Əgər Python və ya JavaScript-də proqramlaşdırmaya öyrəşmisənsə, orda massiv indeksləri sıfırdan başlayır. Amma PostgreSQL-də səni sürpriz gözləyir — burada massivlər 1-dən indekslənir.
SELECT ARRAY[10, 20, 30][0];
-- Səhv: indeks 1-dən başlamalıdır
Düzgün sorğu:
SELECT ARRAY[10, 20, 30][1];
-- Nəticə: 10
Çıxarış üçün funksiyalardan istifadə zamanı səhvlər
unnest() kimi funksiyalar bəzən çaşqınlıq yarada bilər, çünki onlar massivləri "sətirlərə açır":
CREATE TEMP TABLE example (
id SERIAL PRIMARY KEY,
tags TEXT[]
);
INSERT INTO example (tags) VALUES (ARRAY['tag1', 'tag2']), (ARRAY['tag3']);
SELECT unnest(tags) FROM example;
-- Nəticə:
-- tag1
-- tag2
-- tag3
Əgər sətirin kontekstini (məsələn, id) saxlamaq lazımdırsa, onu ayrıca əlavə et:
SELECT id, unnest(tags) AS tag FROM example;
-- Nəticə:
-- id | tag
-- 1 | tag1
-- 1 | tag2
-- 2 | tag3
Massivlərin filtrasiya və müqayisəsində səhvlər
@>,<@,&&operatorlarından düzgün istifadə etməmək
Bu operatorlar xüsusi tapşırıqlar üçündür:
@>massivdə başqa massiv olub-olmadığını yoxlayır.<@massiv başqa massivdə yerləşib-yerləşmədiyini yoxlayır.&&iki massiv arasında kəsişmə olub-olmadığını yoxlayır.
Onları düzgün istifadə etməsən, səhv alacaqsan:
SELECT ARRAY[1, 2, 3] @> 2;
-- Səhv: @> operatoru massivlər üçün nəzərdə tutulub
Düzgün:
SELECT ARRAY[1, 2, 3] @> ARRAY[2];
-- Nəticə: true
- İndekslər olmadıqda performans problemləri
Əgər massiv operatorlarından aktiv istifadə edirsənsə və sorğuların ləng işlədiyini hiss edirsənsə, yəqin ki, indeksləməyi unutmusan. Massiv üçün indeks nümunəsi:
CREATE INDEX idx_tags ON example USING GIN (tags);
İndi @> və && ilə sorğular xeyli sürətli işləyəcək.
Massivləri dəyişəndə səhvlər
- Dəyərlərin silinməsi və əlavə olunması
array_remove() və array_append() funksiyaları massivləri "yerində" dəyişmir, yeni massiv qaytarır. Əgər əsas massiv dəyişəcək deyə gözləyirsənsə, səhv edirsən:
UPDATE example
SET tags = array_remove(tags, 'tag1');
-- İndi massiv yenilənib
Əgər SET tags = hissəsini unutdunsa, SQL sorğunu icra edəcək, amma massiv dəyişməyəcək.
array_append()istifadə edəndə data təkrarlanması
array_append() funksiyası elementin olub-olmadığını yoxlamır. Bu, təkrara səbəb ola bilər:
SELECT array_append(ARRAY['tag1', 'tag2'], 'tag1');
-- Nəticə: {tag1, tag2, tag1}
Təkrardan qaçmaq üçün filtrasiya et:
SELECT array_remove(array_append(ARRAY['tag1', 'tag2'], 'tag1'), 'tag1') || 'tag1';
-- Nəticə: {tag1, tag2}
Səhvlərin qarşısını almaq üçün tövsiyələr
Massivlərlə işləyərkən yuxarıda sadalanan səhvlərdən qaçmaq üçün:
- Data tiplərini yoxla. Əgər qeyri-müəyyənlik varsa, massiv tipini açıq göstər.
- İndekslərlə diqqətli ol. PostgreSQL-də massivlər 1-dən indekslənir, bunu unutma.
- Massivli sorğuları optimallaşdır. Müqayisə və filtrasiya üçün indekslərdən istifadə et.
- Kiçik dataset-lərdə test et. Əgər massivli sorğu ləng işləyirsə, onu az sayda data ilə yoxla və dar boğazı tap.
- Təkrarlardan qorun. Əgər massivdə təkrar elementlər istəmirsənsə, əlavə edəndə əlavə yoxlamalar apar.
PostgreSQL-də massivlər, hər güclü alət kimi, hörmət və diqqət tələb edir. Bu tövsiyələrə əməl etsən, massivlər gecə yuxusuzluğunun səbəbi olmayacaq (demək olar ki). Uğurlar database dizaynı və optimizasiyasında!
GO TO FULL VERSION