Правильно ли реализовал подключение к БД?
echo "Не удалось подключиться к MySQL: {$db->connect_error}";
В таких случаях нужно кидать эксепшн. Нет подключения к бд - нет смысла выполнять  программу, нужно умирать. А если есть смысл, то тогда отлавливать брошенный эксепшн на других уровнях и как-то обрабатывать эту ситуацию.
Зашивать подключение в модель - плохо. Лучше для этого создать отдельный класс Connection. Вместо mysqli лучше использовать PDO, не завязываться на конкретную базу.
Вместо сырых SQL запросов лучше взять готовый DAO класс или написать свой, чтобы не зависеть от синтаксиса SQL запросов конкретной базы.
Закрывать соединение с бд в модели - плохо. Закрывать соединение с бд лучше на уровне приложения, после того, как отработал экшен контроллера.
Вообще стоило бы почитать про GRASP и SOLID. Наследование не всегда хорошо, иногда лучше использовать композицию и зависеть от абстракций, а не от конкретных реализаций. Тогда будет возможность полиморфно заменять одну реализацию на другую, не ломая OCP из SOLID.
Посмотрите лучше любой популярный фреймворк, чтобы понять как и что примерно работает.
Я бы порекомендовал не хранить данные для подключения к базе в константах. Я бы написал это так:class Model
  {
    private static $db_creds = [
        'user' => 'blog',
        'host' => 'localhost',
        'pass' => '12345',
        'db'    => 'blog'
    ];

    static function db()
    {
      // закешируем соединение, зачем каждый вызов создавать новое?
      static $db;
      if (is_null($db)) {
          $db = new mysqli(
              self::$db_creds['host'], 
              self::$db_creds['user'], 
              self::$db_creds['pass'], 
              self::$db_creds['db']
          );
          if ($db->connect_errno) {
              echo "Не удалось подключиться к MySQL: {$db->connect_error}";
              // в следующий вызов попробуем еще раз
              $db = null;
          }
      }
      return $db;
    }

    public function get_data()
    {}
  }
И посоветовал бы использовать исключения для обработки ошибок. Их не нужно показывать пользователю, лучше их обработать, например, показать закешированную версию, перенаправить на другую страницу, показать красивое уведомление о 500 и т.д.