I used to do this pattern a lot, but since MySQL now has JSON fields, I find myself using those a lot more these days.
Everytime you get your product, you probably also want to show its options right? Create a json type field on the products table, called 'options'.
Put this in the Product model:
protected $casts = ['options' => 'json'];
This will automatically save an array into a json string, and decode that json string back into an array when you fetch it from the DB.
$product = Product::find(1);
$product->options = [
'color' => 'Blue',
'size' => 'medium',
'weight' => 'heavy',
];
$product->save();
$blueProducts = Product::where('options->color', 'Blue')->get();
dd($blueProducts );
A lot easier then keeping those 3 tables.