HUMUNGOUS sorun için en şık çözüm

3 Cevap php

Ben bir kullanıcı bunlara geçerli bazı tarihleri, örneğin Tarih 1, Tarih 2, Tarih 3, vb seçebilirsiniz bir site üzerinde çalışıyorum

Her tarih ona ait bazı sorular olacak, bu nedenle müşterinin bu tarih ona geçerli olduğunu belirtmek için 'Tarihi 1' off kontrol eğer, o zaman Tarih 1 ve nasıl onlar için de geçerlidir soruyordu textboxes bir demet göreceksiniz. Aynı tüm diğer tarihler için de geçerli.

Tarih 1 ve 2 ve birkaç soru, ama kalan tarihler sadece 1 sorum var.

Bu tarihler ve cevapları daha sonra müşteri için kişiselleştirilmiş hatırlatmalar oluşturmak için kullanılan ve kendisine gönderilecektir.

Ben de basit (ya da mümkün olduğunca basit) ek tarihleri ​​ve alanları eklemek için yapar bir tasarım istiyorum.

Benim soru, veritabanındaki kullanıcı ile ilgili tüm tarihleri ​​ve cevapları depolamak için en iyi yolu nedir nedir? (Tabii ki aslında tarih 1, tarih 2, vs adında değil) son tarih - I user tabloda, ben Tarih 1 boolean sütun olduğunu düşünüyordum. Tarih 1 için sütun 0'a ayarlı ise, bu müşteri onu kontrol etmedi anlamına gelir, ve 1 daha sonra o yaptı ve bunun için sorularını yanıtladı demektir eğer.

Tarihlerin gerçek depolanması ile ilgili, ben bu iki seçenek düşünüyorum:

O tarih için sorulan her soru için sütun ve bir user_id kolonu ile her bir tarih için 1) 1 masa,. Yani Date_1 tabloda I Q1_name, Q2_name gibi sütunlar ve kullanıcı verdi soruların cevapları olacak.

1), o ne bilgi hesaplanırken, kullanıcının tüm cevapları almak için bir ağrı yapacak çünkü Ama daha zarif bir şey istiyorum. kişiselleştirilmiş e-posta gönderirken onlar için de geçerlidir. 2) Bazı tarihler sadece 1 sorum var, bu yüzden onlar için bir tam şişmiş bir tablo oluşturmak için çirkin olacak.

Sütunlu 2) A user_answer tablosu:

user_id,date_name,question_name,answer_val

2. en şık şimdiye kadar görünüyor, ama daha iyi bir çözüm olmalıdır. Herhangi bir düşünce?

3 Cevap

Eğer aşağıdaki (temel) tablo yapısı gibi bir şey istediğiniz gibi geliyor:

  • User - userId, userInfo
  • Date - dateId, dateInfo
  • Question - questionId, questionInfo
  • UserDate - userId, dateId - Bu belirli bir kullanıcı için geçerli olan tüm tarih saklar ve Kullanıcılar ve Tarihler arasında birçok ilişki çok temsil eden - bir kullanıcı birçok tarih ve bir tarih olabilir çok olabilir Kullanıcılar
  • DateQuestion - dateId, questionId - Bu depolar belirli bir tarih için geçerlidir ve Tarihler ve Soru arasında birçok ilişki çok temsil tüm sorular - Bir tarih, sanıyorum, birçok soru var ve bir soru birden fazla tarihe karşı kullanılabilir
  • UserResponse - userId, questionId, questionResponse - Bu depolar sorulan sorulara tüm kullanıcı yanıtları. Eğer soru, bir dateId sütun eklemek, birden çok tarih için birden fazla aynı soruya cevap varsayarak, geçerli tarih olduğunu bilmek gerekir.

Option 2 seems close to the good solution, but I'd replace date_name and question_name with date_id and question_id.
An optimal, and simplest solution that enables adding new questions and dates seems to be:
1. Dates table with the fields date_id, title, date.
2. Questions table with the fields question_id, date_id, title (and possibly type off the answer and description).
3. Answers table with question_id and answer.

Ayrıca çeşitli tarihlerde ortak olan sorular var ve ne bu durumda yapılacak olup olmadığını karar vermeniz gerekir. (Iki farklı cevaplar, ya da ortak bir cevap isteyebilirsiniz). Ben ilk çözüm karşı tavsiye ederim, bu soru değil dinamik yapmak istiyorum - Eğer soru veya tarihlerde her değişiklik için sql ve tablo yapısını değiştirmek gerekiyor.

Ben hemen hemen tek şey muhtemelen size aşağıdaki şemayı veren, ayrı bir tabloya soru ve tarih adlarını ayırmak verebilecek olan, bunu buldum:

User: id, ... (name, date of birth, favourite food, etc)
DateName: id, name (called it DateName so no conflicts with the word Date, which could mean something else in SQL)
Question: id, date_id, text
UserAnswer: user_id, question_id, answer_val

It's not necessary to split them up, but there are three reasons to do it: 1. Lookups on integers (like question_id) as opposed to text (like question_name) is a lot faster because integers are smaller and fixed in size. 2. If you change the text to a question (like to correct a spelling mistake), you only need to change a single entry in Question, instead of on every single row. 3. Because you're storing each bit of text only once, you save a lot of space. Storing 1000 ints are smaller than storing 1000 strings. Well as long as the strings are longer than a few character that is.

Bunun yanı sıra ben oldukça işe yarayabilir düşünüyorum.