PHP / MySQL - veritabanında saklanması dizi

5 Cevap php

Ben bir veritabanında saklanır çeşitli ayarlar gerektiren bir PHP uygulaması üzerinde çalışıyorum. Bazı şeyler eklendi / kaldırıldı veya değiştirilebilir eğer istemci sıklıkla tablo tasarımı ile sorunlara neden olmuştur, hangi sorar. Temelde, çeşitli ayarlar belirli bir kayıt için etkin olsaydı sadece belirtilen Boole alanları bir sürü vardı.

Artık masanın etrafında karıştırmasını önlemek için, ben bir tefrika dizi olarak veri depolama düşünüyorum. Ben bu kadar kötü bir uygulama olarak kabul edilir olduğunu okudum, ama ben bu tür bir yaklaşım kullanarak için haklı bir dava olduğunu düşünüyorum.

Bunu önlemek için herhangi bir gerçek neden var mı?

Herhangi bir tavsiye takdir.

Teşekkürler.

5 Cevap

Gerçek nedeni normalleştirme, ve bunu yaparak first normalform kıracak.

Ancak, normal formların bir ihlali olarak kabul edilebilir olduğu birçok durum vardır. Kaç alanları ile ilgileniyor ve hepsi booleans vardır?

Veritabanınızda bir dize olarak tefrika bir dizi saklanması (diğerleri) aşağıdaki dezavantajlara sahip olacaktır:

  • Eğer ayarlarınızı güncellemeniz gerekiyor ilk ne zaman, veritabanından geçerli ayarları ayıklamak dizi unserialize, dizi değiştirmek, dizi serialize ve tablodaki verileri güncelleştirmek gerekir.
  • Ararken, sadece belirli bir kullanıcı (ya da kullanıcıların bir dizi) olup olmadığını veritabanını sormak mümkün olmayacak bir nedenle aradığınız herhangi bir şansı olmayacaktır, özürlü ya da etkin ayar verilmiştir.

Bunun yerine, gerçekten sizin diğer tablodan bir-çok ilişkisi gibi ihtiyaç kayıtları ile başka bir tablo oluşturma seçeneği düşünmelisiniz. Böylece 30 boş alanları yok olacak, ama (varsayılan değiştirirseniz, örneğin, bu seçenek lutfen bazı dezavantajları vardır unutmayın) yerine sadece varsayılan sapan her seçenek için bir satır olabilir.

Özetle: Ben size yukarıda belirtilen dezavantajları hakkında sadece bir nebze bakım, en azından eğer dizileri seri hale ve veritabanlarına koyarak kaçınmak gerektiğini düşünüyorum.

(Her zaman en iyi yol değildir) doğru yolu

CREATE TABLE mytable (
    myid INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    mytitle VARCHAR(100) NOT NULL
);
CREATE TABLE myarrayelements (
    myarrayid INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    myid INT UNSIGNED NOT NULL,
    mykey VARCHAR(100) NOT NULL,
    myval VARCHAR(100) NOT NULL,
    INDEX(myid)
);

$myarray = array();
$res = mysql_query("SELECT mykey, myval FROM myarrayelements WHERE myid='$myid'");
while(list($k, $v) = mysql_fetch_array($res)) $myarray[$k] = $v;

Bazen bir virgülle ayrılmış listesini saklamak için daha uygun olsa.

Bir şey sınırlı bu genişletilebilirlik olduğunu. Veritabanı programlama ortamı ile karıştırılmamalıdır. Ayrıca veritabanı ve hata ayıklama değerleri değiştirerek çok daha kolaydır. Veritabanı ve cgi perl gibi başka bir veritabanına veya cgi için değiştirilebilen olabilir.

Bir ilişkisel veritabanı kullanmak için nedenlerinden biri veri bütünlüğünü korumaya yardımcı olmaktır. Sadece bir tabloda bir damla dökülüyor tefrika dizi varsa veritabanı herhangi bir ne o blob herhangi bir mantıklı olmadığını kontrol yapmak için hiçbir yolu yoktur.

Eğer sunucu üzerinde bir yapılandırma dosyasında ayarlarınızı saklamak değil herhangi bir nedeni var mı? Örneğin, ben yerine bir veritabanına daha config.php web sitesi veya uygulama ayarları kaydedin.