Что такое идеальный "квант информации" или "минимальная единица смысла" и зачем задаваться этим вопросом? С этим связано много боли, часто даже неосознаваемой. Мы предлагаем решение, но сначала нужно разобраться для чего это нужно. Рекомендуем ознакомиться с первой статьёй в серии.
Ретроспектива
Relational tables, document oriented databases, jsonb stores... В них мы часто представляем минимальной единицей смысла модель в таблице/коллекции. Модель состоит из разной структуры колонок/полей, и отражает некий реальный объект или абстрактную концепцию автора.
Такой подход создает проблемы:
Множество пространств адресации. (Если вы не видите ее, вскоре будет статья исключительно на эту тему, и вы увидите почему это проблема реальна).
Множество точек контроля структуры данных, изменение которых стоит дорого.
Совместимость только на том уровне который заложен автором.
Неспособность полноценно описать что-то новое без создания еще одной таблицы/коллекции.
Невозможность разделить предметы от отношений между ними.
Все эти проблемы решаются в ассоциативной модели данных Deep.Case.
Если вам интересна оптимизация или поиск по диапазонам в графе - здесь будет ссылка.
Давайте разбираться
Deep.Case оперирует концепцией Link (связь) как минимальной единицей смысла / квантом информации.
Links таблица
Links (сеть связей) очень похожа на граф, однако в графе есть однозначное деление на nodes (узлы) и edges (рёбра) ссылающиеся только на них. Links не разделяет эти пространства адресов. Это позволяет связям ссылаться на связи и нести любой смысл который в них может заложить автор моделей данных.
![](https://habrastorage.org/getpro/habr/upload_files/a39/e1a/626/a39e1a626e0ee204f77c302c61bb2b50.png)
Link структура
Структура связи состоит из обязательных уникального id
связи и type_id
связи используемой как тип данной связи. Необязательные поля from_id
и to_id
могут быть заполнены только вместе.
Типы для создания связей легко создаются пользователем самостоятельно в рамках модели проекта, или поставляются вместе с импортируемыми моделями-пакетами.
Заполненные поля from_id
и to_id
ссылаются на другие связи. Такими связями можно описывать любые отношения.
![](https://habrastorage.org/getpro/habr/upload_files/cd7/d38/bbf/cd7d38bbf190d0b5d14edf2538bd9e02.png)
{
links(where: { id: { _eq: 8 } }) {
id
type_id
from_id
to_id
}
}
{
"data": {
"links": [
{
"id": 8,
"type_id": 1,
"from_id": 7,
"to_id": 6
}
]
}
}
Link как узел (node)
В связях можно не заполнять from_id
и to_id
. Такие связи играют роль node, узла, точки, предмета отношений.
![](https://habrastorage.org/getpro/habr/upload_files/5d1/629/0e4/5d16290e4894febb529dcefdc5327822.png)
{
links(where: { id: { _eq: 28 } }) {
id
type_id
from_id
to_id
}
}
{
"data": {
"links": [
{
"id": 28,
"type_id": 6,
"from_id": 0,
"to_id": 0
}
]
}
}
Link как связь
Если from_id
и to_id
заполнены, связь играет роль отношения между узлами или связями. Она может ответить на вопрос как они связаны используя type_id
. Некоторое окружение узла связями может ответить на множество вопросов о его смысле, отношениях, предназначении, значении и состоянии.
![](https://habrastorage.org/getpro/habr/upload_files/16b/b94/bea/16bb94bea872a15df69222c99df6dc0a.png)
{
links(where: { id: { _in: [6,7,8] } }) {
id
type_id
from_id
to_id
}
}
{
"data": {
"links": [
{
"id": 6,
"type_id": 1,
"from_id": 0,
"to_id": 0
},
{
"id": 7,
"type_id": 1,
"from_id": 0,
"to_id": 0
},
{
"id": 8,
"type_id": 1,
"from_id": 7,
"to_id": 6
}
]
}
}
Единый GraphQL API
Это API позволяет очень многое, как например переходы по индексам на всех детей/родителей в определенных поддеревьях. Но об этом будут отдельные статьи.
Очевидно, что там доступна структура самой связи, а также из связи можно перейти к другим связям как по ее ссылкам (from_id
и to_id
), так и по обратным ссылкам от других связей (исходящих и входящих). Например, можно перейти на все связи которые ссылаются на данную связь по from_id
(исходят из неё) с помощью relationship out
, или по to_id
(входят в неё) с помощью relationship in
.
![](https://habrastorage.org/getpro/habr/upload_files/dd3/9be/444/dd39be444efc81242c1e74672c566e43.png)
{
links(where: { id: { _eq: 8 } }) {
id
type {
id
}
from {
id
type_id
from_id
to_id
out {
id
type_id
from_id
to_id
}
}
to {
id
type_id
from_id
to_id
in {
id
type_id
from_id
to_id
}
}
}
}
{
"data": {
"links": [
{
"id": 8,
"type": {
"id": 1
},
"from": {
"id": 7,
"type_id": 1,
"from_id": 0,
"to_id": 0,
"out": [
{
"id": 8,
"type_id": 1,
"from_id": 7,
"to_id": 6
}
]
},
"to": {
"id": 6,
"type_id": 1,
"from_id": 0,
"to_id": 0,
"in": [
{
"id": 8,
"type_id": 1,
"from_id": 7,
"to_id": 6
},
{
"id": 13,
"type_id": 1,
"from_id": 6,
"to_id": 6
},
{
"id": 24,
"type_id": 22,
"from_id": 23,
"to_id": 6
}
]
}
}
]
}
}
SQL-like queries
Мы можем не только получать данные по описанным выше структурам. Мы можем применять sql-like where
предикат для выполнения разнообразных сложных фильтраций на каждом уровне.
{
links(where: {id: { _eq: 6 } }) {
id
type { id }
from { id }
to { id }
out(where: { from_id: { _eq: 6} }) {
id
type_id
from_id
to_id
}
in(where: { type_id: { _eq: 1} }, limit: 1) {
id
type_id
from_id
to_id
}
}
}
{
"data": {
"links": [
{
"id": 6,
"type": {
"id": 1
},
"from": null,
"to": null,
"out": [
{
"id": 13,
"type_id": 1,
"from_id": 6,
"to_id": 6
}
],
"in": [
{
"id": 8,
"type_id": 1,
"from_id": 7,
"to_id": 6
}
]
}
]
}
}
Subscriptions
И все это сразу с поддержкой подписок. Вы можете просто сказать на изменение какой структуры вы хотите подписаться - и вы будете получать обновления результатов вашего запроса.
subscription {
links(where: { from_id: { _eq: 7 }, to_id: { _eq: 6 } }) {
id
type_id
}
}
Поддержите ассоциативные технологии
Мы создаем среду разработки (коробочную CE/EE версию и SaaS версию), позволяющую использовать ассоциативный подход для решения ваших бизнес задач, нуждающихся в хранении данных, с возможностью адаптации под любые изменения бизнеса. Мы создадим распределённую сеть серверных кластеров в едином ассоциативном пространстве, в том числе чтобы не думать о региональном законодательстве, создавая проект. Мы создаём культуру публикации повторно используемых моделей данных с их поведением.
Присоединяйтесь к нашему сообществу в Discord. Подпишитесь на ранний доступ в нашем Waitlist или поддержите нас на Patreon. http://deep.foundation/
На нашем сайте можно найти ссылки на черновики будущих статей находящихся в разработке, ссылки на исходники кода, планы по project и product менеджменту и invest презентации.