- Düzenlendi
- En İyi Yanıtbyhk44 tarafından
byhk44 Hepsini tek tabloda tutmanız performans açısından sorun olmaz. Çekerken sadece ihtiyacınız olan alanları çekmelisiniz. SELECT * yaparsanız bellek problemleri yaşarsınız. Evet, bunları konuşmuştuk, merak edenler için:
https://laravel.gen.tr/d/5098-veritabaninda-1-tabloda-bircok-veri-tutmak-mi-yoksa-farkli-tablolara-bolmek-mi
VARCHAR limiti geçici tablo (temporary table) ya da MEMORY tablo kullanmadığınız sürece performans açısından sorun teşkil etmez. 150 ile 255 arasında performans açısından fark yok diyebilirsiniz. (Geçici tablo ve MEMORY tabloları byte olarak değil size/limit olarak işlem yapıyor o yüzden onlarda performans sorunu yaşatır.)
1/0 ya da true/false alanlar için uygun olan TINYINT(1)' dir (unsigned olup olmaması önemli değil) ki zaten $table->boolean()
TINYINT(1) şeklinde oluşturur. TINYINT 1 byte; INT ise 4-byte yer kaplıyor ama büyük bir etkisinin olacağını sanmıyorum. Yani 0/1 tutarsanız ve 10 milyon kayıt olsa, TINYINT(1) kullanırsanız 10 mb; INT kullanırsanız 40 mb yer kaplar, 10 bin kayıt olsa 10 kb vs 40 kb olacak...
Veritabanını oluştururken charset ve collation belirlediğinizde oluşan tablo ve içindeki alanlar da aksini belirtmediğiniz sürece aynı charset ve collation ile oluşur o yüzden $table->charset = 'utf8mb4'; ve $table->collation = 'utf8mb4_general_ci'; kısmına ihtiyacınız yok. Ayrıca collation utf8mb4_general_ci değil utf8mb4_unicode_ci olmalı.
Hangi Laravel sürümünü kullanıyorsunuz bilmiyorum ama 7+ kullanıyorsanız:
$table->unsignedBigInteger('tedarikci_id')->nullable();
$table->foreign('tedarikci_id')->references('id')->on('urun_tedarikci');
yerine direkt
$table->foreignId('tedarikci_id')->nullable()->contrained('urun_tedarikci');
yapabilirsiniz. (Ne olursa olsun contrained daima en sona yazılmalı. contrained('urun_tedarikci')->nullable() yapılırsa olmaz)