Nasıl bir forumun DB şema yapısı istiyorsunuz?

7 Cevap php

Ben uygulama için küçük bir forum inşa ediyorum. Ben phpBB gibi forumlar ayrı bir tabloda iplik metnini saklamak görüyoruz.

Neden? Neden aynı tabloda tüm saklamayın?

Gibi bir şey: thread_id, thread_date, thread_text, thread_author

Neden bu şekilde yapılıyor? Bunu nasıl yapardın?

7 Cevap

Bu yapılır neden ben aslında bilmiyorum, ama ben hayal edebiliyorum bir nedeni sonrası meta (tarih, yazar, vb) için arama ve alma optimize ediyor.

According to Joel (ve Joel her zaman haklıdır! ;-) Veritabanları sabit uzunlukta kayıtları oluştururken sabit uzunlukta alanlar kendi veri depolamak, bu yüzden sadece bir işaretçi arttırarak sonraki bir satırdan atlamak kolay Bir kaydın bayt uzunluğu. Bir yazının uzunluğu geniş bir yelpazede üzerinde değişir ve tüm mesajları tutmak için yeterince büyük sabit uzunlukta depolama oluşturarak uzayda muazzam miktarda atık çünkü Ama sonrası metin depolamak için kullanılan büyük metin alanları, sabit bir boyutu olamaz. Yani diğer bilgileri çok yavaş onu yapar gibi birileri ana forum sayfayı her zaman yapıldığı gibi, mesajların büyük sayılar için meta almak istediğiniz zaman aynı tabloda sonrası metni saklamak anlamına gelir.

Iki dünyanın en iyi almak için yolu bir tablo sabit uzunluğu alanlarını (yazılan metnin dışında, yani her şey) ve değişken uzunluğu alanlarını başka (yani yazılan metin) koymaktır.

Ben çevrimiçi bu serin şema buldum.

schema

herhangi bir temel forumun veritabanı şeması için oldukça iyi bir başlangıç ​​gibi görünüyor.

Ben bu eski olduğunu biliyorum, ama ben bu soruyu tekrar bulacak herkes için bu yazı düşündüm.

PhpBB cesaret içine baktım, ama perhap çünkü tam metin indeksleme asla. Işlem ve ne değildir sağlamak için ana tablo için Inno-db motor. Tam metin indeksleme için myisam.

Bir kere, en ilişkisel veritabanlarının dosya sistemi düzeni keyfi metin veya büyük veri bloklarını saklamak sistemi yavaşlatabilir böyle. Veriler genellikle satıra tarafından depolanan bu yana arama yaparken, veritabanı şimdi ilgisiz alanlarda arıyor bile değişken uzunlukta bir metin alanları üzerinden atlamak zorundadır.

İkincisi, tek bir tabloda her şeyi koyarak her thread_id için daha fazla veri gerekir eğer çok zor örneğin, daha sonra veri modeli eklemek için yapar.

Veritabanı şemaları Tasarımı sıra bazı eğitim gerektirir. Sen http://en.wikipedia.org/wiki/Database_normalization ile başlamalıdır. Üçüncü normal form anlamak için emin olun.

InnoDB FULLTEXT indeksleme ve MyISAM işlemleri desteklemiyor desteklemiyor.

phpBB biliyorum, ama onlar tabloları ayrı muhtemelen neden o yok.

Onlar çünkü tablo ulaşabilirsiniz boyutu aynı tabloda metin tutmayın.

Bu şekilde, hatta girdileri çok sayıda, iplik liste tablo iyi endeksli, küçük ve onu taramak için hızlı. Metin çok hızlı bir birincil anahtar kullanarak, sadece gerekli olduğunda erişilir.

Küçük forumlar için, ben biraz kodlama yükü olduğundan bu gerekli olmadığını düşünüyorum.

Julien'in mükemmel yanıta ek olarak, (yönetici veya moderatör tarafından diyelim) diğer konuları mesajları taşımak için oldukça yaygındır. "Post tablosundaki" metni olması bu destek yardımcı olur.