0

我正在开发一个类似调查的应用程序。对于多项选择题,我想将项目组合存储在一个数字中以将其存储在一行中。

所以问题的数据库结构是这样的:

id    type                 text                      item_id
-- ---------------   ---------------------------     -------
1  multiple_choice   which one would you choose?        42
1  multiple_choice   which one would you choose?        43
1  multiple_choice   which one would you choose?        46

这是一个有 3 个选项的问题,选项将从另一个表items调用,id 为 42,43,46

所以我想把这个组合变成一个数字来实现这一点:

id    type                 text                      items
-- ---------------   ---------------------------     -------
1  multiple_choice   which one would you choose?        x*
  • x 应该是一个数字,表明它来自数字 42,43,46

所以在数学上它会像

f({42,43,46}) = x   and   f^-1(x)={42,43,46}

解决这个问题的一种方法可能是使用素数作为项目 ID。所以它们的乘法是唯一的,但是有没有办法对所有数字做到这一点?

提前致谢。

4

2 回答 2

1

不不不。这不是您想要在关系数据库中执行的操作。

您的原始表格questions更接近正确的方法。

如果您想获得所有可能的答案,只需执行以下查询:

select id, type, text, group_concat(item_id)
from questions q
group by id, type, text;

但是,您真正应该拥有的是两张表(至少)。列出每个问题并具有以下列的问题:

  • question_id
  • 类型
  • 文本

每个问题有1行(即是question_id主键)。

还有第二个表question_items,列如下:

  • question_items_id
  • question_id
  • 有关该项目的更多信息

使用这种格式,上面的查询会更像:

select q.question_id, q.type, q.text, group_concat(qi.question_item_id)
from questions q join
     question_items qi
     on q.question_id = qi.question_id
group by q.question_id, q.type, q.text;

尽管查询可能看起来有点复杂,但底层数据结构更好地代表了您的问题域。这使得整个系统更加健壮和可维护。

于 2013-04-21T16:15:05.830 回答
1

这不是解决此问题的最佳方法。你应该有一个多表结构,即

  • 问题= 每个问题 1 行,包含文本和问题类型
  • 项目= 每个项目 1 行
  • QuestionHasItems = 每个问题每个项目 1 行

这些名称仅用作说明。通过沿着您开始的路线走,“类型”、“id”和“文本”字段是多余的,因此非常浪费/效率低下。

如果您查看此示例,您将看到预填充的表结构和示例查询。 http://sqlfiddle.com/#!2/fdf5f/4

如下查询将生成您想要的数据

SELECT

  q.questionid,
  q.questiontype,
  q.questiontext,
  GROUP_CONCAT(i.itemid) AS itemIDs,
  GROUP_CONCAT(i.itemtext) AS itemTexts

FROM questions q

INNER JOIN questionHasItems qhi
ON qhi.questionid = q.questionid

INNER JOIN items i
ON i.itemid = qhi.itemid

GROUP BY q.questionid;

同时允许您通过执行以下查询有效地获取问题可用的选项,例如

SELECT

  i.itemid AS itemIDs,
  i.itemtext AS itemTexts

FROM questionHasItems qhi

INNER JOIN items i
ON i.itemid = qhi.itemid

WHERE qhi.questionid = 1;
于 2013-04-21T16:15:13.437 回答