问答系统的数据库结构
Posted
技术标签:
【中文标题】问答系统的数据库结构【英文标题】:Database structure of quiz system 【发布时间】:2020-06-05 09:48:51 【问题描述】:我正在构建一个测验系统,但我不确定如何在数据库端构建它。
假设测验系统是针对树种的。用户将看到一张树图片(一个条目),并且必须从 6 个列表中选择正确的物种(5 个随机,1 个正确)。 测验中有250种。
我需要解决的两个主要问题:
1) 用户不应再看到相同的树条目。 2) 树条目的所有者,必须能够查看其条目中所有投票的统计信息:因此他将看到其他用户在其条目中输入的每个树种的投票数。因为用户会在投票中出错,所以条目的所有者会看到这些错误的统计信息以及他的条目被误认为是哪个错误物种。
一个简单的方法是创建几个表:
用户表 树表:用户表的外键。这是用户必须投票的条目。一位用户可以创建一个条目。 投票表:用户表和树表都有外键。该表将保存每一个投票,包括用户在该投票中选择的树种名称。所以要解决我的问题:
1) 防止用户再次看到相同的条目:在获取“树”以呈现新树进行投票之前,运行第一个查询以获取该用户的所有“投票”以排除用户已经投票的“树” .
2) 查看自己条目的投票统计:获取指向自己条目的所有投票,然后按所选树种计算统计信息。
这种方法很简单,但困扰我的是必须为每张选票创建一个条目。可以有很多。我对数据库设计没有经验,所以不确定这是否是个问题。
这种替代方式会更好吗:
1) 跟踪已经投票的条目:在单个记录(每个用户)上,在单个字段中保存所有投票的 id,因此无需运行查询来预取每个投票条目,只需从单个记录中获取它们场地。不确定这是否可行,以及单个字段的限制大小是多少,可能会持有数千票,实际上是投票的条目的 ID。
2) 因此,条目的所有者可以查看条目统计信息:在每个树条目上,创建 250 列,每个树种一个,并根据投票的内容在每个列上增加一个 INT。因此,要获取每个条目的统计信息,只需获取一条记录并执行计算客户端即可。
最好的方法是什么?有没有应该避免的?
【问题讨论】:
问是有道理的,应该根据基础避免1。但是您应该参考已发布的设计方法/教科书/参考来证明其合理性,或者合理的答案只是用定制的教程重写一个并且没有给出任何研究。另外——我们不能告诉任何人什么是工程中的“最佳”,除非他们足够详细地定义它并提供足够的相关细节以使所有人都同意估值。而且它混乱地依赖于细节。即使可以做到这一点,这里的问题也太多了。然后你需要解释为什么你不能自己评估。 【参考方案1】:最好的方法肯定是您描述的第一个方法 - 为用户提供一个表格,为树木提供一个表格,为投票提供一个表格。
其他替代方案非常糟糕且无法扩展 - 按此顺序:
让一个列存储多个数据点在 99.999% 的情况下是错误的事情,而在 99.999% 的情况下,当有人决定这样做时,它是以最糟糕的方式完成的 - 使用一个分隔的字符串。 每个数据库都有适当的数据类型来存储多个数据点——它被称为表。一些数据库还支持 XML、Json 或数组等类型,但在大多数情况下应谨慎使用这些类型,它们是比添加另一个表更糟糕的选择。
拥有一个包含 250 列的表会将您的测验限制为最大选项数 - 准确地说是 250 个。 如果您想再添加一个选项,则必须为其添加一列。 宽表在存储具有许多不同属性的实体时很有用,即使这样,也应仅在用尽其他替代方案后才考虑使用它们,因为它们通常是维护的噩梦。
话虽如此,在使用第一个规范化设计时需要考虑一些事情:
-
用户不应该再看到相同的树条目 - 一个简单的解决方案是选择一棵随机树,其中树 ID 不存在于投票表中,而用户 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
-
查看自己条目的投票统计信息 - 这可能可以在数据库级别使用聚合函数(例如
SUM
、COUNT
等)来完成,可能不需要获取所有行并通过以下方式计算此数据行行。
【讨论】:
感谢您分享您的经验,非常感谢。 很高兴为您提供帮助 :-)以上是关于问答系统的数据库结构的主要内容,如果未能解决你的问题,请参考以下文章