# Работа с данни: Нерелационни данни |![ Скетч от [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/06-NoSQL.png)| |:---:| |Работа с NoSQL данни - _Скетч от [@nitya](https://twitter.com/nitya)_ | ## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ds/quiz/10) Данните не са ограничени само до релационни бази данни. Тази лекция се фокусира върху нерелационни данни и ще обхване основите на електронни таблици и NoSQL. ## Електронни таблици Електронните таблици са популярен начин за съхранение и изследване на данни, защото изискват по-малко усилия за настройка и започване. В тази лекция ще научите основните компоненти на електронна таблица, както и формули и функции. Примерите ще бъдат илюстрирани с Microsoft Excel, но повечето части и теми ще имат подобни имена и стъпки в сравнение с други софтуери за електронни таблици. ![Празен Microsoft Excel работен файл с два работни листа](../../../../2-Working-With-Data/06-non-relational/images/parts-of-spreadsheet.png) Електронната таблица е файл и ще бъде достъпна в файловата система на компютър, устройство или облачна система за съхранение. Самият софтуер може да бъде базиран на браузър или приложение, което трябва да бъде инсталирано на компютър или изтеглено като апликация. В Excel тези файлове се дефинират като **работни книги** и тази терминология ще бъде използвана в останалата част от лекцията. Работната книга съдържа един или повече **работни листа**, като всеки работен лист е обозначен с табове. В рамките на работния лист има правоъгълници, наречени **клетки**, които съдържат действителните данни. Клетката е пресечната точка на ред и колона, като колоните са обозначени с буквени символи, а редовете - с числови. Някои електронни таблици съдържат заглавия в първите няколко реда, които описват данните в клетката. С тези основни елементи на Excel работна книга ще използваме пример от [Microsoft Templates](https://templates.office.com/), фокусиран върху инвентаризация, за да разгледаме допълнителни части на електронната таблица. ### Управление на инвентаризация Файлът на електронната таблица, наречен "InventoryExample", е форматирана таблица с артикули в инвентаризацията, която съдържа три работни листа, като табовете са обозначени "Inventory List", "Inventory Pick List" и "Bin Lookup". Ред 4 от работния лист Inventory List е заглавие, което описва стойността на всяка клетка в колоната на заглавието. ![Подчертана формула от примерен инвентарен списък в Microsoft Excel](../../../../2-Working-With-Data/06-non-relational/images/formula-excel.png) Има случаи, когато клетка зависи от стойностите на други клетки, за да генерира своята стойност. Таблицата Inventory List следи разходите за всеки артикул в инвентара, но какво ако трябва да знаем стойността на всичко в инвентара? [**Формулите**](https://support.microsoft.com/en-us/office/overview-of-formulas-34519a4e-1e8d-4f4b-84d4-d642c4f63263) извършват действия върху данните в клетките и се използват за изчисляване на стойността на инвентара в този пример. Тази таблица използва формула в колоната Inventory Value, за да изчисли стойността на всеки артикул, като умножи количеството под заглавието QTY и разходите под заглавието COST. Двойно кликване или подчертаване на клетка ще покаже формулата. Ще забележите, че формулите започват със знак за равенство, последван от изчислението или операцията. ![Подчертана функция от примерен инвентарен списък в Microsoft Excel](../../../../2-Working-With-Data/06-non-relational/images/function-excel.png) Можем да използваме друга формула, за да съберем всички стойности на Inventory Value и да получим общата стойност. Това може да бъде изчислено чрез добавяне на всяка клетка, за да се генерира сумата, но това може да бъде трудоемка задача. Excel има [**функции**](https://support.microsoft.com/en-us/office/sum-function-043e1c7d-7726-4e80-8f32-07b23e057f89), или предварително дефинирани формули за извършване на изчисления върху стойностите на клетките. Функциите изискват аргументи, които са необходимите стойности за извършване на тези изчисления. Когато функциите изискват повече от един аргумент, те трябва да бъдат изброени в определен ред, иначе функцията може да не изчисли правилната стойност. Този пример използва функцията SUM и използва стойностите на Inventory Value като аргумент, за да генерира общата стойност, изброена под ред 3, колона B (наричана още B3). ## NoSQL NoSQL е общ термин за различните начини за съхранение на нерелационни данни и може да се интерпретира като "не-SQL", "нерелационни" или "не само SQL". Тези типове системи за бази данни могат да бъдат категоризирани в 4 типа. ![Графично представяне на база данни с ключ-стойност, показващо 4 уникални числови ключа, свързани с 4 различни стойности](../../../../2-Working-With-Data/06-non-relational/images/kv-db.png) > Източник от [Michał Białecki Blog](https://www.michalbialecki.com/2018/03/18/azure-cosmos-db-key-value-database-cloud/) [Ключ-стойност](https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/non-relational-data#keyvalue-data-stores) базите данни свързват уникални ключове, които са уникален идентификатор, асоцииран със стойност. Тези двойки се съхраняват с помощта на [хеш таблица](https://www.hackerearth.com/practice/data-structures/hash-tables/basics-of-hash-tables/tutorial/) с подходяща хеш функция. ![Графично представяне на граф база данни, показващо връзките между хора, техните интереси и местоположения](../../../../2-Working-With-Data/06-non-relational/images/graph-db.png) > Източник от [Microsoft](https://docs.microsoft.com/en-us/azure/cosmos-db/graph/graph-introduction#graph-database-by-example) [Граф](https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/non-relational-data#graph-data-stores) базите данни описват връзките в данните и са представени като колекция от възли и ръбове. Възелът представлява обект, нещо, което съществува в реалния свят, като студент или банково извлечение. Ръбовете представляват връзката между два обекта. Всеки възел и ръб имат свойства, които предоставят допълнителна информация за тях. ![Графично представяне на колонна база данни, показващо клиентска база данни с две групи колони, наречени Identity и Contact Info](../../../../2-Working-With-Data/06-non-relational/images/columnar-db.png) [Колонни](https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/non-relational-data#columnar-data-stores) бази данни организират данните в колони и редове, подобно на релационна структура, но всяка колона е разделена на групи, наречени семейства колони, където всички данни под една колона са свързани и могат да бъдат извлечени и променени като единица. ### Документни бази данни с Azure Cosmos DB [Документните](https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/non-relational-data#document-data-stores) бази данни се основават на концепцията за база данни с ключ-стойност и се състоят от серия от полета и обекти. Тази секция ще изследва документните бази данни с емулатора Cosmos DB. База данни Cosmos DB отговаря на дефиницията за "Не само SQL", където документната база данни на Cosmos DB разчита на SQL за заявяване на данни. [Предишната лекция](../05-relational-databases/README.md) за SQL обхваща основите на езика и ще можем да приложим някои от същите заявки към документна база данни тук. Ще използваме емулатора Cosmos DB, който ни позволява да създаваме и изследваме документна база данни локално на компютър. Прочетете повече за емулатора [тук](https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator?tabs=ssl-netstd21). Документът е колекция от полета и стойности на обекти, където полетата описват какво представлява стойността на обекта. По-долу е даден пример за документ. ```json { "firstname": "Eva", "age": 44, "id": "8c74a315-aebf-4a16-bb38-2430a9896ce5", "_rid": "bHwDAPQz8s0BAAAAAAAAAA==", "_self": "dbs/bHwDAA==/colls/bHwDAPQz8s0=/docs/bHwDAPQz8s0BAAAAAAAAAA==/", "_etag": "\"00000000-0000-0000-9f95-010a691e01d7\"", "_attachments": "attachments/", "_ts": 1630544034 } ``` Полетата от интерес в този документ са: `firstname`, `id` и `age`. Останалите полета с подчертавания са генерирани от Cosmos DB. #### Изследване на данни с емулатора Cosmos DB Можете да изтеглите и инсталирате емулатора [за Windows тук](https://aka.ms/cosmosdb-emulator). Вижте тази [документация](https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator?tabs=ssl-netstd21#run-on-linux-macos) за опции как да стартирате емулатора за macOS и Linux. Емулаторът стартира прозорец на браузъра, където изгледът Explorer ви позволява да изследвате документи. ![Изгледът Explorer на емулатора Cosmos DB](../../../../2-Working-With-Data/06-non-relational/images/cosmosdb-emulator-explorer.png) Ако следвате инструкциите, кликнете върху "Start with Sample", за да генерирате примерна база данни, наречена SampleDB. Ако разширите SampleDB, като кликнете върху стрелката, ще намерите контейнер, наречен `Persons`. Контейнерът съдържа колекция от елементи, които са документите в контейнера. Можете да изследвате четирите индивидуални документа под `Items`. ![Изследване на примерни данни в емулатора Cosmos DB](../../../../2-Working-With-Data/06-non-relational/images/cosmosdb-emulator-persons.png) #### Заявяване на документни данни с емулатора Cosmos DB Можем също да заявим примерните данни, като кликнем върху бутона за нова SQL заявка (вторият бутон отляво). `SELECT * FROM c` връща всички документи в контейнера. Нека добавим условие WHERE и намерим всички, които са по-млади от 40 години. `SELECT * FROM c where c.age < 40` ![Изпълнение на SELECT заявка върху примерни данни в емулатора Cosmos DB, за да се намерят документи с поле age, което е по-малко от 40](../../../../2-Working-With-Data/06-non-relational/images/cosmosdb-emulator-persons-query.png) Заявката връща два документа, като забележете, че стойността на age за всеки документ е по-малка от 40. #### JSON и документи Ако сте запознати с JavaScript Object Notation (JSON), ще забележите, че документите изглеждат подобно на JSON. В тази директория има файл `PersonsData.json` с повече данни, които можете да качите в контейнера Persons в емулатора чрез бутона `Upload Item`. В повечето случаи API-та, които връщат JSON данни, могат директно да бъдат прехвърлени и съхранени в документни бази данни. По-долу е даден друг документ, който представлява туитове от акаунта на Microsoft в Twitter, извлечени с Twitter API и след това добавени в Cosmos DB. ```json { "created_at": "2021-08-31T19:03:01.000Z", "id": "1432780985872142341", "text": "Blank slate. Like this tweet if you’ve ever painted in Microsoft Paint before. https://t.co/cFeEs8eOPK", "_rid": "dhAmAIUsA4oHAAAAAAAAAA==", "_self": "dbs/dhAmAA==/colls/dhAmAIUsA4o=/docs/dhAmAIUsA4oHAAAAAAAAAA==/", "_etag": "\"00000000-0000-0000-9f84-a0958ad901d7\"", "_attachments": "attachments/", "_ts": 1630537000 ``` Полетата от интерес в този документ са: `created_at`, `id` и `text`. ## 🚀 Предизвикателство Има файл `TwitterData.json`, който можете да качите в базата данни SampleDB. Препоръчително е да го добавите в отделен контейнер. Това може да се направи чрез: 1. Кликване върху бутона за нов контейнер в горния десен ъгъл 1. Избор на съществуващата база данни (SampleDB) и създаване на идентификатор за контейнера 1. Задаване на ключ за разделяне `/id` 1. Кликване върху OK (можете да игнорирате останалата информация в този изглед, тъй като това е малък набор от данни, който се изпълнява локално на вашата машина) 1. Отворете новия си контейнер и качете файла с Twitter данни чрез бутона `Upload Item` Опитайте да изпълните няколко SELECT заявки, за да намерите документи, които съдържат Microsoft в полето text. Подсказка: опитайте да използвате [ключовата дума LIKE](https://docs.microsoft.com/en-us/azure/cosmos-db/sql/sql-query-keywords#using-like-with-the--wildcard-character). ## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ds/quiz/11) ## Преглед и самостоятелно обучение - Има допълнителни форматирания и функции, добавени към тази електронна таблица, които тази лекция не обхваща. Microsoft има [голяма библиотека с документация и видеа](https://support.microsoft.com/excel) за Excel, ако се интересувате да научите повече. - Тази архитектурна документация описва характеристиките на различните типове нерелационни данни: [Нерелационни данни и NoSQL](https://docs.microsoft.com/en-us/azure/architecture/data-guide/big-data/non-relational-data) - Cosmos DB е облачна нерелационна база данни, която може също да съхранява различните типове NoSQL, споменати в тази лекция. Научете повече за тези типове в този [Microsoft Learn модул за Cosmos DB](https://docs.microsoft.com/en-us/learn/paths/work-with-nosql-data-in-azure-cosmos-db/) ## Задача [Soda Profits](assignment.md) --- **Отказ от отговорност**: Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.