Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 问答系统的数据库结构_Database Design_Cloudkit - Fatal编程技术网

Database design 问答系统的数据库结构

Database design 问答系统的数据库结构,database-design,cloudkit,Database Design,Cloudkit,我正在构建一个测验系统,但我不确定如何在数据库方面构建它 假设测验系统是针对树木物种的。用户将收到一张树木图片(条目),并且必须从6个列表中选择正确的物种(5个随机,1个正确)。 测验中有250个物种 我需要解决的两个主要问题: 1) 用户不应再看到相同的树条目。 2) 树条目的所有者必须能够看到其条目上所有投票的统计信息:因此他将看到其他用户在其条目上输入的每个树种的投票数。因为用户会在投票中出错,所以条目所有者将看到这些错误的统计信息,以及条目被误认为是哪种不正确的物种 一种简单的方法是创建

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

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

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

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

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

  • 用户表
  • Trees表:具有用户表的外键。这是用户必须投票的项目。一个用户可以创建一个条目
  • 投票表:具有用户表和树表的外键。此表将保存每次投票,包括用户在该投票中选择的树种名称
所以要解决我的问题:

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

2) 请参阅自己条目上的投票统计信息:获取指向自己条目的所有投票,然后按所选树种计算统计信息

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

这种替代方法是否更好:

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

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


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

最好的方法肯定是您描述的第一个方法-有一个用户表、一个树表和一个投票表

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

  • 让一列存储多个数据点在99.999%的情况下是错误的,而在99.999%的情况下,当有人决定无论如何都要这样做时,这是以最糟糕的方式完成的-使用分隔字符串。
    每个数据库都有适当的数据类型来存储多个数据点,称为表。有些数据库还支持XML、Json或数组等类型,但应谨慎使用,因为大多数情况下,它们是比添加另一个表更糟糕的选择

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


  • 正如你所说的,在使用第一个规范化设计时要考虑的事情有:

  • 用户不应该再看到同一个树条目-一个简单的解决方案是选择一个随机树,其中树id不存在于投票表中,而用户id用于获取查询-基本上是这样的(我使用T-SQL作为示例,当然,您应该使用您选择的RDBMS支持的任何SQL方言):
  • 请参阅自己条目上的投票统计信息-这可能可以通过使用聚合函数来实现,例如数据库级别的
    SUM
    COUNT
    等,可能不需要获取所有行并逐行计算此数据

  • 有理由问,根据基本情况应该避免1。但是你应该参考一个出版的设计方法/教科书/参考书来证明,或者一个合理的答案只是用一个定制的教程重写一个&没有给出任何研究。此外,我们不能告诉任何人什么是工程中的“最佳”,除非他们对其进行了足够详细的定义,并提供了足够的相关细节,使所有人都能就估价达成一致。而且它在混乱中依赖于细节。即使可以这样做,这里的问题也太多了。然后你需要解释为什么你不能自己评估。谢谢你分享你的经验,非常感谢。很高兴帮助:-)
    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