问答系统的数据库结构

Database structure of quiz system

我正在构建一个测验系统,但我不确定如何在数据库端构建它。

假设测验系统是针对树种的。用户将看到一张树图片(一个条目),并且必须 select 从 6 个列表中选择正确的物种(5 个随机,1 个正确)。 有250个品种参与竞猜

我需要解决的两个主要问题:

1) 用户不应再看到相同的树条目。 2) 树木条目的所有者,必须能够看到他条目上所有投票的统计数据:所以他将看到其他用户在他的条目上输入的每个树种的投票数。因为用户会在投票上犯错,条目所有者将看到这些错误的统计信息以及他的条目被误认为是哪个不正确的物种。

一个简单的方法是创建几个 tables:

所以解决我的问题:

1) 防止用户再次看到相同的条目:在获取 "Trees" 以展示要投票的新树之前,运行 第一个查询以获取该用户的所有 "Votes"排除 "Trees" 用户已经投票。

2) 查看自己条目的投票统计数据:获取所有指向自己条目的投票,然后按树种计算统计数据 selected.

这种方法很简单,但让我困扰的是必须为每一次投票创建一个条目。可能有很多。我对数据库设计没有经验,所以不确定这是否是个问题。

这种替代方法会更好吗:

1) 跟踪已投票的条目:在单个记录(每个用户)上,保存在单个字段中,所有投票的 ID,因此不用 运行 查询来预取每个投票条目,只需从一个字段中获取它们。不确定这是否可行,以及可能持有数千票的单个字段的限制大小是多少,这些票实际上是投票条目的 ID。

2) 因此条目的所有者可以查看该条目的统计信息:在每个树条目上,创建 250 列,每个树种一列,并根据投票的内容在每个列上增加一个 INT。因此,要获取每个条目的统计信息,只需获取一条记录并在客户端进行计算即可。

最好的方法是什么?有没有应该避免的?

最好的方法肯定是您描述的第一个方法 - 为用户提供 table,为树木提供 table,为投票提供 table。

其他替代方案很糟糕且无法扩展 - 按此顺序:

  1. 在 99.999% 的情况下,让一个列存储多个数据点是错误的做法,而在 99.999% 的情况下,当有人决定这样做时,它是在最糟糕的情况下完成的可能的方式 - 使用分隔字符串。
    每个数据库都有适当的数据类型来存储多个数据点——它被称为 table。一些数据库还支持 XML、Json 或数组等类型,但在大多数情况下应谨慎使用这些类型,它们是比添加另一个 table.[=13= 更糟糕的选择]

  2. 具有 250 列的 table 将您的测验限制为最大选项数 - 确切地说是 250。
    如果您想再添加一个选项,则必须为其添加一列。
    当存储具有许多不同属性的实体时,宽 table 很有用,即使这样,也只有在用尽其他备选方案后才应考虑它们,因为它们通常是维护的噩梦。


话虽这么说,但在使用第一个规范化设计时需要考虑一些事项:

  1. 用户永远不会再看到相同的树条目 - 一个简单的解决方案是 select 一棵随机树,其中树 ID 不存在于投票 table 中,用户 ID 是获取查询 - 基本上是这样的(我使用 T-SQL 作为我的例子,你应该使用你选择的 RDBMS 支持的任何 SQL 方言,当然):
SELECT TOP 1 Id, Picture, Name -- return only one record
FROM Trees
WHERE NOT EXIST 
(
    SELECT 1
    FROM Votes
    WHERE Votes.TreeId = Trees.TreeId
    AND UserId = @UserId
)
ORDER BY NewID(); -- random order 
  1. 查看自己条目的投票统计 - 这可能可以在数据库级别使用聚合函数(例如 SUMCOUNT 等)来完成,可能不需要获取所有行并逐行计算此数据。