数据库结构,允许用户对主题进行投票


Database structure to allow users to vote on a topic

我有一个作业模型和一个用户模型。我需要每个用户能够根据特定的作业回答几个问题。每个问题从1到10分(或未回答)。

我相信我需要一个hasMany through协会,但之前一直被这些混淆。

有人可以帮助我与我的数据库/模型布局。谢谢。

编辑:

  • 我现在唯一的表是用户和作业
  • 每个职位的问题都是一样的,总共有六个(将来可能会更多)
  • 问题将始终是数字从1到10(或未回答)

是的,是hasMany through的完美候选人,我将这样做:

User hasMay JobQuestion
Job hasMany JobQuestion
JobQuestion belongsTo Job, User

将所有问题放在JobQuestion模型中。这个模型可能有一个更合适的名字。您需要模型钥匙的更多细节吗?

编辑:

JobQuestion模型中的一行将:

id | user_id | job_id | question1 |…| questionN

你的数据数组应该像

Array
(
    [0] => Array
        (
            [JobQuestion] => Array
                (
                    [id] => 1
                    [user_id] => 1
                    [job_id] => 1
                    [question1] => answer1
                    [question2] => answer2
                )
            [Job] => Array
                (
                    [id] => 1
                    [name] => somejob
                )
            [User] => Array
                (
                    [id] => 1
                    [username] => someuser
                )
        )
)

我认为应该是:

Tables: User, Job, Question, Answer

  • hasMany 问题
  • 用户
  • hasMany 答案
  • hasMany 答案

你的Answer表可以有以下列:user_id, question_id, Answer (NULL或1-10)

如果Question表以某种方式集成到Job中,则不需要Question表。

EDIT:更新,根据评论建议从回答表中删除冗余的id

如果我正确地理解了您的模型,听起来像是用户选择工作,然后回答特定于该工作的问题(其中一些可能适用于多个工作)?如果是这样的话,我认为你的表结构应该看起来像这样:

首先是离散的实体。

Users:
    UserID (PK)
    User
Jobs:
    JobID (PK)
    JobName

注意,如果一些问题是一般性的,适用于多个工作,那么问题应该定义如下:

Questions
    QuestionID (PK)
    Question

否则,如果每个问题都特定于特定的工作,则可以避免至少一个关联表,并将FK合并到问题表中:

Questions
    QuestionID
    JobID
    Question

但我不建议这样做,除非你确定每个工作都有独特的问题。

下一步,你的关联:

User_Jobs (Composite key = FK on USerID, FK on JobID)
    UserID 
    JobID
Job_Questions (Composite Key = FK on JobID, FK on QuestionID)
    JobID
    QuestionID
User_Job_Questions (this one would contain a feild for responses, and could also be named User_Response)
    UserID
    JobID
    QuestionID
    Response (likley constrained to ints from 1-10)

注意User_Job_Questions将包含与Job_Questions相关的JobID和QuestionID的复合FK,以及与Users相关的另一个FK。

Job hasAndBelongsToMany问题,因为同一个问题可以应用于多个工作。

然而,要实现您的答案,您使用这种方法,一个hasmanythroughjoin。在JobQuestion表中,您可以存储答案和user_id。