Büyük mysql veri ilişkilerini anlama

3 Cevap php

Ben nasıl SQL, yani mysql kullanmak için kendimi öğretmeye çalışıyorum.

Anlamaya çalışıyorum aynı tabloda ile veri birçok farklı türleri ile başa çıkmak için nasıl. Ben bir web uygulaması inşa ediyorum ve ben her biri için farklı veri alanları saklamak için gereken birçok farklı içerik türleri (blog madde, açıklama öğesi, dosyaları, sayfalar, formlar) söylüyorlar. Her bir içerik türü kendi benzersiz alan gereksinimleri vardır, ya da bunu yapmak için daha iyi bir yolu yoktur çünkü ben her farklı içerik türü için yeni bir tablo oluşturmak istiyorsunuz? Bu içerik her tür için yeni bir tablo oluşturmak için biraz fazla görünüyor. Benim web uygulaması içeriği 30 türde olsaydı, bu biraz fazla gibi görünüyor, sadece türleri için 30 tablo olurdu. Ben yeni bir içerik türü vardı ve eğer, ben bu tür için ihtiyaç duyduğu tüm gerekli alanları içeren yeni bir tablo oluşturmak gerekir.

Ben her veritabanına gitmek gerekiyor, farklı veri alanları gerektirir içeriği birçok farklı türde varsa böyle bir şey, yapmak için daha iyi bir yolu var mı? Ben bir şekilde içeriği ne tür görmek için kontrol edebilir, sonra da tüm farklı alan türlerini tutan başka bir tablo seçin?

Ne hakkında karıştı biraz.

3 Cevap

Sadece bir örnek vermek gerekirse:

Yığın taşması kendisi soruları ve cevapları için (Mesajlar denir) aynı veritabanı tablosunu kullanır. Veri bu iki tür aynı olmasa bile, sitesi yaratıcıları bir tabloya koymak için yeterli onları benzer düşündü. Bu yazı, bir soru ya da bir cevap olsun diyor PostTypeId alanı var. Cevaplar üzerinde, başlık alanı soruları üzerine, diğer sütunlar göz ardı edilebilir, null olacaktır.

Yorumlar, diğer taraftan, farklı bir tabloda verilmiştir. Tabii teorik olarak aynı adeti masaya koydu ve yorumlar için bir PostTypeId olabilir. Ama (çünkü yorumların lightweightness arasında) bu yaratacak havai yeni bir tablo oluşturarak haklı.

Bu gerçekten bir cevap değil biliyorum, ve diğer geliştiriciler hatta farklı tablolar içine soruları ve cevapları koymak için karar olabilir; ama bazı bakış açısı kazandırır. Uzun lafın kısası: Duruma göre değişir :)

Sketch interactions

İlk veritabanı tasarımı düşünmemeye çalışıyorum, ama how entities should interact between themselves. Her varlık, gerekli verileri temsil kendi Class, olduğu gibi düşünün.

Her zaman kalem kağıt alıp ne etkileşim (veya ilişkileri) gerçekleştirmek için çalışıyoruz üzerine, bu kişiler arasındaki etkileşimleri kroki için iyi bir başlangıç. Learning the Database design process

Extendability and reuse

Örneğin her BlogPost Tag s ve {[(3) ilgili kümesinin bir dizi olabilir BlogPost s gönderebilir, hangi bir User istiyorum }] s. Attachment s blogpost içine ve aynı zamanda Comment içine enjekte edilebilir.

Yeniden kullanılabilirliği ve extendability anahtarıdır. Eskiz ne zaman etkileşimleri bağımlılıkları izole etmeye çalışın. OO şekilde düşünün. En Attachment biraz daha inceleyelim. Bir Ek bir tablo oluşturmak ve ardından BlogPostAttachment ve CommentAttachment kolayca bu güvenilir kişiler arasındaki ilişkileri oluşturabilirsiniz nerede oluşturarak Apara uzatabilirsiniz. Bu ayrıca, örneğin yeniden kullanabilirsiniz kolayca genişletilebilir içerik türünü oluşturur. UserDetailsAttachment

ORM's to rescue

Object relational mappers gibi Doctrine veya örnek kod kullanımını inceleyerek Propel Eğer masa extendabity için bazı fikirler kavrayabilir. Pratik örnekler her zaman en iyi biridir.

Related SO questions, which you may be interested in

I know, it's a long way to go, but considering factors of creating large scale DB applications with many relations and entity types it best to use help of ORM in the long run

Sen çok çok tablo kullanarak korkmayın gerek - veritabanı mutlu şikayet olmadan onları bir sürü ile ilgileneceğiz. Her içerik türü kendi tablo var izin verirseniz, size bazı avantajlar elde edersiniz:

  1. Simplicity: Her tablo oldukça basit olabilir, ve kısıtlamalar açıktır. ContentType1 başka bir tabloya bir ilişkisi olan bir alan varsa Örneğin, veritabanı tasarımı ve RDBMS bir yabancı anahtar sizin için veri bütünlüğü ilgilenir yapabilirsiniz.
  2. Indexing efficiency: ContentType2 tarihe endeksli olması gerekiyor ama ContentType3 iki ayrı tablo onlara sahip her endeksi ihtiyacı tam olarak veri olduğu anlamına gelir ve (basit bir örnek almak için) adıyla endeksli gerekiyorsa başka bir şey. Tek bir tabloda bunları birleştirerek size messier ve daha fazla disk alanı kullanır birleşik veri kümesini kapsayan iki dizin ihtiyacınız var demektir.

Eğer çıktı iki içerik türlerini birleştirerek bir liste gerekiyorsa, iki tablo bir BİRLİĞİ hem kolaydır; Eğer büyük miktarda veri ile sık sık yapmak gerekiyorsa ve bir dizine görünümü, ucuz yapabilirsiniz.

(Örneğin yukarıdaki StackOverflow örneğinde olduğu gibi) çok benzer iki içerik türleri varsa Öte yandan, tek bir tabloya bunları birleştirerek bazı avantajlar elde edebilirsiniz:

  1. Simplicity: Sadece bir kez tabloyu kod gerek - (iki içerik türleri gerçekten çok benzer yani) doğru yapılırsa, bu kod tabanı daha küçük ve daha basit yapabilirsiniz.
  2. Extensibility, üçüncü bir içerik türü ilk iki maç birbirine, tablo doğrudan doğruya üç içerik türleri saklamak için uzatılabilir bir daha ilk iki benzer ve aynı şekilde benzer olan bitkileri ise .
  3. Indexing for performance. Verilere almanın en yaygın yolu tarihi (diyelim ki) tarafından iki içerik türlerini ve düzeni onları birleştirmek için ise, hem içerik türleri için ortak bir alan, daha sonra tekrar tekrar olması gereken iki ayrı tablo var verimsiz olabilir unioned ve sonra sınıflandırılmaktadır. Tek bir tabloda iki içerik türlerini birleştirerek size (dizin oluşturulmuş görünümler benzer bir fayda elde edebilirsiniz hatırlıyorum ama) daha hızlı sorgulama izin, tarih alanında, tek bir dizin koymanızı sağlar.

Eğer normalize rigorously, her varlık türü veritabanında kendi tablosunu olan bir veritabanı olacaktır. Ancak, (örneğin tek bir tabloda iki varlık türlerini birleştirerek gibi) çeşitli yollarla denormalizasyon (verilerin boyutuna ve şekline bağlı olarak) maliyetleri outweight olabilir yararları olabilir. Ben en azından ilk keeping all content types separate bir strateji tavsiye ve gerekli olduğu ortaya çıkarsa bir tactical denormalization olarak onları birleştiren düşünecektim.