【问题标题】:SQL database (Django) - Relate all records in table B to each record in table ASQL 数据库 (Django) - 将表 B 中的所有记录与表 A 中的每个记录相关联
【发布时间】:2015-09-28 22:10:28
【问题描述】:

我在 Django 中工作,但这个问题一般适用于任何数据库。

在我的模型中,我有一个 UserProfile 表。另一个表 UserQA 包含 question_text 字段和 question_answer 字段。这个模型的问题是我需要一个 ManyToMany 关系,每个问题有两个 longints 的开销,并且 question_text 为每个用户重复。

基本上,要求是:

  1. 用户可以通过添加自己的问题来参与的问题表
  2. 为每个用户存储每个问题的 1 个字符答案(Y/N/O/Null)

2.1 如果我想让一些问题有更复杂的答案,有没有办法扩展它?

这似乎是一个简单的问题,但我想不通...我认为这样做的方式似乎效率很低,有没有更好的方法?

谢谢!

【问题讨论】:

    标签: mysql django database


    【解决方案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(...)
    

    如果您想要更复杂的答案,例如特定值、值列表,您可以再创建一个模型:

    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 在一个地方,每个问题一个UserAnswerQuestionAlternatives 必须存在多少次。不用担心 ForeignKey 字段,它们不是开销,它们构建了漂亮的、可重复使用的结构。

    【讨论】:

    • 感谢第一部分现在对我来说很有意义。我仍然对“QuestionAlternative”感到困惑,它如何存储新选择?例如,如果我想要的两个不同答案是:models.CharField(max_length=1, choices=(('O','Other'),('M','Male'),('F','Female')models.CharField(max_length=1, choices=(('Y','Yes'),('N','No'),('O','Other') 我将如何输入这些选项?
    • 哦,我明白了,每个选择(是/否/男/女/其他)都会存储在QuestionAlternative中,然后通过主键链接,所以UserAnswer可以选择其中3个,对吧?我想我现在明白了,非常感谢 Jean Jung!
    • 对不起,我刚刚注意到的另外一件事 - 如果我正确理解 ForeignKeyanswer = models.ForeignKey(QuestionAlternative) 将只与一个答案相关。许多不同的问题可能与同一个答案有关。应该改用ManyToManyField 吗?
    • 没关系,我只记得用户只能得到一个答案,所以 ForeignKey 最好。我想我现在终于明白了,哈哈,再次感谢:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    相关资源
    最近更新 更多