测验系统的数据库结构

问题描述 投票:-1回答:1

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

假设测验系统是针对树木的。将向用户显示一棵树图片(一个条目),并且必须从6种列表中选择正确的物种(5种随机,1种正确)。测验中有250种。

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

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

一种简单的方法是创建多个表:

  • 用户表
  • 树表:使用用户表的外键。这是用户必须投票的条目。一个用户可以创建一个条目。
  • 投票表:同时具有用户表和树表的外键。该表将保存每个投票,包括用户在该投票上选择的树种名称。

因此解决了我的问题:

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

2)查看自己条目的投票统计信息:获取指向自己条目的所有投票,然后根据所选树种计算统计信息。

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

这种替代方法会更好吗:

1)要跟踪已投票的条目:在一条记录(每位用户)上,将一个字段包含所有投票的ID,因此,无需运行查询来预取每个投票条目,只需从单个字段中获取它们即可。 。不知道这是否可行,并且单个字段的限制大小是多少,该字段可能拥有数千个投票,而实际上是已投票的条目的ID。

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

最佳方法是什么?是否有应避免的一种?

database-design cloudkit
1个回答
0
投票

最佳方法肯定是您所描述的第一个方法-为用户提供一张桌子,为树木提供一张桌子,并为一张投票提供一张桌子。

其他选择是可怕的和不可扩展的-按此顺序:

  1. 让单个列存储多个数据点是在99.999%的情况下做错事,在99.999%的情况下无论如何决定做错事,都是以最糟糕的方式完成的-使用定界符串。每个数据库都有适当的数据类型来存储多个数据点-称为表。一些数据库还支持XML,Json或数组之类的类型,但是在大多数情况下应谨慎使用,与添加另一个表相比,它们是最差的选择。

  2. 拥有250列的表格会将您的测验限制为最大数量的选项-确切地说是250个。如果要添加更多选项,则必须在其中添加一列。宽表在存储具有许多不同属性的实体时很有用,即使如此,也应仅在用完其他替代方案后才考虑使用它们,因为它们通常是维护的噩梦。


话虽这么说,您应该考虑使用第一个规范化设计的方式:

  1. 用户永远不会再看到相同的树条目-一种简单的解决方案是选择一个随机树,其中树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 
  1. 请参阅本条目的投票统计信息-这很可能可以使用数据库级别的汇总功能(例如SUMCOUNT等”来完成,可能不需要获取所有行并逐行计算该数据。
© www.soinside.com 2019 - 2024. All rights reserved.