Введение


В статье «Реляционно-сетевая модель данных» была предложена новая концепция моделирования данных HTMS, являющаяся развитием канонической реляционной модели. В настоящем материале будет показано на примерах, как ее можно практически использовать с применением API логического уровня.

Примеры привязаны к широко известному учебно-методическому решению по созданию сайтов — шаблону веб-проекта опросов на фреймворке Django в MS Visual Studio.

Для понимания статьи требуется знание основ языка Python и фреймворка Django.


Описание базы данных


Концептуальная схема данных — это четыре таблицы и описание зависимостей между ними:




Примечания:

  • порядковый номер ответа в опросе — используется только для формирования queryset при показе страницы с опросом
  • имя зарегистрированного на сайте участника опроса — заполняется только для пользователей, прошедших регистрацию (голосовать и комментировать могут и не прошедшие регистрацию). Зарегистрированные пользователи могут предлагать создавать новые опросы, но такие тонкости в данной статье мы не рассматриваем.

Зависимости:

  1. Каждому опросу (строке в таблице Polls ) соответствуют 2 или более ответа, т.е. строки в таблице Answers
  2. Каждому ответу (строке в таблице Answers ) соответствуют 0 или более комментариев, т.е. строки в таблице Comments
  3. Если посетитель сайта проголосовал первый раз, то для него создается новая строка в в таблице Visiters. Идентифицируются пользователи по ip-адресу
  4. После каждого голосования количество поданных голосов за выбранный ответ в опросе увеличивается на 1
  5. Сайт должен помнить, какие ответы давал каждый посетитель, и какие комментарии оставлял: каждый комментарий пользователя записывается в новую строку таблицы Comments

Формализация базы данных средствами ORM Django


Сначала покажем, как база данных была бы описана традиционно — средствами классов пакета models Django.



Примечания:

  • Атрибут polls может показаться избыточным, так как возможно получить список опросов через список ответов, но это сделано для того, чтобы не потерять факт участия в опросе в случае удаления ответа из опроса
  • Django физически создает (или изменяет) базу данных до начала первого запуска программы сайта на основе пользовательских подклассов models.Model по командам python manage.py migrate и makemigrations, которые выполняются в контексте приложения

Формализация базы данных средствами HTMS


Для создания описания базы данных необходимо определить ее классы:



Polls_db — главный класс базы данных для приложения сайта опросов. Главный класс БД определяется как подкласс HTdb, который в HTMS служит суперклассом для баз данных приложения(их может быть несколько).


Polls, Answers, Comments, Visiters — классы для таблиц БД. Table — один из основных классов HTMS, служит суперклассом для классов конкретных таблиц.


HTMS создает (или открывает уже имеющуюся) базу данных непосредственно при исполнении программы сайта. Соответствующие варианты:

  1. Cоздать новую БД с именем «polls»:
    my_db = Polls_db( db_name= «polls», new = True )
    • будут физически созданы основные файлы БД («пустые»),
    • в ОП будет создан основной объект базы данных my_db — экземпляр класса Polls_db.

  2. Открыть БД с именем «polls»:
    my_db = Polls_db( db_name= «polls» )
    • будут физически открыты основные файлы существующей БД,
    • в ОП будет создан объект my_db, в атрибутах которого находится основная информация о БД, прочитанная из ее файлов.

Когда имеется новая БД, созданная при инициализации экземпляра подкласса HTdb, необходимо определить собственно структуру (схему) на логическом уровне. Делается это один раз при первом запуске сайта, но, в отличие от технологии ORM, в самом программном коде сайта.


  1. Определить все атрибуты БД – их имена и типы данных:

  2. Определить типы атрибутов со ссылками (остальные по умолчанию будут типа ‘cause’):

  3. Определить объекты таблиц и выбрать атрибуты (столбцы) для них из множества всех атрибутов ГТ:


Выполнение этого кода приведет к формированию структуры БД и созданию на сервере соответствующих файлов, если БД — новая.


Если БД уже была создана, для работы с ней нужно только создать экземпляры классов таблиц:


Сравнение HTMS и ORM


Очевидно, что формализация схемы данных на логическом уровне в HTMS и ORM схожи, но имеется ряд принципиальных отличий.


В HTMS атрибуты и типы данных определяются как единое пространство, в ORM они привязаны к отдельным таблицам.


Все множество атрибутов базы данных в ORM создается «аддитивно», по мере определения моделей, менять их программно нельзя, а в HTMS – для всей базы данных в целом, причем можно их добавлять или удалять в приложении без миграции.


Атрибуты для каждой отдельной модели в ORM – статичны, а в HTMS – динамичны. Структуры таблиц в HTMS задаются как проекции единого пространства атрибутов — это проще и нагляднее, чем в ORM.В алгоритмах сайта на HTMS может быть предусмотрены возможности для изменений первоначальной структуры БД, например добавление новых атрибутов или удаление имеющихся, что в принципе невозможно в технологии ORM.


Заметим, что технология HTMS, если ее применять в фреймворке Django, только расширяет его возможности, и не требует отказа от использования ORM. Например, вся великолепная система аутентификации Django, основанная на моделях и классе User (из модуля django.contrib.auth.models ), может использоваться. Поэтому реально сайт на Django с HTMS обычно будет «мультимодельным», то есть одна часть общей базы данных будет чисто реляционная, другая — реляционно-сетевая.


Примеры использования HTMS на логическом уровне для БД опросов


Функция-утилита для первичного заполнения БД из JSON файла


Функция формирования множества объектов с опросами (queryset для class based view — CBV опросов)


Функция формирования множества объектов с ответами по опросу (queryset для CBV ответов к опросу)


Функция формирования множества объектов с результатами голосования по опросу (queryset для CBV)


Функция для записи результата голосования в базу (вызывается через URL из формы голосования)




Надеемся, что читатели оценят простоту и естественность работы с данными в HTMS!

Комментарии (1)


  1. Andrew_Pinkerton
    14.08.2019 03:51
    +1

    Использование изображения для вставки фрагментов кода, да еще и с ужасно отрендеренным шрифтом это теперь на Хабре best practice?

    Spoiler header