Anket veritabanı tasarımı: bir yanıtı ilişkilendirin


12

Bir anket veritabanı için kavramsal modeli yapıyorum.

Amaç, kullanıcılar tarafından verilen cevapları saklamaktır (bir Android uygulaması olacaktır).

Üç varlığım var: kullanıcı, soru ve seçenek.

Bir sorunun bir veya daha fazla seçeneği olacaktır (örneğin: Kaç çalışanınız var? 1-40, 40-1000, +1000).

Seçeneklerde bir metin (1-40) ve bir değer (kullanıcı tarafından seçilen değer) bulunur.

Kullanıcı bu seçeneklerden birini (veya daha fazlasını) seçecektir.

Kavramsal tasarımım:

resim açıklamasını buraya girin

Bir yanıtı bir kullanıcıyla nasıl ilişkilendireceğimi bilmiyorum.

Bu ilişkiyi nasıl temsil edebilirim?
Seçenek değerini temsil edecek başka bir varlığım var mı?

Bu model soruları ve önceden yapılmış cevapları (önerilen cevaplar) saklayacak ve farklı anketlerde tekrar kullanılmalarını sağlayacaktır.

Böyle bir soruyu temsil etmeliyim:

resim açıklamasını buraya girin

Bu soru bununla ilgilidir: Anket veritabanı tasarımı: ilk sürüm. Hatalar var mı?


1
Kullanıcılar ve Seçenekler arasındaki çoktan çoğa ilişkiyi ele almak için başka bir tabloya ihtiyacınız olacak gibi görünüyor.
OliverAsmus

Yanıtlar:


7

Olası cevaplar ile seçilen cevaplar arasında bir ayrım yapmanız gerekir .

OptionTablo iki tablo olması gerekiyor. OptionM: Tablo 1 olmalıdır Questionve bu soruya muhtemel cevaplar içermelidir.

O zaman yeni bir kavşak varlığı oluşturmalısınız, ve Selected_Optionarasında oturan onu arayın .UserOption

Sorunuz kullanıcıya bir değeri yanıt olarak doldurma fırsatı verirse (örneğin, "DİĞER: ..."), bu değer Selected_Optiontabloda depolanır . Aksi takdirde, kullanıcı tarafından seçilen değer, içinde bulunan değer olacaktır Option.


DÜZENLE:

OP'nin gereksinimleri açıklamalarına dayanarak: İhtiyacınız olan şey, aşağıdaki şekillerde tipik bir anket modeli gibi değildir:

  • Sorularınızın hepsinin aynı yanıt grupları (sütunlar) var
  • Yanıtlarınızdan bazıları (sütunlar) birlikte gruplandırılmıştır.
  • Soru blokları birlikte gruplandırılmıştır.

Form anlık görüntünüzü bir kılavuz olarak alarak, formunuzun öğelerini renk kodladığım varlıklara böldüm:

Renk Kodlu Form Örneği

Bu, aşağıdaki mantıksal ERD ile karşılanabilir:

Mantıksal ERD

Ben korelasyon göstermek için örnek formun anlık görüntüsüne karşılık ERD varlıklarını renk kodlu unutmayın.

Bu modeldeki varsayımlardan biri, her bloğun, bloktaki QUESTION_GROUPsol sütuna karşılık gelen yalnızca bir quesiton (yani bir ) setine sahip olmasıdır . Bu biraz basitleştirici bir varsayımdır.


Sorumu tipik bir anket sorusunun resmiyle güncelledim.
VansFannel

1
@VansFannel - Düzenlenen sorunuzu yansıtacak şekilde cevabımı güncelledim.
Joel Brown

Çok teşekkür ederim! Bana çok yardımcı oldun. Burada bir soru olarak benim nihai tasarımı ekledik: dba.stackexchange.com/questions/16066/... İsterseniz bunu kontrol edebilirsiniz.
VansFannel

Bir soru: "Dizi" ve "değer" ne anlama geliyor? ERD ile çok çalışmadım (üzgünüm).
VansFannel

@VansFannel - ERD'deki öznitelik notları tablolardaki önemsiz (veya açık olmayan) sütunlardır. Kimlikleri, FK'leri, açıklamaları vb. Nereye koyacağınızı tahmin etmenizi bekliyorum. Çünkü sequenceöğelerin görüntülenme sırasını kontrol etmeniz / önermeniz gerektiğini öneriyorum. Çünkü valuekullanıcı tarafından girilen bir değerin (sadece bir seçenek seçimi değil) uygun olabileceğine işaret ediyorum.
Joel Brown

13

Anket Veritabanı Şeması.

Bu binlerce kişi tarafından yapılan gerçek bir klasik. Her zaman başlamak için 'oldukça basit' görünüyorlar ama iyi olmak aslında oldukça karmaşık. Bunu Rails'te yapmak için ekteki diyagramda gösterilen modeli kullanırdım. Eminim bazıları için çok karmaşık görünüyor, ancak bunlardan birkaçını oluşturduktan sonra, yıllar boyunca tasarım kararlarının çoğunun en iyi dinamik esnek veri yapısı tarafından ele alınan çok klasik modeller olduğunu fark ediyorsunuz. başlangıç.
Aşağıda daha fazla ayrıntı:

resim açıklamasını buraya girin

Anahtar tablolar için tablo ayrıntıları

Yanıtlar

Cevaplar o kullanıcılar tarafından fiili tepkileri yakalar olarak tablo çok önemlidir. Sen bu cevaplar bağlantıları fark edeceksiniz question_options değil sorular . Bu kasıtlı.

input_types

girdi_türleri soru türüdür. Her soru yalnızca 1 tipte olabilir, örn. Tüm radyo kadranları, tüm metin alanları, vb. "Dahil et?" İçin (örneğin) 5 radyo kadranı ve 1 onay kutusu olduğunda ek sorular kullanın. seçeneği veya böyle bir kombinasyon. Kullanıcılar görünümünde iki soruyu bir olarak etiketleyin, ancak dahili olarak biri radyo aramaları için, diğeri onay kutusu için olmak üzere iki sorusu var. Bu durumda onay kutusunun 1 grubu olacaktır.

option_groups

option_groups ve option_choices 'ortak' gruplar oluşturmanıza izin verir. Bir örnek, bir gayrimenkul uygulamasında 'Mülk kaç yaşında?' Sorusu olabilir. Cevaplar aşağıdaki aralıklarda istenebilir: 1-5 6-10 10-25 25-100 100+

Daha sonra, örneğin, bitişik mülk yaşı hakkında bir soru varsa, anket yukarıdaki aralıkları 'yeniden kullanmak' isteyecektir, böylece aynı option_group ve seçenekler kullanılır.

ölçü birimleri

unit_of_measure göründüğü gibidir. İster inç, bardak, piksel, tuğla veya başka bir şey olsun, burada bir kez tanımlayabilirsiniz.

Bilginize: Doğasında genel olmasına rağmen, bunun üstünde bir uygulama oluşturulabilir ve bu şema Ruby On Rails çerçevesine her tablo için birincil anahtar için "id" gibi kurallar ile çok uygundur . Ayrıca ilişkilerin hepsi basit one_to_many ile many_to_many veya has_many throughs gereklidir. Büyük olasılıkla has_many: throughs ve / veya: delegeler ekleyeceğim.


Harika! Cevabınız için teşekkürler. Onunla çok şey öğreneceğim. Teşekkür ederim.
VansFannel

Mükemmel cevap. Şu anda benzer bir tasarım problemiyle savaştığım için çok faydalı. :)
Dr. Mike

Bu seçilen cevap olmalıydı. Çok faydalı, teşekkürler!
dsignr

@Michael "Sorulara değil, soru_seçeneklerine verilen yanıtların yanıtlarının farkına varacaksınız. Bu kasıtlı." Neden hakkında daha fazla açıklama yapabilir misiniz? :)
Pak

@Michael Merhaba, harika cevap! HTML sayfasındaki bazı soruların CSS'sini özelleştirebilmeniz gerekiyorsa, bunu nasıl yapardınız? Şirketler tablomda bir CssFile özelliği oluşturduk, ancak soru düzeyinde daha spesifik olmam gerekiyor. Teşekkürler.
Patrick

2

Bu genel fikre bir göz atın:

resim açıklamasını buraya girin

(Kısalık için yukarıdaki modele yalnızca en gerekli alanlar dahil edilmiştir.)

Bu model aşağıdaki özelliklere sahiptir:

  • Tek bir soru birden çok anket arasında paylaşılabilir (ve elbette tek anket birden fazla soru içerebilir). SURVEY_QUESTION, bu M: N ilişkisini uygulayan "bağlantı" tablosudur.
  • Anketteki soruların sırası SURVEY_QUESTION.QUESTION_NO tarafından belirlenir. {SURVEY_NO, QUESTION_NO}, U1yukarıdaki şemada belirtilen (alternatif) bir anahtar olduğundan , hiçbir anket aynı ankette aynı "alanı" işgal edemez. Farklı anketlerin soruları farklı bir sırada olabilir.
  • Her sorunun bir dizi olası cevabı veya "seçeneği" vardır. Seçeneklerin görsel sırası OPTION.OPTION_NO tarafından belirlenir ve PK'da olduğundan, aynı seçenek altında iki seçenek aynı "yuvayı" işgal edemez.
  • Farklı kullanıcılar aynı soruya farklı cevaplar verebilir (ve elbette bir kullanıcı birden fazla soruya cevap verebilir). Bu M: N ilişkisi "link" tablosu CEVAP yoluyla uygulanır.
  • Bir kullanıcı soruyu seçeneklerinden en birini seçerek cevaplar . Bu, OPTION_NO öğesinin CEVAP PK'sinden hariç tutulmasıyla sağlanır . Kullanıcının birden çok seçenek belirlemesine izin vermek istiyorsanız, PK'ye OPTION_NO ifadesini ekleyin.

Bu veri modelinde kullanıcıyı tüm soruları yanıtlamaya zorlayan hiçbir şey yoktur - bu uygulama düzeyinde yapmanız gereken bir şeydir. Bununla birlikte, bu model yapmanız gerekenler için iyi bir başlangıç ​​olmalıdır ...


Sorumu tipik bir anket sorusunun resmiyle güncelledim.
VansFannel

1

Kullanıcıların cevaplarını tutmak için başka bir tabloya ihtiyacınız olacak.

user_answers
------------
  user_answer_id - benzersiz birincil anahtar
  user_id - FK - Kullanıcı tablosu
  selected_option_id - FK - Seçenek tablosu
  question_id - Soru tablosuna FK

Kullanıcıların bir seçenek olarak "Diğer" i seçmesini ve kendi değerlerini doldurmasını istediğinize karar verirseniz, bunun için ayrı bir tablo öneriyoruz:

user_alt_answers
----------------
  user_alt_answer_id - PK
  alt_answer_text - kullanıcının "diğer" bir seçenek için girdiği metin.
  user_answeR_id - FK'den user_answers tablosuna

Sorumu tipik bir anket sorusunun resmiyle güncelledim.
VansFannel

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.