CodeGym /Kurslar /SQL SELF /Massivlərlə işləyərkən tipik səhvlər və onların qarşısını...

Massivlərlə işləyərkən tipik səhvlər və onların qarşısını alma yolları

SQL SELF
Səviyyə , Dərs
Mövcuddur

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

  1. @>, <@, && 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
  1. İ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 @>&& ilə sorğular xeyli sürətli işləyəcək.

Massivləri dəyişəndə səhvlər

  1. Dəyərlərin silinməsi və əlavə olunması

array_remove()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.

  1. 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:

  1. Data tiplərini yoxla. Əgər qeyri-müəyyənlik varsa, massiv tipini açıq göstər.
  2. İndekslərlə diqqətli ol. PostgreSQL-də massivlər 1-dən indekslənir, bunu unutma.
  3. Massivli sorğuları optimallaşdır. Müqayisə və filtrasiya üçün indekslərdən istifadə et.
  4. 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.
  5. 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!

1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Massivlərin müqayisəsi və filtrasiya
Massivlərin müqayisəsi və filtrasiya
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION