Düz dosya Veritabanları

13 Cevap php

PHP düz dosya veritabanı yapıları oluşturarak etrafında en iyi uygulamalar nelerdir? (Ben sadece bu noktada bir veritabanı kullanmak) çoğu benim amaçlar için üst üzerinde SQL gibi sorgu sözdizimi, uygulamaya çalışırsanız orada görmek daha olgun PHP düz dosya çerçeveler bir sürü.

Herhangi zarif hileler biri ilk etapta bu sorun üzerinde alarak isterim küçük bir kod yükü ile iyi bir performans ve özellikleri almak için orada var mı?

13 Cevap

Peki, düz veritabanlarının doğası budur. Onlar büyük veya küçük. Onları içinde dizilerle basit diziler mi? Onun basit bir şey söylemek UserProfiles gibi inşa halinde:

$user = array("name" => "dubayou", 
              "age" => 20,
              "websites" => array("dubayou.com","willwharton.com","codecream.com"),
              "and_one" => "more");

ve bu kullanıcı için db record kaydetmek veya güncelleştirmek için.

$dir = "../userdata/";  //make sure to put it bellow what the server can reach.
file_put_contents($dir.$user['name'],serialize($user));

ve kullanıcı için record yük

function &get_user($name){
    return unserialize(file_get_contents("../userdata/".$name));
}

ama yine bu uygulama size gereken veritabanı uygulaması ve doğa üzerinde değişir.

Eğer düşünebilirsiniz SQLite. Bu düz dosyalar gibi neredeyse basit, ama sorgulamak için SQL motoru olsun. Bu works well with PHP de.

Düz dosya içeriğini saklamak için tek yolu, dosya php dizileri birebir kaydetmek olacaktır. Örneğin:

$data = array();

if( $_POST ) {
    $data = $_POST;

    $content = "<?php\n";
    $content .= '$data=' . var_export($data, true) . "\n";
    $content .= "?>";

    save_to_file($filename, $content);
}

// echo form

Benim düşünceme göre, yani konum anlamda bir "Düz dosya Veritabanı" (ve kabul ettik cevap) kullanılarak neccesarily şeyler hakkında gitmek için en iyi yol değildir. Her şeyden önce, serialize() kullanarak birileri, aslında, "veritabanı" in arbritrary kodu koyabilirsiniz (alır ve dosyayı düzenler, unserialize() BÜYÜK baş ağrılarına neden olabilir çalıştırmak için her zaman.)

Şahsen, ben söylemek istiyorum - neden geleceğe bakmak değil? Ben kendi "özel" dosya oluşturma oldum çünkü sorunları yaşadım pek çok kez olmuştur ve proje, bir veritabanı ihtiyacı bir noktaya patladı ve ben diliyorum, biliyorsun "Düşünüyorum Ben "ile başlamak için bir veritabanı için bu yazmış - kod üstlenmeden çok fazla zaman ve çaba gerektirir çünkü.

Bu ben daha büyük aldığında gidip gün üstlenmeden harcamak zorunda kalmamak benim uygulamayı prova gelecekteki ileri gitmek için yol olduğunu öğrendim. Bunu nasıl yaparsınız?

SQLite. Bu, bir veritabanı olarak çalışıyor SQL kullanır ve MySQL üzerinde değiştirmek oldukça kolaydır (benim gibi veritabanı manipülasyon için soyutlanmış sınıfları kullanıyorsanız espescially!)

Aslında, espescially "kabul cevabı" 'un yöntemi ile, büyük ölçüde (PHP içine tüm "REKORLAR" yüklemek zorunda değilsiniz) app bellek kullanımını kesebilir

Bu doğru. serialize() bunun için de oldukça yararlı olabilir.

Ben uygun bir sistem ile geliyor hile karmaşıklığı ile kendinizi öldürmeden endeksi veri düğümleri bir yol bulmak olduğunu düşünüyorum.

Verileri kalıcı bir düz dosya kullanmak için gidiyoruz eğer, veri yapısı XML kullanın. PHP built-in XML parser vardır.

Here's the code biz Lilina için kullanın.

Biz (hiç gereksiz veri yüklenir ve kaydetmek için daha hızlı olan) kullanım için yeterince verimli bulunan ayrı bir dosya olarak her bir girişi saklar.

Ben düşünüyorum bir çerçevenin bir blog platformu için olacaktır. Sadece isterim veri olası görünümü hakkında tarihe göre sıralanır olacak beri, ben bu yapısı hakkında düşünüyordum:

Içerik düğümü başına bir dizin:. / Içerik / YYYYMMDDHHMMSS /


/ Etiketleri
/ yazarlar
/ yorumlar da dahil olmak üzere her düğümün alt dizinleri

için düğüm dizinindeki yanı sıra basit metin dosyaları öncesi ve sonrası işlenen içeriği ve benzeri.

Bu basit bir PHP glob() çağrısı (ve sonuç dizinin muhtemelen tersine) sadece içerik yapısı içinde bir şey hakkında sorgulamak için izin verecek:

glob("content/*/tags/funny");

"komik" etiketli tüm makaleleri dahil yolları dönecekti.

That's true. serialize() can be pretty useful for that as well.

Sen seri olabilir, ama bu nesneleştirmek yok çünkü bir adım kaydeder. Performans-bilge onun aslında daha iyi emin değilim.

I think the trick to coming up with a viable system is finding some way to index the data nodes without killing yourself with complexity.

Belki de tüm indeksler izler merkezi bir dosya var mı? Her etiketleri ile ilişkili tüm post id yıllardan bir listesi vardır tags.txt gibi. Zaman kazanmak için etrafında gereksiz verileri tutmak zorunda kalabilirsiniz.

Eğer bir insan tarafından okunabilir bir sonuç istiyorsanız, siz de bu dosya türünü kullanabilirsiniz:

ofaurax|27|male|something|
another|24|unknown||
...

Bu şekilde, sadece bir dosya var, bunu ayıklamak (ve elle düzeltme) kolayca, (her satırın sonunda) daha sonra alanları ekleyebilir ve (her hat için, göre bölünmüş |) PHP kodu basittir.

(| Ordz nick WaR ise örneğin) Ancak, sakıncaları bir şey (eğer giriş milyonlarca varsa, bu iyi değil) aramak için tüm dosyayı ayrıştırmak gerekir ve veri ayırıcı kolu gerektiğidir.

Düşük düzey nesne API flatfile veritabanı Mimesis (açık kaynak PHP düz bir dosya veritabanı düşük seviye API).

Bir şey Homebrewing önlemek istiyorsanız IMHO, iki seçeneğiniz vardır:

1) SQLite

PDO aşina iseniz, SQLite destekleyen bir PDO sürücüsünü yükleyebilirsiniz. Kullandım, ama PDO MySQL ile bir ton kullandık asla. Ben bu güncel bir proje üzerinde bir atış vermek için gidiyorum.

2) XML

Veri nispeten küçük miktarlarda için bu birçok kez yapıldı. XMLReader hafif, salt ileri imleç-tarzı sınıftır. SimpleXML basit sadece başka bir sınıf örneği gibi erişebileceğiniz bir nesne içine bir XML belgesini okumak için yapar.

Sadece sistemin bu tip bir düz dosya veritabanı ile olası bir sorunu işaret:

data|some text|more data

row 2 data|bla hbalh|more data

Vb ...

"|" Veya "\ n" sonra veriler kaybolur sorun hücre veri içeriyor olmasıdır. Bazen insanların çoğu kullanmak olmaz harf kombinasyonları ile bölmek için daha kolay olacaktır.

Örneğin:

Sütun splitter: #$% (Shift+345)

Satır splitter: ^&* (Shift+678)

Metin dosyası: test data#$%blah blah#$%^&*new row#$%new row data 2

Sonra kullanın: explode("#$%", $data); use foreach, the explode again to separate columns

Ya da bu doğrultuda bir şey. Ayrıca, ben düz dosya veritabanları veri (yani az 20 satır) küçük miktarlarda olan sistemler için iyi olduğunu eklemek, ancak daha büyük veritabanları için büyük bellek domuz hale gelebilir.