Veritabanı Tasarımı: Yeni Tablo ve Yeni Sütunlar


38

(Burada StackOverflow'tan repost olması önerildi)

Şu anda bir tablo var .. ve ona yeni veri sütunları eklemeye başlamanız gerekir. Her kaydın (yeni veri sütunlarını ekledikten sonra yeni verilerle ilerlemeye devam etse bile) verileri olmaz. Bu yüzden bunun yeni bir tablo için daha uygun olup olmadığını merak ediyorum, çünkü veri satırlarının bir kısmının gerçekten bir uzantısı ve her satır için geçerli değil.

Başka bir deyişle, bu yeni veri elemanları için çok fazla kullanılmamış sütun olacağından, bunun yeni bir tablo için daha uygun olacağı görülüyor mu?

İlk tablo sayfa görünümlerinin kaydıdır (şu anda 2 milyon kayıt).

- id
- IP adresi
- kez görüntülendi
- created_at zaman damgası
- tarih, randevu, biriyle çıkmak

Her IP adresi için günde bir kayıt yapılır - art arda sayfa görüntüleme günlük zaman görünümlerine eklenir.

ek alanlar başlangıç ​​noktası izleme için olmalıdır (örn. google analytics source / medium / kampanya)

Her ziyarette bu bilgi olmaz. Im sıraların yaklaşık% 10'unun verilere sahip olacağını varsayar (genellikle ilk ziyarette atfedildiği için)

Verilerin temel kullanımı, insanların nereden geldiğini nitelemek olacaktır. Bu daha sık kullanılmaya başlayabilir (daha sonra kendini tek masaya ödünç verir).

Geribildirimi takdir edin - gerekirse daha fazlasını ekleyebilir

Yanıtlar:


29

Güreştiğiniz şey dikey bölümlemektir. Bu, performansı artırmak için fiziksel bir veritabanı tasarım tekniğidir. Herhangi bir fiziksel veritabanı tasarım tekniğinde olduğu gibi uygulanabilirliği, optimize etmeye çalıştığınız belirli sorgulara ve bu tekniğin bunları optimize edip etmediğine bağlıdır. Mantıksal bir bakış açısıyla, eğer bu yeni alanlar varlığınız için aday anahtarına bağlıysa, o zaman ona ait olan gerçeklerdir. Öncelikle, günlük sayfa görünümleriyle ilgili gerçekler olduğunu doğrulamak için bu yeni alanların aday anahtarlarınızdaki işlevsel bağımlılığını tam olarak anladığınızdan emin olmalısınız. Eğer öyleyse, onları başka bir tabloya ayırmaya karar vermek, yalnızca performans hedeflerinize ulaşması durumunda yapılması gereken bir performans optimizasyonudur.

Genel olarak, bu yeni sütunları nadiren ve orijinal tablodaki diğer sütunlardan farklı şekilde sorgulayacaksanız dikey bölümleme kullanışlıdır. Bu sütunları, mevcut tablonuzla aynı PK’yı paylaşan başka bir tabloya yerleştirerek, bu yeni sütunları istediğinizde doğrudan sorgulayabilir ve bu yeni tablo için diskte sayfa başına daha fazla satır olacak Orijinal tablodaki tüm sütunlar bu satırlarda oturmayacak. Ancak, bu sütunları her zaman orijinal tablodaki sütunlarla birlikte sorgulayacaksanız, dikey bir bölüm bunları almak için her zaman dış birleştirmeye ihtiyaç duyacağınız kadar anlamlı olmaz. Diskteki tablolardan gelen sayfalar bir DBMS'nin arabellek havuzuna bağımsız olarak gelir, asla önceden katılamaz, ve böylece, arabellek, veriler arabellek havuzuna sabitlenmiş olsa bile, her sorgu yürütmesinde gerçekleşmesi gerekir. Bu senaryoda, orijinal tablodaki NULLABLE sütunların yapılması, NULL olduğunda DBMS depolama motorunun verimli bir şekilde saklanmasını ve alımda katılma gereksinimini ortadan kaldırmasını sağlayacaktır.

Bana sanki kullanım durumunuz ikincisi gibi geliyor ve orijinal tablonuza NULLABLE olarak ekleyerek gitmek yoludur. Ancak, veritabanı tasarımındaki diğer her şeyde olduğu gibi, bu duruma bağlıdır ve doğru kararı vermek için beklenen iş yükünüzü ve iyi bir seçim yapmanın neye bağlı olduğunu bilmeniz gerekir. Dikey bölümleme için uygun bir kullanım durumunun iyi bir örneği, uygulamanızın birinin aramak isteyebileceği ancak nadiren yapabileceği bir kişi hakkında çok nadiren doldurulmuş bir bilgiye sahip olduğu bir kişi arama paneli olabilir. Bu bilgiyi farklı bir tabloya yerleştirirseniz, performans için bazı iyi seçeneklere sahip olursunuz. Aramayı, 2 sorgunuz olacak şekilde yazabilirsiniz - bir tanesi arama yapmak için her zaman en çok kullanılan bilgileri kullanan (yalnızca soyadı veya ssn gibi), ve dıştaki çok nadir bulunan bilgileri yalnızca arama istendiğinde birleştirir. Veya, dış birleştirme işleminin gerekli olmadığı ve gerçekleştirmeyeceği belli bir dizi ana bilgisayar değişkenini tanımak için yeterince akıllısa, DBMS iyileştiricisinden faydalanabilirsiniz ve bu nedenle yalnızca 1 sorgu oluşturmanız gerekir.

Hangi DBMS platformunu kullanıyorsunuz? Platformun NULL sütun depolamasını işleme şekli, sorgunuzu optimize eder ve ayrıca seyrek sütun desteğinin kullanılabilirliği (SQL Server buna sahiptir) kararı etkileyecektir. Sonuç olarak, her iki tasarımın da test ortamında, üretim büyüklüğü verileri ve iş yükü ile denenmesini ve hangisinin performans hedeflerinize daha iyi ulaşacağını görmenizi öneririm.


Ne demek istediğin belli değil "Ancak, bu sütunları her zaman orijinal tablodaki sütunlarla birlikte sorgulayacak olursanız, dikey bir bölüm, onları almak için her zaman dış birleştirme yapmak zorunda kalacağınız kadar anlamlı olmaz." , yalnızca ikincil sütunların mevcut olup olmadığına ilişkin birincil sütunları istediğinizde dış birleştirme yapmanız gerekir, aksi takdirde bir INNER JOIN kullanırsınız ve bunu çoğu durumda yararlı olur (bakılan satır sayısını azaltır). ).
jmoreno

Buradaki tüm yardımlar için teşekkürler .. Alanları eklemeye başlamam gerekti, ancak bunu düşündükten sonra, her şeyi daha iyi tanımlayabilmem için birkaç masa daha olması gerektiğini gördüm. Sonunda neyin geldiği ziyaretçi visitor_visits (hangi ziyaretçi_id var ve kaynak içeriyordu) page_views (hangi vistor_id ve visitor_visit_id var) ziyarete tam olarak hangi page_view'in ait olduğunu bilmek istediğim için bu bağlantıyı ekledim. Bir
süreliğine onunla güreştim

10

Şahsen mevcut tabloya sütun eklemeye eğilimli. Yeni masa size gerçekten bir şey almıyor:

  • gerçekten fazla alan kazanmazsınız çünkü orijinal tablodaki NULL değer herhangi bir yer tutmaz ve yeni tablo yine de herhangi bir tasarrufu telafi eden bir tür tanımlayıcıya ihtiyaç duyar.
  • sorgularınızın daha karmaşık hale ... where newcolumn is not nullBir olurleft outer join

Tek tabloda, satır boyutunuzun sayfadan sayfaya değişebileceği anlamına gelir; ancak bu, özellikle kümelenmiş dizininiz monoton olarak artan bir sütundaysa (kimlik veya tarih / saat) mevcut sayfalarınızın çoğunu etkilememelidir.


Tablo şu anda geniş olmadığı için (açıklamanıza göre) ve bu veriler çok geniş olmayacak, kabul ediyorum.
HLGEM

4

Sağladığınız bilgiler ve hedef olarak sadece genel normalleştirme göz önüne alındığında, muhtemelen basitçe nullable sütunlar eklerdim, ancak verilerin modellemenin en iyi yolunun ne olduğunu bilmek için verilerin nasıl kullanılacağı hakkında yeterince bilgi vermediniz. dır-dir.

Bu verileri gerçekten nasıl kullandığınıza bağlı olarak, farklı bir veri modelini düşünebilirsiniz. Bu verileri raporlama için koyuyorsanız, belirli raporlama türleri için daha verimli olabilecek boyutsal bir modele bakmak isteyebilirsiniz - örneğin, günün saati analizi tarih ve zaman boyutunun dağılmasıyla iyi sonuç verir.

Analitik soruları yanıtlamak için, "X gibi kampanyalardan gelen ziyaretler için günün en popüler zamanı hangisi" veya "bir kampanyanın hangi gününün en çok saat başı ziyaret ettiğini görüyoruz" gibi, tek bir veri zamanı sütunu çalışmayacak çok iyi (ancak bu ilişkisel bir modelde bile bölünebilir) ve IP adresini bir boyut olarak ele alabileceğiniz birçok durum var (belki bir kar tanesinde bir tür coğrafya verisiyle).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.