Задание правильных типов полей в таблице MySQL - это важный этап проектирования базы данных. Правильные типы данных помогут оптимизировать хранение информации и ускорить выполнение запросов.
Основные типы данных MySQL и рекомендации по их использованию, в том числе при миграциях в Laravel.
Типы полей в MySQL
1. Числовые типы
- INT
: Используется для целых чисел.
- TINYINT
: Для очень небольших целых чисел (от -128 до 127 или от 0 до 255).
- SMALLINT
: Для небольших целых чисел (от -32,768 до 32,767).
- MEDIUMINT
: Для средних целых чисел (от -8,388,608 до 8,388,607).
- BIGINT
: Для больших целых чисел (от -2^63 до 2^63-1).
- FLOAT
и DOUBLE
: Для чисел с плавающей запятой.
2. Строковые типы
- VARCHAR(n)
: Для строк переменной длины.
- CHAR(n)
: Для строк фиксированной длины.
- TEXT
: Для хранения больших текстов.
- BLOB
: Для хранения двоичных данных.
3. Дата и время
- DATE
: Для хранения даты (YYYY-MM-DD).
- TIME
: Для хранения времени (HH:MM:SS).
- DATETIME
: Для хранения даты и времени (YYYY-MM-DD HH:MM:SS).
- TIMESTAMP
: Похоже на DATETIME
, но автоматически обновляется при изменении записи.
4. Логические типы
- BOOLEAN
: Используется TINYINT(1)
для логических значений.
Рекомендации по выбору типов данных
1. Используйте минимально необходимый тип данных для ваших нужд.
2. Используйте VARCHAR
для строк, которые могут изменяться по длине, а CHAR
для фиксированных строк.
3. При использовании индексов учитывайте, что более длинные поля замедляют операции.
4. Для цен используйте DECIMAL
с заданным количеством знаков после запятой.
Пример таблицы с правильными типами данных
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
quantity INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Типы полей в Laravel
Примеры миграций с различными типами данных1. Числовые типы
Schema::create('products', function (Blueprint $table) {
$table->id(); // Это по умолчанию BIGINT
$table->tinyInteger('rating')->nullable(); // TINYINT
$table->smallInteger('stock')->default(0); // SMALLINT
$table->integer('price'); // INT
$table->float('discount')->nullable(); // FLOAT
$table->double('price_with_tax', 15, 8); // DOUBLE
});
2. Строковые типы
Schema::create('users', function (Blueprint $table) {
$table->id(); // BIGINT
$table->string('name', 100); // VARCHAR(100)
$table->string('email')->unique(); // VARCHAR
$table->char('country_code', 2); // CHAR(2)
$table->text('bio')->nullable(); // TEXT
$table->binary('avatar')->nullable(); // BLOB
});
3. Типы даты и времени
Schema::create('orders', function (Blueprint $table) {
$table->id(); // BIGINT
$table->date('order_date'); // DATE
$table->time('delivery_time'); // TIME
$table->dateTime('created_at')->useCurrent(); // DATETIME
$table->timestamp('updated_at')->nullable(); // TIMESTAMP
});
4. Логические типы
Schema::create('settings', function (Blueprint $table) {
$table->id(); // BIGINT
$table->boolean('is_active')->default(true); // TINYINT(1)
});
Пример полной миграции
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProductsTable extends Migration
{
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->id(); // BIGINT
$table->string('name', 100); // VARCHAR(100)
$table->text('description')->nullable(); // TEXT
$table->decimal('price', 10, 2); // DECIMAL (10, 2)
$table->integer('quantity')->default(0); // INT
$table->timestamps(); // created_at и updated_at
});
}
public function down()
{
Schema::dropIfExists('products');
}
}
Общие рекомендации
1. Используйте nullable()
: Для полей, которые могут не иметь значения.
2. Используйте default(value)
: Для задания значений по умолчанию.
3. Имейте в виду уникальность: Метод unique()
обеспечивает уникальность значения в столбце.