如何规范每周参与和每周问题之间的关联?

时间:2009-07-30 15:47:51

标签: database associations database-normalization database-table

我正在实施一个比赛系统,用户必须选择多个问题的正确答案。每周都有一组新的问题。 我试图找到将用户参与存储在数据库中的正确方法。现在我有以下数据模型:

 Participation                     Week
+--------------+                  +--------------+
| Id           |     +----------->| Id           |<-+
| UserId       |     |            | StartDate    |  |
| WeekId       |-----+            +--------------+  |
+--------------+                                    |
                                   Question         |
                                  +--------------+  |
                                  | Id           |  |
                                  | WeekId       |--+
                                  | Text         |
                                  +--------------+

我提出的唯一解决方案是添加一个将参与与问题相关联的答案表,如下图所示:

    Participation                     Week
   +--------------+                  +--------------+
+->| Id           |     +----------->| Id           |<-+
|  | UserId       |     |            | StartDate    |  |
|  | WeekId       |-----+            +--------------+  |
|  +--------------+                                    |
|                                     Question         |
|       Answer                       +--------------+  |
|      +------------------+    +---->| Id           |  |
+------| ParticipationId  |    |     | WeekId       |--+
       | QuestionId       |----+     | Text         |
       | Value            |          +--------------+
       +------------------+

我没有链接这个解决方案非常好,因为它允许参与者从不同的一周获得问题的答案。将WeekId添加到答案中没有用。

表示此信息的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

您可以删除表Participation中的Id字段,并使用(UserId,WeekId)作为表Participation的组合/连接主键。表中的参与字段表示您必须替换然后通过对(UserId,WeekId)替换表参与的外键引用。如果您的数据库系统允许,您可以在表格Question中引用表格(Id,WeekId)中的字段(QuestionId,WeekId)。也许为此你必须在表格问题之前在对(Id,WeekId)上定义一个索引。

答案 1 :(得分:0)

你真的需要将参与与本周联系起来吗?你可以通过问题

获得它

所以:

  • 答案(ID,用户ID,QuestionId,值)
  • 问题(ID,WeekId,文本)
  • 周(Id,StartDate)

答案 2 :(得分:0)

我个人认为你在这里有适当的实施。

ParticipationId链接到参与的ID,该ID与用户和周密钥相关。您的问题表也与WeekId一起使用。

因此,您一直都有适当的参考。如果不是这种情况,我认为我们需要查看一些数据