Pull to refresh
85.82
Deep.Foundation
Фонд развития ассоциативных технологий.

Ассоциативные связи

Reading time4 min
Views4.8K

Что такое идеальный "квант информации" или "минимальная единица смысла" и зачем задаваться этим вопросом? С этим связано много боли, часто даже неосознаваемой. Мы предлагаем решение, но сначала нужно разобраться для чего это нужно. Рекомендуем ознакомиться с первой статьёй в серии.

Ретроспектива

Relational tables, document oriented databases, jsonb stores... В них мы часто представляем минимальной единицей смысла модель в таблице/коллекции. Модель состоит из разной структуры колонок/полей, и отражает некий реальный объект или абстрактную концепцию автора.

Такой подход создает проблемы:

  • Множество пространств адресации. (Если вы не видите ее, вскоре будет статья исключительно на эту тему, и вы увидите почему это проблема реальна).

  • Множество точек контроля структуры данных, изменение которых стоит дорого.

  • Совместимость только на том уровне который заложен автором.

  • Неспособность полноценно описать что-то новое без создания еще одной таблицы/коллекции.

  • Невозможность разделить предметы от отношений между ними.

Все эти проблемы решаются в ассоциативной модели данных Deep.Case.

Если вам интересна оптимизация или поиск по диапазонам в графе - здесь будет ссылка.

Давайте разбираться

Deep.Case оперирует концепцией Link (связь) как минимальной единицей смысла / квантом информации.

Links таблица

Links (сеть связей) очень похожа на граф, однако в графе есть однозначное деление на nodes (узлы) и edges (рёбра) ссылающиеся только на них. Links не разделяет эти пространства адресов. Это позволяет связям ссылаться на связи и нести любой смысл который в них может заложить автор моделей данных.

Link структура

Структура связи состоит из обязательных уникального id связи и type_id связи используемой как тип данной связи. Необязательные поля from_id и to_id могут быть заполнены только вместе.

Типы для создания связей легко создаются пользователем самостоятельно в рамках модели проекта, или поставляются вместе с импортируемыми моделями-пакетами.

Заполненные поля from_id и to_id ссылаются на другие связи. Такими связями можно описывать любые отношения.

{
  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, узла, точки, предмета отношений.

{
  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. Некоторое окружение узла связями может ответить на множество вопросов о его смысле, отношениях, предназначении, значении и состоянии.

{
  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.

{
  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 презентации.

Only registered users can participate in poll. Log in, please.
Задача по рефакторингу вам нужна для подготовки систем к следующим задачам по изменениям в бизнес логике?
50% Да7
50% Нет7
14 users voted. 2 users abstained.
Tags:
Hubs:
Total votes 8: ↑3 and ↓5-2
Comments11

Articles

Information

Website
deep.foundation
Registered
Founded
Employees
31–50 employees
Location
Россия
Representative
Константин Дьяченко