$table->increments('detay_id'); eşit olduğu şudur:
$table->unsignedInteger('detay_id', true); // true olan 2. parametre AUTO_INCREMENT demek
$table->primary('detay_id');
Zaten yöntemi takip ederseniz bir çoğu üstteki gibi birden fazla satır yazmanızı engelleyen grup yöntem ya da aliastır:
public function increments($column)
{
return $this->unsignedInteger($column, true);
}
public function unsignedInteger($column, $autoIncrement = false)
{
return $this->integer($column, $autoIncrement, true);
}
public function integer($column, $autoIncrement = false, $unsigned = false)
{
return $this->addColumn('integer', $column, compact('autoIncrement', 'unsigned'));
}
public function addColumn($type, $name, array $parameters = [])
{
$this->columns[] = $column = new ColumnDefinition(
array_merge(compact('type', 'name'), $parameters)
);
return $column;
}
Yani bu durumda $table->increments('detay_id'); yerine
$table->addColumn('integer', 'detay_id', compact('autoIncrement', 'unsigned'));
de yazabilirsiniz. Elbette $table->increments() varken böyle bir kullanıma gerek yok, bilgi amaçlı yazdım.
2. sorunuza gelince;
MySQL'de foreign key oluştururken otomatik olarak index de oluşturur, sizin index oluşturmanıza gerek yok.
İyi/kötü, gerekli/gereksiz tamamen tabloyu nasıl kullandığınızla alakalı.
a) Çok fazla okuma yapıyor ama tablo nadiren güncelleniyorsa, kayıt ekleniyorsa indexler hızlı sorgu yapmanızı sağlar. Index demek, veritabanının kaydın nerede olduğunu bilmesi demek diyebilirsiniz. Index yoksa veritabanı tüm kayıtlara sırayla bakmak zorunda kalır.
Siz. foreign key oluşturduğunuzda başka bir tabloyu referans gösteriyorsunuz. Bak burada seninle alakalı kayıtlar var diyorsunuz, yani indexliyorsunuz. O yüzden aynı zamanda index oluşuyor ve bağlantılı sorgular daha hızlı yapılıyor.
b) Index, havada olan bir şey değil. Yer kaplar, oluşturulurken işlemci gücü yer, zaman harcar. Sürekli kayıt işlenen tablolarda oluşturulan ya da gereksiz oluşturulan indexler zamanla sistemi yavaşlatır. Bunu engellemek için (o tabloda indexler oluşturmak yerine) farklı tablolar oluşturulur, gerekli yerlerde birleştirilir, kayıtlar bölünür, ayrı yerde farklı bilgileri tutulur vs.... Bu tür işlemlere genel olarak veritabanı normalizasyonu deniyor. Öyle araştırabilirsiniz.
Son olarak
Düşük ingilizceli coder olmaz. İngilizceye de çalışın, ders çalışırmış gibi