[О блоге]
[наверх]
[пред]
[2025-10-08 16:50:08+03:00]
[f761d49124ad981a0d2c1943e1436c2f95749294]
Темы: [keks]
KEKS и 1NF
https://en.wikipedia.org/wiki/1NF
Столяров в 5e68d1f880d17b6464fb862a7ea2791440ad8fba много раз повторяет
мантру о том, что форматы данных где есть рекурсивные вложенные
структуры -- не имеют права на существование, типа XML, JSON, MIME. Типа
first normal form нормализации должно хватать для всего.
Я тут, в отличии от студентов начальных курсов, вообще не в теме. Я
слышал про нормализацию данных в СУБД, но никогда ничего не читал по
этому поводу. Что наверное крайне плохо говорит обо мне, как о
специалисте.
Видя многочисленные примеры ненормализованного представления данных и
должного нормализованного -- я просто понимаю, что и так делал всегда
всё должным образом нормализованным. Ну в преобладающем большинстве
случаев уж точно.
Насколько понял, то 1NF нормализованная форма вот такой структуры:
{
"foo": 123,
"bar": {"op": 1, "po": 2},
"baz": [4, 5, 6],
}
могла бы быть записана в виде одной единственной таблицы, где есть
уникальный идентификатор (порядковый номер), тип данных, возможное
значение, ссылка на другой элемент:
0 | map | - | -
1 | str | foo | 0
2 | str | bar | 0
3 | str | baz | 0
4 | int | 123 | 1
5 | lst | - | 2
6 | str | op | 5
7 | int | 1 | 6
8 | str | op | 5
9 | int | 2 | 8
10 | lst | - | 3
11 | int | 4 | 10
12 | int | 5 | 10
13 | int | 6 | 10
Это вроде бы довольно легко преобразовать в Python/Go в "изначальную"
структуру. Само кодирование бы было просто последовательностью строк
таблицы.
По сути -- всё как и сейчас в KEKS, вот только нет ссылок на другие
элементы. Если отталкиваться от того, что кодирование детерминированно:
ключи map-ов отсортированы, строки таблицы не могут идти в произвольном
порядке, то с наличием явного EOC "атома"/типа, от ссылок в последнем
столбце можно избавиться, так как они автоматом могут быть поняты и
вычислены. А это уже превращается буквально в текущий формат KEKS.
Или я совсем ничего не понял что Столяров подразумевал, так как ничего
не читал про теорию БД. Либо мой KEKS и так уже является
удовлетворительным форматом. Судя по всему, наезды то именно на форматы,
где значением элемента может быть рекурсивно очередная структура. Ну
типа вот читаешь про MIME и видишь его форматы заголовков перед частями,
оцениваешь насколько это сложно делать. Не сложно. Пока не попадаешь на
предложение, говорящее что элементом MIME part-а может быть другой MIME,
что сразу означает куда более сложную структуру данных в памяти и в
целом работу. Хотя ведь в XML мы тоже же можем "атомы" в виде тэгов
читать последовательно, так и чем же значение моего списка от LIST до
EOC отличается от значения куда встроены данные?
Мой Си декодер KEKS, вроде как уже точно, хранит декодированные данные в
1NF нормализованном виде. Это просто массив атомарных элементов, где они
могут ссылаться друг на друга. В зависимости от типа элемента
(list/map), это в более высокоуровневом языке, можно бы было сделать
list или map/dict. KEKS по сути является сериализацией 1NF таблицы
items, с оптимизацией по убиранию ссылок (последнего столбца таблицы) за
счёт более строгих правил по упорядочиванию элементов таблицы, ну и
наличии элемента явно сигнализирующим о конце list/map. Но в KEKS не
было аналогов ANY полей или реально вложенных в качестве значения других
элементов.
[оставить комментарий]