Web Sitesi: kullanıcı değişkenleri çok sayıda depolamak için en iyi yolu nedir?

10 Cevap php

Şu anda PHP ve MySQL kullanarak bir web sitesi tasarlama ve site ilerledikçe kendimi çeşitli değişkenleri saklamak için kullanıcılara tabloya daha fazla sütun ekleyerek bulabilirsiniz.

Bana hangi düşünce var, bu bilgileri depolamak için daha iyi bir yolu var mı? Sadece netleştirmek bilgi küresel, kurabiye çalışmaz böylece diğer kullanıcılar tarafından etkilenmiş olabilir, onların çerezleri temizlemek varsa da ben bilgiyi kaybederim için.

Kolonlara bir sayıda olması daha az pahalı olacağını, bir veritabanında depolamak iyi yolu olduğunu söndürmeden gelmez ya da daha doğrusu sınırlanmış varchar sütun halinde ilgili sütunları birleştirmek ve sonra onları patlayabilir eğer sorumun ikinci parçası, PHP?

Teşekkürler!

10 Cevap

Benim durumumda, ben yerine birden fazla öğe tutan virgülle ayrılmış alanlar ekleyerek başlamak daha veritabanı sağ olsun istiyorum. Birden fazla virgülle ayrılmış alanlar aracılığıyla elemek zorunda sadece programın verimliliği ve kodun okunabilirliğini zarar edecek.

Ayrıca, tablo çok büyüyor ise, o zaman belki yabancı bağımlılıkları katıldı birden fazla tablo içine bölme içine bakmak gerekir?

Ben üç sütun, bir user_meta tablo oluşturmak istiyorum: user_id, key, value.

Ben birlikte sütunları gruplandırma ve onları patlayan seçeneği için gitmek değildir. Bu düzensiz çalışma ve çok yönetilemez bulunuyor. Bunun yerine belki birkaç tablo üzerinde bu sütunları yayılan ve InnoDB ait işlem özelliğini kullanmayı deneyin.

Hala sık sık veritabanı güncelleme fikrini sevmediğim ve bu yöntem size ulaşmak için çalışıyoruz ne uyuyorsa kullanabilirsiniz Eğer APC's caching function sunucu üzerinde "küresel" (cache) bilgileri saklamak için.

MongoDB (ve NoSQL kuzenler) bu gibi şeyler için mükemmeldir.

Veritabanı sürece değişkenler değil, diyelim ki, büyük görüntü dosyaları konum olarak, bu tür verileri saklamak için mükemmel iyi bir yerdir. Veritabanı büyük miktarda veri depolamak ve almak için tüm optimizasyonları ve özelliklere sahiptir. Eğer dosya sistemi düzeyinde kurmak şey her zaman hız ve işlevsellik açısından veritabanı zaten ne tarafından dövüldü olacak.

kolonlara çok sayıda olması ya da daha doğrusu sınırlanmış varchar sütun halinde ilgili sütunları birleştirmek ve daha sonra PHP onları patlatmak için daha ucuz olurdu?

Bir maintenance soruya daha performance gerçekten bu kadar IMO değil - bu sütun yüzlerce yönetmek eğlenceli değil. Bu tür verileri saklama - belki d objects - in a TEXT alan uygulanabilir bir seçenektir serialize - olarak sürece bu veriler üzerinde herhangi bir sorgu yapmak zorunda kalmayacaksınız% 100 emin olduğu gibi.

Ama neden bu kadar gibi bir normalize user_variables tabloyu kullanın:

id  | user_id | variable_name | variable_value

?

Bu biraz daha karmaşık bir sorgu için, ama bir very temiz bir tablo yapısı tüm yuvarlak sağlar. Kolayca keyfi kullanıcı değişkenleri bu şekilde ekleyebilirsiniz.

Eğer gibi çok fazla sorgu yapıyorsanız SELECT FROM USERS WHERE variable257 = 'green' belirli sütunları olması sopa var olabilir.

Veritabanı kesinlikle veri depolamak için en iyi yerdir. Kesinlikle dosyalarda saklamak üzerinde bir DB kullanarak daha iyi performans ve güvenlik olsun diye (ben başka düz dosyaları saklayarak düşündüğünü farz ediyorum).

Birden çok sütunda veri depolama ya da bunları sınırlayan getirmedi ... Bu kişisel bir seçimdir ama bir kaç şey düşünmelisiniz

  1. Eğer öğeleri sınırlandırmak için gidiyoruz, sen (metin içinde sınırlayan çıkabilirler olası değil bir şey) ile sınırlandırmak için gidiyoruz ne düşünmek gerekir
  2. Ben sık sık denemek ve seviyede başka bir programcı küçük bir yardım ile ne yaptık anlamak mümkün olacağını görselleştirmek için yardımcı bulabilirsiniz.
  3. Pekka dediğim gibi saklanan veri sorguları gerçekleştirmek istiyorsanız, Evet, sen ayrı sütunları ile sopa gerekir
  4. Sadece bilgi alan bir çift isterseniz de her zaman almak ve TÜM veri ayrıştırma değil hafif bir performans artışı alabilirsiniz

Ben size gelecekte çok daha büyük esneklik seçeneği sunuyor ayrı sütun ile devam öneririm. Ve büyük ölçüde veri yapısını değiştirmek ve parça aşağı bilgilerini geçirmek zorunda daha kötü bir şey yok!

(Bakınız http://memcached.org/) bir memcached sunucusu kurma öneriyoruz. Bu big sites sürü ile geçerli olduğu kanıtlanmıştır. PHP sizin çalışma içine bir müşteri entegre iki uzantıları vardır (bkz. http://php.net/manual/en/book.memcached.php).

Bir deneyin, pişman olmaz.

EDIT
Sure, this will only be an option for data that's frequently used and would otherwise have to be loaded from your database again and again. Keep in mind though that you will still have to save your data to some kind of persistent storage.

Bir belge yönelimli veritabanı neye ihtiyacınız olabilir.

Bir relational veritabanına sopa istiyorsanız, sadece oh çok alan içeren bir tablo oluşturma naif yaklaşım yapmayız:

CREATE TABLE SomeEntity (
    ENTITY_ID    CHAR(10)    NOT NULL,
    PROPERTY_1   VARCHAR(50),
    PROPERTY_2   VARCHAR(50),
    PROPERTY_3   VARCHAR(50),
    ...
    PROPERTY_915 VARCHAR(50),
    PRIMARY KEY  (ENTITY_ID)
);

Bunun yerine bir Özellik tablo tanımlamak:

CREATE TABLE Attribute (
    ATTRIBUTE_ID  CHAR(10) NOT NULL,
    DESCRIPTION   VARCHAR(30),
    /* optionally */
    DEFAULT_VALUE /* whatever type you want */,
    /* end_optionally */
    PRIMARY KEY   (ATTRIBUTE_ID)
);

Daha sonra sadece (örneğin, bir kayıt formu doldurulması zorunludur) temel nitelikleri da içeren SomeEntity tablo tanımlamak:

CREATE TABLE SomeEntity (
    ENTITY_ID   CHAR(10) NOT NULL
    ESSENTIAL_1 VARCHAR(30),
    ESSENTIAL_2 VARCHAR(30),
    ESSENTIAL_3 VARCHAR(30),
    PRIMARY KEY (ENTITY_ID)
);

Ve sonra veya saklamak istemeyebilirsiniz olabilir bu özellikleri için bir tablo tanımlamak.

CREATE TABLE EntityAttribute (
    ATTRIBUTE_ID    CHAR(10) NOT NULL,
    ENTITY_ID       CHAR(10) NOT NULL,
    ATTRIBUTE_VALUE /* the same type as SomeEntity.DEFAULT_VALUE;
                       if you didn't create that field, then any type */,
    PRIMARY KEY     (ATTRIBUTE_ID, ENTITY_ID)
);

Açıkça, senin durumunda, bu SomeEntity kullanıcı.

Instead of MySQL you might consider using a triplestore, or a key-value store that way you get the benifits of having all the multithreading multiuser, performance and caching voodoo, figured out, without all the trouble of trying to figure out ahead of time what kind of values you really want to store.

Downsides: Idaho da kendi şapkalar tüm insanların ortalama maaş anlamaya biraz daha pahalıya mal olur.

depoladığınız kullanıcı bilgi ne tür bağlıdır. Onun oturum ilgili veriler, db tek bir veri alanına oturum verilerini saklamak için oturum olay işleyicileri ile koordinasyon içinde php oturumları kullanırsanız.