CodeGym /Kurslar /SQL SELF /Marketplace sxemlərini birləşdirmək üçün Foreign Keys

Marketplace sxemlərini birləşdirmək üçün Foreign Keys

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

Sənin artıq bir database-in var, cədvəllərin də var. Hətta bu cədvəlləri datalarla doldurmusan. İndi isə bu dataların bütövlüyünə fikir verməyin vaxtıdır.

Hər bir sxemin içində cədvəllər yaradanda avtomatik olaraq həmin sxemin cədvəllərinə foreign key-lər əlavə olunmuşdu. İndi isə sənə fərqli sxemlərin cədvəllərini bir-birinə bağlamaq lazımdır - foreign key-lər əlavə etmək.

Məsələn, order sxemindəki order cədvəli user sxemindəki account cədvəlində olan istifadəçiyə istinad edir. Bu cədvələ foreign key əlavə etməlisən. Belə bir sorğu təxminən belə görünə bilər:

ALTER TABLE "order".order
  ADD CONSTRAINT fk_order_user
  FOREIGN KEY (user_id)
  REFERENCES "user".account(id)
  ON DELETE RESTRICT;

Foreign key-lərin siyahısı

Cəmi 40 dənə foreign key əlavə etməli olacaqsan :)

product sxemi:

[product].review.user_id → [user].account.id

Məhsul rəyləri həmin rəyi yazan istifadəçilərlə bağlı olmalıdır.

[product].question.user_id → [user].account.id

Məhsul haqqında sualları qeydiyyatdan keçmiş istifadəçilər verir.

[product].answer.user_id → [user].account.id

Cavablar da istifadəçilərə məxsusdur.

order sxemi:

[order].order.user_id → [user].account.id

Sifarişi edən istifadəçi həmişə qeydiyyatdan keçmiş istifadəçidir.

[order].order_item.product_id → [product].product.id

Sifarişdəki mövqe həmişə konkret məhsula istinad edir.

[order].order_item.variant_id → [product].variant.id

Əgər məhsulun variantı seçilibsə - o, mövcud olmalıdır. Amma variant silinə bilər (onda sahə NULL olacaq).

[order].cart.user_id → [user].account.id

Səbət konkret istifadəçiyə məxsusdur.

[order].cart_item.product_id → [product].product.id

Səbətdəki məhsul mütləq düzgün məhsul olmalıdır.

[order].cart_item.variant_id → [product].variant.id

Seçilmiş məhsul variantı varsa, mövcud olmalıdır. Əgər silinibsə - sahə NULL olur.

logistics sxemi:

[logistics].inventory.variant_id → [product].variant.id

Variant silinə bilər (məsələn, satışdan çıxarılıbsa).

[logistics].inventory_movement.product_id → [product].product.id

Anbarda hərəkət real məhsula aiddir.

[logistics].inventory_movement.variant_id → [product].variant.id

Hərəkət növü konkret məhsul variantı üzrə ola bilər.

[logistics].stock_level.product_id → [product].product.id

Stok səviyyəsi mövcud məhsullara görə təyin olunur.

[logistics].transfer.product_id → [product].product.id

Köçürmələr yalnız real mövcud məhsul üzrə olur.

[logistics].transfer.variant_id → [product].variant.id

Variant silinə bilər.

[logistics].package.order_id → [order].order.id

Hər bir paket konkret sifarişlə bağlıdır.

payment sxemi:

[payment].payment_transaction.order_id → [order].order.id

Ödəniş tranzaksiyası həmişə sifarişə aiddir.

[payment].invoice.order_id → [order].order.id Hesab sifarişə görə çıxarılır.

[payment].billing_address.user_id → [user].account.id

Hesab ünvanı istifadəçiyə məxsusdur.

[payment].wallet.user_id → [user].account.id

Cüzdan istifadəçi üçün unikal olur.

marketing sxemi:

[marketing].discount.product_id → [product].product.id

Endirim müəyyən məhsula bağlı ola bilər.

[marketing].discount.category_id → [product].category.id

Endirim məhsul kateqoriyasına bağlı ola bilər.

[marketing].discount.brand_id → [product].brand.id

Brend üçün endirim.

[marketing].promo_usage.user_id → [user].account.id

Promo kodları yalnız qeydiyyatdan keçmiş istifadəçilər istifadə edir.

[marketing].featured_product.product_id → [product].product.id

Vitrində seçilmiş məhsul mövcud olmalıdır.

[marketing].referral_use.referrer_id → [user].account.id

Dəvət edən - mütləq istifadəçidir.

[marketing].referral_use.referee_id → [user].account.id

Dəvət olunan - mütləq istifadəçidir.

support sxemi:

[support].support_ticket.user_id → [user].account.id

Hər bir müraciəti istifadəçi yaradır.

[support].support_ticket.category_id → [support].ticket_category.id

Müraciət kateqoriyası silinə bilər, müraciət qalacaq.

[support].ticket_message.sender_id → [user].account.id

Mesajları istifadəçilər göndərir (və ya agentlər, əgər onlar da user.account-dadırsa).

[support].support_agent.user_id → [user].account.id

Dəstək agenti - həmişə istifadəçidir.

[support].ticket_status_log.changed_by → [user].account.id

Statusu kim dəyişdi (istifadəçi və ya əməkdaş) qeyd olunur.

content sxemi:

[content].article.author_id → [user].account.id

Məqalə qeydiyyatdan keçmiş istifadəçi tərəfindən yazılıb.

[content].media.uploaded_by → [user].account.id

Medianı kim yükləyib (silinə bilər).

[content].content_revision.author_id → [user].account.id

Dəyişikliyi kim edib (silinə bilər).

Qeyd

Harada mümkündürsə, ON DELETE SET NULL istifadə etmək yaxşıdır ki, obyekt silinəndə əlaqə haqqında məlumat tam itirilməsin.

"target_type/target_id" tipli əlaqələr üçün (məsələn, user.comment), SQL səviyyəsində foreign key mümkün deyil, belə əlaqələr application səviyyəsində idarə olunmalıdır.

Bu siyahı SQL səviyyəsində əsas cross-schema əlaqələri və məlumatların baza bütövlüyünü əhatə edir.

Həll olan fayl.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION