Veritabanına JSON vs Tefrika Dizisi

11 Cevap php

Tefrika dizi vs MySQL veritabanı JSON veri depolama avantajları ve dezavantajları nelerdir?

11 Cevap

  1. JSON encode() & decode()
    • PHP Version >= 5.0.0
      • 20 Limiti yuvalama.
    • PHP Version >= 5.2.3
      • 128 Limiti yuvalama.
    • PHP Version >= 5.3.0
      • 512 Limiti yuvalama.
    • PHP'nin serialize'd dize vs küçük ayak izi.
  2. serialize() & unserialize()
    • PHP Version >= 4.0.0
      • Yöntemleri PHP Datatipi Nesne kayıp değildir.
      • __wakeup () herhangi bir nesne unserialize olmaya çağırdı sihirli yöntem. (ÇOK GÜÇLÜ)
      • Bu bazı zamanlar olduğu görülmüştür en veritabanına koymak base64 encode dizeleri, ve bazı sorunlar işleme ile olduğu gibi, bu fonksiyon ile veritabanından alınan base64 decode dizeleri bazı beyaz boşluk karakterleri.

Seçim sizin.

Pro JSON:

  • JSON veri pek çok farklı dilde, sadece PHP tarafından kullanılabilir
  • JSON veri insan okunabilir ve yazılabilir.
  • Daha az yer kaplıyor
  • Seri daha o JSON kodlamak için hızlıdır

Pro Serialized Array:

  • Daha hızlı json decode daha unserialize yapmaktır


Yorumlar belirtmek gibi, JSON bir serialize dizide daha az yer kaplıyor. Ben de JSON veya Dizgeleştirme hızlı olup olmadığını kontrol, ve şaşırtıcı, daha hızlı json encode serialize için daha. Bu olsa json decode daha nesneleştirmek hızlıdır.

Bu ben test etmek için kullanılan script:

<?php 
function runTime(){
      $mtime = microtime(); 
      $mtime = explode(' ', $mtime); 
      $mtime = $mtime[1] + $mtime[0]; 
      return $mtime; 
}
?> 
<pre>
<?php
$start = runTime();

$ser;

for($i=0; $i<1000; $i++){
    $a = array(a => 1, x => 10);
    $ser = serialize($a);
}
$total = runTime() - $start;
echo "Serializing 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$json;

for($i=0; $i<1000; $i++){
    $a = array(a => 1, x => 10);
    $json = json_encode($a);
}
$total = runTime() - $start;
echo "JSON encoding 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$ser;

for($i=0; $i<1000; $i++){
    $a = unserialize($ser);
}
$total = runTime() - $start;
echo "Unserializing 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$json;

for($i=0; $i<1000; $i++){
    $a = json_decode($json);
}
$total = runTime() - $start;
echo "JSON decoding 1000 times took \t$total seconds";
?>
</pre>

Taşınabilirlik: Kazanan JSON. PHP de-serileştirme sadece PHP ile (bildiğim kadarıyla) desteklenir ise JSON platformlarda daha çeşitli desteklenir. Herhangi bir dilde biçimini ayrıştırmak mümkün olsa da, JSON daha önceden oluşturulmuş kütüphaneler vardır.

Gelecek Proof: Kazanan JSON. JSON Javascript bir standart ve gelecekte her zaman değiştirmek olası değildir anlamda, bir "standart" olduğunu. PHP grup hale getirme biçimi geleceği hakkında herhangi bir söz vardır, ve gelecekte değiştirmek mümkün iken, bir tek grup biçimini kontrol ettiği gerçeği okunmaz ileride veri ile sona anlamına gelir.

Fidelity: Kazanan PHP. PHP serileştirme özel sınıflar tarafından tanımlanan nesneler dahil olmak üzere, yerli PHP veri türleri ile veri depolamak için izin verir. JSON sadece, ilkel türleri ("diziler") ve anahtar / değer çifti Nesneler listelerini genel ilkel türlerini saklamak için izin verir. Eğer bir PHP uygulaması geliştirirken eğer PHP Diziselleştirme burada bazı avantajlar sağlayabilir.

Dosya Boyutu: PHP'nin mevcut seri hale getirme biçimi daha ayrıntılı olarak JSON (daha fazla bilgi depoladığını gibi), burada hafif bir kazanca sahip.

Performansı: bilir, bu profili bağlıdır.

Sonuç: Eğer PHP Serile kullanmak için zorlayıcı bir neden olmadıkça JSON ile gidin.

JSON yani daha kolay PHP tefrika dizileri kullanıldığında ise sadece kolayca erişmek için PHP kullanmak mümkün olacaktır vb farklı dillerden ona / yazma okuyabilir, daha taşınabilir.

Eğer sadece PHP ile verileri kullanıyor musunuz? JSON: diziler, yok eğer: evet eğer.

Pro Dizi

  • oturumları serileştirme kullandı: ben (pek emin değilim) json_encode / kod çözme daha hızlı olduğunu düşünüyorum
  • PHP dizide birçok fonksiyonları (ayırma / birleştirme / ...)

Pro JSON

  • JSON diğer dillerde ve web dilde biliyorum
  • veritabanında az ayrıntılı
  • XML gibi birçok araç,: JSON şema

SO böyle bir çok soru vardı.

http://stackoverflow.com/questions/804045/preferred-method-to-store-php-arrays-jsonencode-vs-serialize

In short: JSON is better for simple data, but it doesn't distinguish difference between object and associative array. Serialized data are bigger.

youre JSON.stringify (obj) olarak tırnak ve özel karakterler etrafında almaya çalışırken eğer, bunu veritabanına özgü yöntemleri kaçan bulunuyor PHP kullanarak bunu yapabilirsiniz.

<?php
mysql_real_escape_string(htmlspecialchars($value))
?>

artık güvenle saklamak ve bu akşam geri okuduğunuzda bunu deşifre edebilir

Diziler ve Javascript veya başka bir dilde iletişim için için json kullanın. Nesnenin veya mevcut çalışan komut dosyası için herhangi bir iç PHP çalışmaları için serialize kullanın.

Ben sadece php serialize ile bu büyük bir sorun vardı. I i unserialize okumak için kullanılan hangi tek bir alanda çok veri saklanır.

Ne oldu ben bu alanda bazı bozuk verileri var olmasıdır. 'A' gibi kodlar, 's' ve 'N' ile harita verilerini seri hale getirmek. Bozuk veri varsa, harita başarısız oldu. Bu unserialize fonksiyon çünkü bayt kod hatası çalışamayacak durumda olduğunu bir php hata gösterecektir.

Yani benim açımdan önlemek için serialize. JSON, yol daha güvenli ile gidin ve size gelecek binbaşı sorunlarına başını patlama olmaz.

Benim için, artık serialize.

En cevapları zaten işaret olarak JSON serileştirme yener. Ben büyük avantajı platform bağımsız olduğunu düşünüyorum. Sen diğer uygulamaları veritabanı ile iletişim olabilir ve onlar php ile ilgisi olmayabilir.

Ancak, both çözeltiler violate database normalization. Sen veritabanı bile first normal form olmayacak yüzden arama, diyelim ki, gibi herhangi bir veritabanı özelliği yararlanmak olamaz. Daha iyi bir yaklaşım kullanmak için object relational mapping. Iyi kütüphaneler orada vardır - örneğin düşünün doctrine ORM.

atm, json_encode () else NULL döndürür, bu nedenle, bu tür "ñ" gibi karakterleri kodlamak olamaz .. UTF-8 kodlanmış veri ile çalışır