Մեր բազան այդքան մեծ և բաշխված չի լինի, ինչպես VKontakte-ն կամ Badoo, բայց «այնպես որ լիներ», բայց լավ էր՝ ֆունկցիոնալ, արագ և տեղավորվում է մեկ սերվերի վրա PostgreSQL - այնպես, որ դուք կարող եք տեղակայել ծառայության առանձին օրինակ ինչ-որ մի կողմում, օրինակ:
Հետևաբար, մենք չենք անդրադառնա հարդինգի, կրկնօրինակման և աշխարհաբաշխված համակարգերի խնդիրներին, այլ կկենտրոնանանք տվյալների բազայի ներսում շրջանային լուծումների վրա։
Քայլ 1. Որոշ բիզնես առանձնահատկություններ
Մենք վերացականորեն չենք ձևավորի մեր հաղորդագրությունները, այլ այն կինտեգրենք շրջակա միջավայրին կորպորատիվ սոցիալական ցանց. Այսինքն՝ մեր ժողովուրդը ոչ թե «ուղղակի նամակագրություն» է անում, այլ շփվում է միմյանց հետ որոշակի բիզնես խնդիրների լուծման համատեքստում։
Իսկ ի՞նչ խնդիրներ ունի բիզնեսը... Դիտարկենք զարգացման բաժնի պետ Վասիլի օրինակը։
«Նիկոլայ, այս առաջադրանքի համար մեզ այսօր կարկատ է պետք»:
Սա նշանակում է, որ նամակագրությունը կարող է իրականացվել որոշների համատեքստում փաստաթուղթը.
«Կոլյա, դու գնալու ես Դոթա այս երեկո»:
Այսինքն՝ նույնիսկ մեկ զույգ զրուցակիցները կարող են միաժամանակ շփվել տարբեր թեմաներով.
«Պիտեր, Նիկոլայ, հավելվածում փնտրեք նոր սերվերի գնացուցակը»:
Այսպիսով, մեկ հաղորդագրություն կարող է ունենալ մի քանի հասցեատերեր. Այս դեպքում հաղորդագրությունը կարող է պարունակել Կցված ֆայլեր.
«Սեմյոն, մի հատ էլ նայիր»։
Իսկ առկա նամակագրության մեջ մտնելու հնարավորություն պետք է լինի հրավիրել նոր անդամ.
Առայժմ անդրադառնանք «ակնհայտ» կարիքների այս ցանկին:
Չհասկանալով խնդրի կիրառական առանձնահատկությունները և դրան տրված սահմանափակումները, դիզայն արդյունավետ տվյալների բազայի սխեման լուծել այն գրեթե անհնար է:
Քայլ 2. Նվազագույն տրամաբանական միացում
Մինչ այժմ ամեն ինչ շատ նման է էլեկտրոնային նամակագրությանը` ավանդական բիզնես գործիք: Այո, «ալգորիթմորեն» շատ բիզնես խնդիրներ նման են միմյանց, հետևաբար դրանց լուծման գործիքները կառուցվածքային առումով նման են լինելու։
Ֆիքսենք սուբյեկտների հարաբերությունների արդեն ստացված տրամաբանական դիագրամը։ Մեր մոդելն ավելի հեշտ հասկանալի դարձնելու համար մենք կօգտագործենք ցուցադրման ամենապրիմիտիվ տարբերակը ER մոդելներ առանց UML կամ IDEF նշումների բարդությունների.
Մեր օրինակում ֆայլի անձը, փաստաթուղթը և երկուական «մարմինը» «արտաքին» սուբյեկտներ են, որոնք գոյություն ունեն ինքնուրույն՝ առանց մեր ծառայության: Հետևաբար, մենք դրանք ապագայում պարզապես կընկալենք որպես UUID-ի կողմից «ինչ-որ տեղ» հղումներ։
Ոչ ոքի որքան հնարավոր է պարզ դիագրամներ - Մարդկանց մեծ մասը, ում դուք ցույց կտաք նրանց, UML/IDEF կարդալու մասնագետ չեն: Բայց համոզվեք, որ նկարեք:
Քայլ 3. Սեղանի կառուցվածքի ուրվագիծը
Աղյուսակների և դաշտերի անունների մասինԴաշտերի և աղյուսակների «ռուսական» անվանումներին կարելի է այլ կերպ վերաբերվել, բայց դա ճաշակի հարց է։ Քանի որ այստեղ՝ Tensor-ում չկան օտարերկրյա մշակողներ, և PostgreSQL-ը մեզ թույլ է տալիս անուններ տալ նույնիսկ հիերոգլիֆներով, եթե դրանք փակցված չակերտների մեջ, ապա նախընտրում ենք օբյեկտները անվանել միանշանակ և հստակ, որպեսզի անհամապատասխանություններ չլինեն։
Քանի որ շատերը մեզ միանգամից հաղորդագրություններ են գրում, նրանցից ոմանք նույնիսկ կարող են դա անել անցանց, ապա ամենապարզ տարբերակն է օգտագործել UUID-ները որպես նույնացուցիչներ ոչ միայն արտաքին սուբյեկտների, այլ նաև մեր ծառայության ներսում գտնվող բոլոր օբյեկտների համար: Ավելին, դրանք կարող են ստեղծվել նույնիսկ հաճախորդի կողմից. սա կօգնի մեզ աջակցել հաղորդագրությունների ուղարկմանը, երբ տվյալների բազան ժամանակավորապես անհասանելի է, և բախման հավանականությունը չափազանց ցածր է:
Մեր տվյալների բազայի աղյուսակի նախագծի կառուցվածքը կունենա հետևյալ տեսքը. Սեղաններ՝ RU
Ձևաչափը նկարագրելիս ամենապարզը կապի գծապատկերը «բացել» սկսելն է աղյուսակներից, որոնք հղում չեն կատարել իրենք ոչ մեկին:
Քայլ 4. Պարզեք ոչ ակնհայտ կարիքները
Վերջ, մենք մշակել ենք տվյալների բազա, որտեղ դուք կարող եք կատարելապես գրել և ինչ-որ կերպ կարդալ:
Եկեք մեզ դնենք մեր ծառայությունից օգտվողի տեղը. ի՞նչ ենք ուզում անել դրա հետ:
Վերջին հաղորդագրությունները
այս ժամանակագրական կարգով «իմ» հաղորդագրությունների ռեեստր՝ հիմնված տարբեր չափանիշների վրա: Որտեղ ես ստացողներից մեկն եմ, որտեղ ես եմ հեղինակը, որտեղ ինձ գրել են, և ես չեմ պատասխանել, որտեղ ինձ չեն պատասխանել, ...
Նամակագրության մասնակիցներ
Ո՞վ է նույնիսկ մասնակցում այս երկար ու երկար զրույցին:
Մեր կառուցվածքը թույլ է տալիս լուծել այս երկու խնդիրներն էլ «ընդհանուր առմամբ», բայց ոչ արագ։ Խնդիրն այն է, որ առաջին առաջադրանքի շրջանակներում տեսակավորելու համար ի վիճակի չէ ստեղծել ինդեքս, հարմար է մասնակիցներից յուրաքանչյուրի համար (և դուք ստիպված կլինեք հանել բոլոր գրառումները), իսկ երկրորդը լուծելու համար ձեզ անհրաժեշտ է. հանել բոլոր հաղորդագրությունները այս թեմայով:
Օգտատիրոջ չնախատեսված առաջադրանքները կարող են համարձակ լինել խաչաձև արտադրողականության վրա.
Քայլ 5. Խելացի ապանորմալացում
Մեր երկու խնդիրներն էլ կլուծվեն լրացուցիչ աղյուսակներով, որոնցում մենք կլուծենք կրկնօրինակել տվյալների մի մասը, անհրաժեշտ է դրանց վրա ձևավորել մեր առաջադրանքների համար հարմար ցուցանիշներ։
Այստեղ մենք կիրառել ենք երկու բնորոշ մոտեցում, որոնք օգտագործվում են օժանդակ աղյուսակներ ստեղծելիս.
Գրառումների բազմապատկում
Օգտագործելով մեկ սկզբնական հաղորդագրության գրառումը, մենք ստեղծում ենք մի քանի հաջորդական գրառումներ տարբեր տեսակի գրանցամատյաններում տարբեր սեփականատերերի համար՝ ինչպես ուղարկողի, այնպես էլ ստացողի համար: Բայց ռեգիստրներից յուրաքանչյուրն այժմ ընկնում է ինդեքսի վրա, ի վերջո, սովորական դեպքում մենք կցանկանանք տեսնել միայն առաջին էջը:
Եզակի ռեկորդներ
Ամեն անգամ, երբ հաղորդագրություն եք ուղարկում կոնկրետ թեմայի շրջանակներում, բավական է ստուգել, թե արդյոք այդպիսի գրառում արդեն կա։ Եթե ոչ, ավելացրեք այն մեր «բառարանին»:
Հոդվածի հաջորդ մասում կխոսենք բաժանման իրականացում մեր տվյալների բազայի կառուցվածքում: