Basit Veritabanı Tasarımı Soru

8 Cevap php

PHP ve MySQL destekli web uygulama geliştiriyorum. Ben masa benim uygulama kullanıcının bu tür e-posta bülteni seçenekleri, şirket adına (işleri gibi bazı İSTEĞE bilgi girebilirsiniz. Telefon numarası vb, birinci ve soyad gibi adı gibi bazı bilgileri depolamak, bu tabloda, kullanıcılara adında var .. ) veya web sitesi url. Bu bilgiler tüm İSTEĞE (app yaklaşık 20 opsiyonel bilgi türü var). Bu durumda veritabanı tasarımı hangi tür gerçek olacak?

I dizi ve kullanımı, tefrika tüm ek bilgileri depolamak ve veritabanına kaydetmek sonra verileri okurken ben unserialize kullanmanız gerekir, ancak bu şekilde bazı eksileri olabilir olabilir. Ben fikirleri waitting ediyorum, teşekkür ederim.

8 Cevap

Üç sütun ile ekstra bir tablo OptionalInformation ekle:

  • FK_UserID
  • OptionalFieldName
  • Değer

The combination of the three is your primary key for this table. This is much easier to query than a serialized column.

Daha sonra daha fazla bilgi saklamak için karar verirseniz o da daha kolay hale getirir. Sen yerine OptionalInformation tabloya bir satır eklemek gerekir, sizin kullanıcı tabloya fazladan sütun eklemek zorunda kalmazsınız

Eğer php serialize kullanarak bir sütuna ekstra verileri serialize varsa, bu verileri sorgulamak mümkün asla. Eğer "http://www.foo.com" gibi bir web sitesi ile bir kullanıcı için sorgulamak istiyorsanız bu veri tefrika çünkü IE, sen bunu yapamazsın.

Ben genellikle etrafında hiçbir yolu olmadığı benim veritabanında tefrika veri depolamak sevmiyorum.

Neden ki?

Hiçbir yararı yoktur: Bunu sorgulamak değil, onu başka herhangi developper oldukça karanlık bilmiyor? vb

Yapmak için en iyi her optionnal bilgi için 1 alanları var, ve "Nullable" ayarlanır. Kullanıcı girişi şey varsa, o satır içeren DBNull.

Ben veritabanında alanları olarak yakalamak istediğiniz tüm verilere sahip olmayan herhangi bir yarar göremiyorum.

Eğer bunu sorgulamak mümkün olmayacak bir şekilde verileri tefrika, bu değerleri elde etmek için her zaman daha fazla iş olacak ve onu çok daha zor başkasının tasarımını anlamak için yapacaktır.

Eğer ayrı sütun varsa istediğiniz verileri bulmak için çok kolay olacak ve size Intellisense gibi bir şey ile bir editör varsa bunu otomatik olarak tamamlanır sütun isimleri.

Eğer verileri serialising bulmak için ne tür faydalar bekliyorsunuz? Eğer herhangi bir disk alanı kaydetmek için gitmiyorsun, ve şans bu hiç zaten bir sorun olmayacak bu yüzden çoğu veritabanlarının veri depolamak konusunda oldukça zekidirler.

Ben sadece tek bir tablo için gitmek istiyorum - kullanıcı, varsayılan değer NULL olan İSTEĞE alanları ile.

Sana şema tasarım bir tek / jenerik varlık olarak bunu yapmanın birçok yolu vardır eminim.

Serileştirme, anahtar değeri arama tablosu vs vs ...

Eğer gerekir ise ancak 20 sütun ile ben soru. Araçlarınızın ve db işi yapsın ve sütunlar olarak saklayın. Başka bir şekilde bunu yapıyor sen bu verileri gelecekte rapor veya çıkarmak istediğiniz zaman sonra pişman olacak bir şey olabilir.

Birden çok tablo alanı veya tek bir "İSTEĞE BAĞLI" biri olarak bu isteğe bağlı alanlar ekleyerek uğurda uygulamaya bağlıdır, ama söyleyebilirim ki bu alanların hiçbiri SQL için herhangi bir şekilde kullanılacaktır sure o ise sorgular, sonra isimli tamam olmalı.

Unutulmaması gereken bir şey, ben serialize () yerine ETMEM:

$json = json_encode($data);

ve

$data = json_decode($json, true)

unlike serialize(), json could be unserialized elsewhere (javascript/browser), is binary-safe, veit's also human-readable.

Dizgeleştirme belirli bir veri sorgulama önler. Kesinlikle tüm bülteni için seçti ve kim bilmek isteyebilirsiniz. Sonra ayrı bir sütunda her bilgi depolamak gerekir.

İsteğe bağlı sütunlar için NULL değerleri kullanmak için cazip olabilir. Ama performans bilge, NULL değerler indeksleme ve sıralama açısından sunucu üzerinde bir stres koymak. Yani sütunlar için varsayılan değer olarak boş bir dize ya da sıfır olması tavsiye edilir. Ve PHP, boş () yöntemini kullanarak durumunu kontrol edebilirsiniz.