BugzillaORM
У Bugzilla половина коду в шаблонах, половина на основі напів-ORM'а Bugzilla::Object. Більшість — говнокод. З одного боку - ORM би туди, було б класно, АЛЕ! ORM мало, і потрібний не він! Майже всі існуючі ORM-движки (крім хіба що Django Models) - це просто об'єктний інтерфейс до бази даних. А потрібне якесь об'єктне ядро, яке б дозволяло створювати свої об'єкти, з полями різних типів, у тому числі і тими, що посилаються на інші об'єкти, з можливістю приписування спеціальних особливостей полям, із загальними механізмами зберігання історії, розсилки повідомлень, системою прав та з автоматичним базовим CRUD -інтерфейс.
Ідеї створення об'єктного ядра
Об'єкти в Bugzilla
Причому, ясна річ, якщо баг належить до деякого продукту (через компонент), то його версія, milestone, agreement повинні належати до того ж продукту. Зараз у Bugzilla це реалізується так — для кожної сутності, пов'язаної з багом, у базі є поле, а для обмеження значень полів поля робляться залежними від інших полів. Через це там купа милиць і по суті повісити залежність на відмінне від поля «продукт» поле неможливо.
Мінуси поточної реалізації
Чим погана поточна багзильна реалізація цього добра?
Дуже просто: майже ні хрону не налаштовується - не можна ні додати свої можливості, ні відрубати непотрібні вбудовані. Бо все жорстко та криво (хардкод). А ще:
Проект супер-об'єктного-ядра
Що пропонується зробити:
Таким чином наш трекер перетвориться, по суті, на модульний додаток, побудований навколо дуже прокачаного автоінтерфейсу полів та об'єктів. Звичайно, це вже не Bugzilla жодного разу, зате чимось схоже на Roundup - "конструктор трекерів". Однак і з ним відмінностей багато – roundup не вмієзалежних селект-полів, модель задається у коді, права доступу слабкі, пошук слабкий.
Оновлення моделі
Оновлення бази багзильське (тупа послідовність операцій):
- (+) Очевидний порядок оновлень, немає проблем із їхніми залежностями один від одного (нові просто дописуються в кінець, порядок завжди правильний)
- (-) Не перевіряється, чи коректна схема БД після оновлень
- (-) Оновлення задаються саме для SQL БД, а не для метамоделі
- (-) Не дуже гарна онучка у функції оновлення БД
Оновлення нашої бази:
Виходить, що ядро моделі складається з наступних таблиць: