Category:

Метамоделирование: часть 1

Число таблиц в базе данных стало зашкаливать. Было принято жёсткое решение — не позволять их числу расти. И тут приходят на помощь метамодели. Есть всякие. 

  • Есть метаописание SOA с генератором запросов. В таком случае в каком-нибудь Oracle используют пакет dbms_sql, а в таблицах лежат нарезанными куски запросов или запросы с макросами.
  • Есть графы и гиперграфы, вырождающиеся в нечто подобное тому, что творится в Facebook.
  • Есть иерархические метамодельки, которые на первый взгляд дружат с ООП, но на деле порождают ад, когда попытаешься натянуть на них подсистему с Workflow внутри. 
  • И ещё что-то, чего я не видел, конечно.

Как водится, я в сторонке стоял по большей части, когда другие метамоделировали! Но некоторые вещи всё же умудрился пощупать вплотную. 

Взял иерархическую метамодельку за основу и решил натянуть её на Haskell с его интересными ADT. СУБД в проекте — PostgreSQL. Да, с текущими драйверами постгреса в хаскеле пока дела обстоят туговато. Все они завязаны на libpq, в недрах которого синхронно гоняются строки. 

Нативных драйверов готовых нет, есть два экспериментальных: 

  • Hasql >= 0.20.
  • postgresql-wire (нет на Hackage).

А они уже очень скоро понадобятся. Потому как уже очень скоро я упрусь в тормоза.

Завёл пока «строку», «число» и «время» в кач-ве типов атрибутов. Завёл парочку объектных типов. Завёл рута-родителя. И начал собирать грабельки.

Сначала выяснилось, что для 1 типа данных с 8 рекордами нужно заселектить 2-3 поля самого объекта и 24 поля на все рекорды (3 поля на рекорд). Чтобы это сделать красиво одним запросом с 8 джойнами, нужно, чтобы имеющиеся библиотеки позволяли дергать столько полей. Иначе чехарда с множеством запросов, пока оставил такой хак.

Затем далее, само собой, нужны (де-)сериализация из объектов и типов туда и обратно в хаскельный тип данных. Эту проблему решил быстро с помощью линз. Правда уж очень много копипаста получилось. Хочется теперь частично применить traverse для групп рекордов одного типа или пробросить функцию конверсии текста к конкретному типу, чтобы закрыть все типы, но так нельзя вроде.

Имея на руках тип, серверный Handler собрался безо всякого труда.

Ну и пока всё. Work in progress. Как говорится, To be continued... 


Error

default userpic

Your IP address will be recorded 

When you submit the form an invisible reCAPTCHA check will be performed.
You must follow the Privacy Policy and Google Terms of use.