2015-09-28 7 views
0

Я работаю в Django, но этот вопрос может применяться к любой базе данных в целом.База данных SQL (Django) - Отнести все записи в таблице B к каждой записи в таблице A

В моих моделях у меня есть таблица UserProfile. Другая таблица UserQA содержит поле для question_text и поле для question_answer. Проблема с этой моделью заключается в том, что мне понадобится отношение ManyToMany, у которого есть накладные расходы на два longints для каждого вопроса, а question_text дублируется для каждого пользователя.

В принципе, требования:

  1. Таблица вопросов, которые пользователи могут внести свой вклад в добавляя свои собственные вопросы
  2. магазин 1 символьный ответ (Y/N/O/Null) для каждого вопроса, каждый пользователь

2.1 Есть ли способ расширить это, если мне нужны некоторые вопросы, чтобы иметь более сложные ответы?

Это казалось легкой проблемой, но я не могу понять это. То, как я думал, что это делается, кажется очень неэффективным, есть ли лучший способ?

Спасибо!

ответ

1

Вам понадобится другая модель, может быть Question. Окончательный результат будет что-то вроде:

class User(models.Model): 
    user_name = models.CharField(...) 

class Question(models.Model): 
    question_text = models.CharField(...) 

class UserAnswer(models.Model): 
    question = models.ForeignKey(Question) 
    user = models.ForeignKey(User) 
    answer = models.CharField(...) 

Если вы хотите более сложные ответы, как especific значений, списки значений, вы можете создать еще одну модель:

class QuestionAlternative(models.Model): 
    question = models.ForeignKey(Question) 
    value = models.CharField(...) 

А затем переопределить UserAnswer:

class UserAnswer(models.Model): 
    question = models.ForeignKey(Question) 
    user = models.ForeignKey(User) 
    answer = models.ForeignKey(QuestionAlternative) 

При этом, вы будете иметь Questions в одном месте, один UserAnswer на каждый вопрос, и QuestionAlternative сек сколько раз они должны существовать. Не волнуйтесь о полях ForeignKey, они не являются накладными расходами, и они создают красивые, многоразовые структуры.

+0

Спасибо, первая часть имеет смысл для меня сейчас. Я все еще запутался в вопросе «QuestionAlternative», как он хранит новые варианты? Например, если два разных ответа я хочу: 'models.CharField (max_length = 1, choice = (('O', 'Other'), ('M', 'Male'), ('F' , 'Female') ' и ' models.CharField (max_length = 1, choice = (('Y', 'Yes'), ('N', 'No'), ('O', 'Other'), ' Как я могу ввести эти выборы? – dtgq

+0

О, я вижу, каждый выбор (да/нет/мужской/женский/другой) будет храниться в' QuestionAlternative', а затем связан первичным ключом, поэтому 'UserAnswer' может выбрать 3 из они, правда? Я думаю, что получил это сейчас, спасибо вам большое Жан Юнг! – dtgq

+0

Извините за тройной пост, еще одна вещь, которую я только что заметил - если я правильно понимаю «ForeignKey», 'answer = models.ForeignKey (QuestionAlternative) 'было бы связано только с одним ответом. С этим же ответом можно было бы связать много разных вопросов. Должно ли оно использоваться' Ма nyToManyField' вместо этого? – dtgq

Смежные вопросы