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.
GO TO FULL VERSION