(orientdb, neo4j) • key-value (redis, memcache) ...тысячи их • JS, Cypher, API любого языка • динамическая схема данных • специфические модели данных ◦ колонки (без кортежей) ◦ графы ◦ иерархические данные ◦ ключ-значение MySQL Mongo DB
on .. join document_type_attribute dta .. join document_attribute da .. join document_datetime_attribute ddta on ddta.id = ... … N штук типов семантик join organization_documents od on od.id_dts = dta.id and … … M штук типов ссылок на сущности
деньги • репликация (читаем с рабов) • шардинг (+денормализация) • горизонтальный шардинг Все это непросто и дорого! … но будет ли у вас столько данных? … нет, 10 миллионов строк это не много. NOSQL • просто добавим ноду • суп из семи Hadoop … жизнь без наркотиков … потеря данных не критична
нет транзакций - нет и С I read uncommitted, MDW D just NO • read concern levels • write concern flags (w, j ) • two phase commits (intermediate data concern) MySQL Mongo DB
решают кто главный • можно получить подтверждение записи в логах главного или остальных узлов ценой увеличившейся latency • и primary УПАЛ. • если остальные составляют большинство, то новый primary - узел с наивысшим optime • меньшинство видит, что кворума нет, primary теряет чин, запись на него невозможна. • GOOD NEWS - NO SPLIT BRAIN! ВСЕ ПОШЛО НЕ ТАК
не реплицированные записи • сеть вернулась и новый secondary должен ОТМЕНИТЬ эти операции Количество отмененных данных зависит от того, что успело реплицироваться на нового primary, и это ОЧЕНЬ БОЛЬНО! (P.S. данные почти наверняка остались в папке rollbacks). (P.P.S иногда они просто пропадают и все)
выбора инструментов • bleeding edge крутейших технологий, требующих высокой квалификации кодеров • нужно искать УМНОГО разработчика, знакомого именно с выбранной СУБД • или УЧИТЬСЯ, УЧИТЬСЯ и УЧИТЬСЯ!
• indexes • hadoop connector CREATE TABLE A ( data JSON CONSTRAINT validateId CHECK ((data->>'id')::integer >= 1 AND (data->>'id') IS NOT NULL ), CONSTRAINT validateName CHECK (length(data->>'name') > 0 AND (data->>'name') IS NOT NULL ) ); INSERT INTO A(data) VALUES( '{ "id": 1, "name": "A", "age": 49 }'); CREATE UNIQUE INDEX ui_a_id ON a((data->>'id'));