Bazamız o qədər böyük və paylanmış olmayacaq, VKontakte kimi və ya Badoo, lakin "belə ki, belə idi", lakin yaxşı idi - funksional, sürətli və bir serverə uyğundur PostgreSQL - məsələn, xidmətin ayrı bir nümunəsini yan tərəfdə yerləşdirə bilməniz üçün.
Buna görə də biz sharding, replikasiya və geo-paylanmış sistemlər məsələlərinə toxunmayacağıq, verilənlər bazası daxilində dövrə həllərinə diqqət yetirəcəyik.
Addım 1: Bəzi biznes xüsusiyyətləri
Biz mesajlaşmamızı mücərrəd şəkildə tərtib etməyəcəyik, lakin onu ətraf mühitə inteqrasiya edəcəyik korporativ sosial şəbəkə. Yəni bizim insanlarımız “sadəcə yazışmır”, bir-biri ilə müəyyən biznes problemlərinin həlli kontekstində ünsiyyət qururlar.
Bəs biznesin vəzifələri nədir?.. İnkişaf şöbəsinin müdiri Vasilinin misalına baxaq.
"Nikolay, bu iş üçün bu gün yamaq lazımdır!"
Bu o deməkdir ki, yazışmalar bəzilərinin kontekstində aparıla bilər sənəd.
"Kolya, bu axşam Dotaya gedirsən?"
Yəni, hətta bir cüt həmsöhbət eyni vaxtda ünsiyyət qura bilir müxtəlif mövzularda.
"Peter, Nikolay, yeni serverin qiymət siyahısı üçün əlavəyə baxın."
Beləliklə, bir mesaj ola bilər bir neçə alıcı. Bu halda, mesaj ola bilər Əlavə edilmiş fayllar.
– Semyon, bir də bax.
Və mövcud yazışmalara girmək imkanı olmalıdır yeni üzv dəvət edin.
Hələlik bu “aşkar” ehtiyaclar siyahısında dayanaq.
Problemin tətbiqi xüsusiyyətlərini və ona verilən məhdudiyyətləri başa düşmədən dizayn təsirli verilənlər bazası sxemini həll etmək demək olar ki, mümkün deyil.
Addım 2: Minimal Məntiq Dövrü
İndiyə qədər hər şey e-poçt yazışmalarına çox bənzəyir - ənənəvi iş aləti. Bəli, "alqoritmik olaraq" bir çox iş problemləri bir-birinə bənzəyir, buna görə də onları həll etmək üçün alətlər struktur olaraq oxşar olacaqdır.
Varlıq əlaqələrinin artıq əldə edilmiş məntiqi diaqramını düzəldək. Modelimizin başa düşülməsini asanlaşdırmaq üçün ən primitiv ekran seçimindən istifadə edəcəyik ER modelləri UML və ya IDEF qeydlərinin fəsadları olmadan:
Bizim nümunəmizdə faylın şəxsi, sənədi və binar “gövdəsi” bizim xidmətimiz olmadan müstəqil olaraq mövcud olan “xarici” varlıqlardır. Buna görə də, biz onları gələcəkdə UUID tərəfindən "haradasa" bəzi bağlantılar kimi qəbul edəcəyik.
çəkmək diaqramlar mümkün qədər sadədir - onlara göstərəcəyiniz insanların əksəriyyəti UML/IDEF oxumaq üzrə mütəxəssis deyillər. Ancaq çəkməyə əmin olun.
Addım 3: Cədvəl quruluşunun eskizini
Cədvəl və sahə adları haqqındaSahələrin və cədvəllərin "rusca" adlarına fərqli yanaşmaq olar, lakin bu zövq məsələsidir. Çünki burada Tensorda heç bir xarici tərtibatçı yoxdur və PostgreSQL bizə adları hətta heroqliflərlə verməyə imkan verir, əgər onlar dırnaqlar içərisindədir, onda biz heç bir uyğunsuzluq olmaması üçün obyektləri birmənalı və aydın adlandırmağa üstünlük veririk.
Bir çox insan bir anda bizə mesaj yazdığından bəziləri hətta bunu edə bilər oflayn, onda ən sadə variantdır identifikator kimi UUID-lərdən istifadə edin təkcə xarici qurumlar üçün deyil, həm də xidmətimiz daxilində olan bütün obyektlər üçün. Üstəlik, onlar hətta müştəri tərəfində də yaradıla bilər - bu, verilənlər bazası müvəqqəti olaraq əlçatmaz olduqda və toqquşma ehtimalı olduqca aşağı olduqda mesajların göndərilməsini dəstəkləməyə kömək edəcək.
Verilənlər bazamızdakı qaralama cədvəl strukturu belə görünəcək: Cədvəllər: RU
Bir formatı təsvir edərkən ən sadə şey əlaqə qrafikini "açmağa" başlamaqdır istinad edilməyən cədvəllərdən özlərini heç kimə.
Addım 4: Aşkar olmayan ehtiyacları tapın
Budur, mükəmməl yaza biləcəyiniz bir verilənlər bazası hazırlamışıq birtəhər oxumaq.
Gəlin özümüzü xidmətimizin istifadəçisinin yerinə qoyaq - bununla nə etmək istəyirik?
Son mesajlar
O xronoloji sıralanır müxtəlif meyarlara əsaslanan “mənim” mesajlarının reyestri. Qəbul edənlərdən biri olduğum yerdə, müəllif olduğum yerdə, mənə yazdıqları və cavab vermədikləri, mənə cavab vermədikləri, ...
Yazışmaların iştirakçıları
Bu uzun, uzun söhbətdə kim iştirak edir?
Bizim strukturumuz bu problemlərin hər ikisini “ümumiyyətlə” həll etməyə imkan verir, lakin tez deyil. Problem ondadır ki, birinci tapşırıq daxilində çeşidləməkdir indeks yaratmaq mümkün deyil, iştirakçıların hər biri üçün uyğun (və bütün qeydləri çıxarmalı olacaqsınız) və ikincisini həll etmək üçün sizə lazım olan bütün mesajları çıxarın bu mövzuda.
İstenmeyen istifadəçi tapşırıqları qalın yaza bilər məhsuldarlığa keçid.
Addım 5: Ağıllı Denormalizasiya
Hər iki problemimizi əlavə edəcəyimiz cədvəllər həll edəcək məlumatların bir hissəsini təkrarlayın, onlar üzrə tapşırıqlarımıza uyğun indekslər yaratmaq lazımdır.
Burada köməkçi cədvəllər yaratarkən istifadə olunan iki tipik yanaşma tətbiq etdik:
Qeydlərin çoxaldılması
Bir ilkin mesaj qeydindən istifadə edərək, biz həm göndərən, həm də alıcı üçün müxtəlif sahiblər üçün müxtəlif növ registrlərdə bir neçə təqib qeydləri yaradırıq. Ancaq registrlərin hər biri indi indeksə düşür - axı, tipik bir vəziyyətdə biz yalnız birinci səhifəni görmək istəyəcəyik.
Unikal qeydlər
Hər dəfə müəyyən bir mövzu daxilində mesaj göndərdiyiniz zaman belə bir girişin mövcud olub-olmadığını yoxlamaq kifayətdir. Yoxdursa, onu "lüğətimizə" əlavə edin.
Məqalənin növbəti hissəsində biz danışacağıq bölmənin həyata keçirilməsi verilənlər bazamızın strukturuna daxil edin.