All streams
Search
Write a publication
Pull to refresh

Comments 6

Поздравляю: вы почти переизобрели turtle. Осталось добавить namespaces, shacl validation и прочие инструменты из мира графов.

Ну, моя роль гораздо скромнее. Я не разрабатывал универсальный синтаксис для описания всего на свете, а просто решал типовую проблему в хранилищах данных. Данные между информационными системами передаются обычно в денормализованном виде (таблицы с сотнями столбцов - атрибутов). В хранилище данных их нормализуют (исключают дублирование данных в таблицах путем использования ссылок на справочники), чтобы проще было выполнять сложные аналитические запросы к данным. Обычно нормализуют до 3NF и очень редко до 6NF, так как для 6NF до сих пор нет удобного инструментария (см. мой DSL). А затем данные опять денормализуют в витринах данных для формирования отчетов для внешних потребителей. Все эти циклы нормализация - денормализация - нормализация - денормализация обходятся IT-подразделениям очень дорого. Поэтому у меня возникла идея передавать данные между информационными системами непосредственно в нормализованном виде, чтобы больше ничего не приходилось нормализовывать. Прообразом послужили методологии Anchor Modeling и (в гораздо меньшей степени) Data Vault. Кстати, для Anchor Modeling есть очень удобный инструмент создания ER-диаграмм, который действительно сближает мой формат с миром графов.

The same example in JSON format (JSON-6NF):

[
  {
    "type": "ENTITY",
    "table": "bank",
    "entity_id": "01K3Y0690AJCRFEJ2J49X6ZECY"
  },
  {
    "type": "REFERENCE",
    "table": "country_code",
    "reference_id": "01K3Y07Z94DGJWVMB0JG4YSDBV",
    "value": "US"
  },
  {
    "type": "ATTRIBUTE_OF",
    "entity_name": "bank",
    "entity_id": "01K3Y0690AJCRFEJ2J49X6ZECY",
    "table": "bank_name",
    "value": "Bank Alpha",
    "valid_from": "2023-01-01T00:00:00Z",
    "recorded_at": "2023-01-01T12:00:00Z"
  },
  {
    "type": "ATTRIBUTE_REF_OF",
    "entity_name": "bank",
    "entity_id": "01K3Y0690AJCRFEJ2J49X6ZECY",
    "table": "country_code",
    "reference_id": "01K3Y07Z94DGJWVMB0JG4YSDBV",
    "valid_from": "2023-01-01T00:00:00Z",
    "recorded_at": "2023-01-01T12:00:00Z"
  },
  {
    "type": "STRUCT_OF",
    "entity_name": "bank",
    "entity_id": "01K3Y0690AJCRFEJ2J49X6ZECY",
    "table": "bank_address",
    "valid_from": "2023-01-01T00:00:00Z",
    "recorded_at": "2023-01-01T12:00:00Z",
    "columns": {
      "country_code": "01K3Y07Z94DGJWVMB0JG4YSDBV",
      "street": "123 Main St",
      "city": "New York",
      "zip": "10001"
    }
  },
  {
    "type": "ENTITY",
    "table": "account",
    "entity_id": "01K3Y0G45CP4GMGE94BYQ09DFM"
  },
  {
    "type": "ATTRIBUTE_OF",
    "entity_name": "account",
    "entity_id": "01K3Y0G45CP4GMGE94BYQ09DFM",
    "table": "account_balance",
    "value": 100000.5,
    "valid_from": "2023-01-01T00:00:00Z",
    "recorded_at": "2023-01-01T12:00:00Z"
  },
  {
    "type": "ATTRIBUTE_OF",
    "entity_name": "account",
    "entity_id": "01K3Y0G45CP4GMGE94BYQ09DFM",
    "table": "account_expiration",
    "value": "2025-12-31T23:59:59Z",
    "valid_from": "2023-01-01T00:00:00Z",
    "recorded_at": "2023-01-01T12:00:00Z"
  },
  {
    "type": "RELATIONSHIP",
    "table": "bank_x_account",
    "relationship_id": "01K3Y0NR1Q3KTA9A6J9KYPK6YB",
    "valid_from": "2023-01-01T00:00:00Z",
    "recorded_at": "2023-01-01T12:00:00Z",
    "columns": {
      "bank": "01K3Y0690AJCRFEJ2J49X6ZECY",
      "account": "01K3Y0G45CP4GMGE94BYQ09DFM"
    }
  }
]

It's better to replace type with element_type to avoid conflict with JSON Schema.

Sign up to leave a comment.

Articles