Comments 6
Ну, моя роль гораздо скромнее. Я не разрабатывал универсальный синтаксис для описания всего на свете, а просто решал типовую проблему в хранилищах данных. Данные между информационными системами передаются обычно в денормализованном виде (таблицы с сотнями столбцов - атрибутов). В хранилище данных их нормализуют (исключают дублирование данных в таблицах путем использования ссылок на справочники), чтобы проще было выполнять сложные аналитические запросы к данным. Обычно нормализуют до 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"
}
}
]
The same example in JSON format (JSON-6NF) and JSON Schema
6NF JSON.json
6NF File Format