Где лушче держать поля которые часто меняются? остатки, цены. Отдельно?

Существует несколько подходов к хранению изменяющихся полей в Laravel, таких как остатки и цены. Далее разберем две основных стратегии управления этими полями.

1. Хранение в отдельной таблице:

Одним из распространенных подходов является создание отдельной таблицы для хранения изменяющихся полей. Это позволяет легко обновлять значения этих полей без вмешательства в основную таблицу.

Пример схемы таблиц:

Schema::create('products', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    // Добавляем дополнительные поля, которые часто меняются
    $table->timestamps();
});

Schema::create('product_variations', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('product_id')->unsigned();
    $table->decimal('price', 8, 2);
    $table->integer('quantity');
    $table->timestamps();

    $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
});

В данном примере у нас есть таблица products, которая содержит основную информацию о продуктах, и таблица product_variations, которая содержит изменяющиеся поля, такие как цена и количество.

Для доступа к изменяющимся полям, следует использовать отношение "один-ко-многим" между таблицами products и product_variations.

2. Использование JSON столбца:

В Laravel также есть возможность использовать JSON столбцы для хранения изменяющихся полей. Это особенно полезно, если количество полей относительно невелико и их значения могут варьироваться для каждой записи.

Пример схемы таблицы:

Schema::create('products', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->json('metadata')->nullable();
    $table->timestamps();
});

В данном примере у нас есть таблица products, которая содержит столбец metadata типа JSON, где можно хранить информацию о изменяющихся полях, например, цена и количество.

Для доступа к полям в JSON столбце в Laravel 5.6 и выше, можно использовать встроенный класс Json. Например:

$product = Product::find(1);
$price = $product->metadata->get('price');
$quantity = $product->metadata->get('quantity');

Оба подхода имеют свои плюсы и минусы, и выбор между ними зависит от конкретных требований вашего проекта. Если количество полей невелико или их значения могут варьироваться для каждой записи, JSON столбцы могут быть более удобным и гибким решением. В то же время, если количество полей велико и для всех записей значение полей одинаково, лучше использовать отдельную таблицу.

Необходимо учитывать также производительность и индексацию данных при выборе подхода к хранению изменяющихся полей.