Anket veritabanı tasarımı - hangi yol daha iyidir?


15

Bir uzun html sayfam var, küçük bölümlere ayrılmış birkaç soru kümesi var (bir sayfada yaklaşık 15 alt bölüm), toplam soru yaklaşık 100 soru: giriş, çoktan seçmeli, onay kutuları, radyo düğmeleri, textarea, ve dosya yükleme. Bir soru, onay kutusu grubundan, seçim listesi grubundan, çoklu seçim grubundan veya hepsinin bir cevapta birleştirildiği birçok yanıt içerebilir. Aşağıda bu veritabanı tasarımı kullanmak düşündüm ama sonuçta iyi bir yaklaşım olmadığını öğrendim.

  1. Bir müşterinin yalnızca bir soru grubu olabilir: 100 soru başına bir müşteri.
  2. Eski yaklaşım için ben veritabanında soru tutmak değil, bunun yerine PHP kodlama sabit olarak atar. Sorun ben veritabanındaki cevap ile senkronize almak için PHP soruyu karşılaştırmak zorunda olduğunu. Bir soru değiştirilmiş / silinmiş / PHP'den taşınmış olsaydı, kesinlikle Anket veritabanındaki cevapla eşleştirmek için kaybolurdum. Daha iyi bir çözüm mü?
  3. Birden çok formdan elde edilen birden çok yanıtı tek bir cevap şeklinde formda tutabilir miyim? Müşteriyi formda görüntülemek için bu alanı nasıl alıp tekrar görüntüleyebilirim?
  4. Aşağıdaki seçeneklerden hangisini seçmeliyim?

SEÇENEK 1: Eski Yaklaşım (1 tablo)

TABLO: Anket

  • Kimlik (PK)
  • Müşteri Kimliği
  • durum
  • A1
  • A2
  • A3
  • .
  • .
  • .
  • A100

SEÇENEK 2: Yeni Yaklaşım (2 tablo)

TABLO: Soru

  • QID (PK)
  • Soru (varchar)

TABLO: Cevap

  • YARDIM (PK)
  • Müşteri Kimliği
  • QID (int)
  • Cevap (varchar)

Veya SEÇENEK 3?


Uygulama hakkında daha fazla bilgi ekleyebilir misiniz lütfen. - Anketler dinamik olarak oluşturulmuş mu? IE: Bu soru formunun bu soruları olması gerekirken, başka bir soru formunun diğer soruları olmalıdır. - Anket soruları dinamik midir? IE: Müşteri daha sonra yeni sorular ekleyebilir. Dinamik bir sistem veya statik bir sistem olursa olsun 1: 1 Soru-Cevap sonuçlarını 1: M'den farklı olarak saklamanız gerekir. Soru: DB'deki cevaplar.
Zambonilli

Evet ve Hayır sırasıyla (dinamik soru daha sonra 2. aşamada olabilir, ancak şimdi olmayabilir.)
Modüler

Bu 100 soruyu kapatmak için oy verdim : giriş, çoktan seçmeli, onay kutuları, radyo düğmeleri, metin alanı ve dosya yükleme seçeneklerinden farklılık gösterir .
Evan Carroll

Yanıtlar:


17

Anketinizi kesinlikle kodlamayın. İlişkisel veritabanı veya xml dosyaları kullanın. Aşağıdaki tabloları öneriyorum

  • Questionnaire: Anketin genel tanımı. Başlık, anket adı, anket çıkış tarihi, versiyonu vb.

  • Section: Bir anketin oluşturulduğu bölümler. Bölüm numarası, bölüm başlığı, açıklama.

  • Question: Bir bölüme ait sorular. Soru sayısı, soru metni, açıklama, soru türü (metin, çoktan seçmeli vb.).

  • Question_Choice: Tek onay kutularına, radyo düğmelerine vb. Karşılık gelen bir soruya ait olası cevaplar. Seçim metni, seçim numarası, sipariş.

  • Respondent: Soruları cevaplayan kişiler. Kişisel veriler, kullanıcı numarası.

  • Interview: Bir ankete katılan ve bir ankete ait olan görüşmeler veya testler veya anketler (anketin niteliğine bağlı olarak). Yanıtlayan her zaman yalnızca bir anketi yanıtlayabilirse (veya anket anonim ise), bu tablo geçersizdir ve Yanıtlayan tablosuyla birleştirilebilir. Görüşme tarihi (veya test tarihi veya anket tarihi), görüşmeci (varsa).

  • Answer: Bir görüşmeye (veya yanıtlayana, yukarıya bakınız) ve bir soruya ait cevaplar. Cevap metni (metin türü soruları için), seçim (radyo düğmeleri için).

  • Answer_Choice: Birden çok seçeneğin ne zaman kontrol edilebileceğini bir Cevap ve bir Soru_Seçene ait seçenekler.

Bu çok normalleştirilmiş bir yaklaşımdır; ancak, seçimleri tek bir dizede birleştirmeye veya bit kalıbı olarak depolamaya veya ihtiyaçlarınıza bağlı olarak başka bir şekilde basitleştirmeye karar verebilirsiniz.


6

Birkaç masaya ihtiyacınız var,

1 - Sorular (soru kimliği, giriş tipi, görünür, soru tipi, soru metni, beklenen cevaplar ....)

2 - Yanıtlar (soru kimliği, kullanıcı kimliği, etkinlik kimliği, yanıt ...)

3 - Kullanıcılar (kullanıcı kimliği, kullanıcı adı ......)

4 - Bir soru / cevap etkinliğinin tutulacağı bir tablo (etkinlik kimliği, veri / saat, kullanıcı kimliği)

Ayrıca, her bir etkinlik için uygulanması gereken soruları belirten bir tabloya sahip olmak isteyebilirsiniz - ya kullanıcı tarafından gruplandırılmış ya da soru koleksiyonu olabilir. Yabancı / birincil anahtarlar, birden çok tabloda aynı ada sahip olan ve dizine eklenecek sütunlar olacaktır.

Bu yapıyı kullanıyorsanız, şemanızı veya sunum kodunuzu değiştirmek zorunda kalmadan bir soru veya kullanıcı ekleyebilmeniz veya yanıtı değiştirebilmeniz gerekir - sunum kodunun çalışma zamanında dinamik olarak oluşturulduğundan emin olun - yalnızca bir kayıt eklemeniz gerekir uygun yerde.

Bu yaklaşımın başlangıçta geliştirilmesi, kodlanmış bir yaklaşımdan daha uzun sürebilir, ancak davranışı değiştirmek için yalnızca verileri değiştirmeniz gerekeceğinden, bakımı çok daha kolay olacaktır.

(Bir ipucu, sunum katmanınızı oluşturmak için, uygun soruların görüntülenmesini sağlayan bir sorguya ihtiyacınız olacak, daha sonra bu sonuç kümesinde döngü yapacak ve ekranda soru sormak için bir yöntem çağıracaksınız, seçilecek yöntemler bu sorunun sunumu [metin kutusu, radyo grubu, vb.))


+1 Tablo # 4'ten emin değilim ama genel olarak iyi bir cevap. Özellikle tekil tablo adlarından çoğul yani Soru >> Sorular'a geçişi seviyorum.
Leigh Riffel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.