shouldRun()) { return; } Schema::create('pulse_values', function (Blueprint $table) { $table->id(); $table->unsignedInteger('timestamp'); $table->string('type'); $table->mediumText('key'); match ($this->driver()) { 'mariadb', 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'), 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'), 'sqlite' => $table->string('key_hash'), }; $table->mediumText('value'); $table->index('timestamp'); // For trimming... $table->index('type'); // For fast lookups and purging... $table->unique(['type', 'key_hash']); // For data integrity and upserts... }); Schema::create('pulse_entries', function (Blueprint $table) { $table->id(); $table->unsignedInteger('timestamp'); $table->string('type'); $table->mediumText('key'); match ($this->driver()) { 'mariadb', 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'), 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'), 'sqlite' => $table->string('key_hash'), }; $table->bigInteger('value')->nullable(); $table->index('timestamp'); // For trimming... $table->index('type'); // For purging... $table->index('key_hash'); // For mapping... $table->index(['timestamp', 'type', 'key_hash', 'value']); // For aggregate queries... }); Schema::create('pulse_aggregates', function (Blueprint $table) { $table->id(); $table->unsignedInteger('bucket'); $table->unsignedMediumInteger('period'); $table->string('type'); $table->mediumText('key'); match ($this->driver()) { 'mariadb', 'mysql' => $table->char('key_hash', 16)->charset('binary')->virtualAs('unhex(md5(`key`))'), 'pgsql' => $table->uuid('key_hash')->storedAs('md5("key")::uuid'), 'sqlite' => $table->string('key_hash'), }; $table->string('aggregate'); $table->decimal('value', 20, 2); $table->unsignedInteger('count')->nullable(); $table->unique(['bucket', 'period', 'type', 'aggregate', 'key_hash']); // Force "on duplicate update"... $table->index(['period', 'bucket']); // For trimming... $table->index('type'); // For purging... $table->index(['period', 'type', 'aggregate', 'bucket']); // For aggregate queries... }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('pulse_values'); Schema::dropIfExists('pulse_entries'); Schema::dropIfExists('pulse_aggregates'); } };