Dinamik Tablo Üretimi

2 Cevap php

Önce bana yardım etmek mümkün olabilir ki benim durumu tarif edeyim. Iki parça vardır.

1: I have a program that runs and analyzes a bunch of files. It generates a "report" that will later be fed into a website for DB storage and viewing. This report can contain pretty much any type of data, as the users can query pretty much anything. I left it very open ended.

2: The website parses through this report, adds an entry for things that are common. But also creates a new table for any new data it finds. It also stores a mapping from report_id to all of these dynamically created tables. For example if in the report someone wanted to calculate Standard Deviation, and this made sense for this report, than there would be a STD table.

Şu anda bu site PHP ile yazılmış, ve tür dağınık görünüyor. Bu PHP yapmak için daha iyi bir yolu var mı. Ayrıca, ben organizasyon sake çünkü Rails bu elden geçirilmesi düşünüyorum. Raylar daha iyi bir yolu "method_missing?" Vardır.

Ben çok nazik olun, DB çok web sitelerinin yapı yetenekli ve amatörce değilim.

Thanks Eric

2 Cevap

Çalışma zaman veritabanı yapısını değiştirerek çok tehlikelidir. Ben de onu tanımak için bilgi bir "etiket" verebilecek bir "karma" tipi tabloda, bilinmeyen veya yeni karşılaşılan bilgileri depolamak öneririm. (Örneğin, bir standart sapma gibi) bir bilgi yeni bir tür karşılamıyorsa, yeni bir etiket (dosya uzantıları gibi bir bit) oluşturmak ve buna bağlı etiketiyle bilgileri tablosunda bilgi ekleyebilir. Eğer yeni bir tablo oluşturursanız, şemasını değiştirmek ve bu nedenle, veritabanı kullanımı kurallarını değiştirmek.

Tablo sayısı büyük olursa otomatik olarak tabloları oluştururken size baş ağrısı verebilir. 5000 üzerinde ürün ile dirs için ext3 Dizin listeleri pahalı hissetmeye başlar, ve kesinlikle çok zaman 100.000 'den fazla dosya almak zaman alıcıdır. (Mysql CLI bağlandığı zaman tüm tablo adlarını önbelleğe dener, ve o atlamak, sen-A anahtarı ile bağlamanız gerekir.)

Sen raporun oluşturulması için geçici tablolar kullanarak düşünün, ve sonra belki daha sonra geri alma için bir rapor dizeye aşağı sonuçlarını yoğuşmalı olabilir. Ya da, JP bahseder gibi, aynı tabloda değerleri ve raporları etiketleri bir tablo yapısı:

create table stddev (
    report_id int(11),
    field_name int(11), -- fk to field
    field_value double
);
create table reports (
    report_id int(11);
    report_name varchar(255);
);

Ve sadece bir rapor için veri almak için, report_id belirten bir seçme yapacağını:

select * from stddev where report_id = 123;

Ben senin rapor adları, alan adları tabloları yaratacak, ve muhtemelen raporlar için kaydedilmiş / türetilen hesaplanmış değerlerinin giriş değerlerini ayırmak istiyorum.

Ne sıklıkta giriş yeni verilere bağlı olarak, ben erken çok küçük tablolar için birkaç büyük tabloları optimize olmaz. Düzgün endeksli, büyük bir masa iyi gerçekleştirebilirsiniz.

Ancak bu uygulama, işleme verilerin büyüklüğü nedir? Ile başlamak için çok küçük tablolar kullanmak için nedenler var mıydı?

Ben çok veri işlemek için PHP kullanabilirsiniz. Lütfen şema mantıklı, bu PHP kodu, çok daha mantıklı hale getirir. Benim olsaydı, ben dilin gerçek bir yapısal sınırlama üzerine gelene kadar ben başladım ne sopa, farklı bir programlama diline geçmek olmaz; Benim için Rails geçiş zaman kaybı olacaktır.