如何从同一个表上的select语句的结果创建视图?

时间:2015-03-14 15:15:50

标签: mysql database-design

我有一个有三列的表。材料的id,它所属的族(有某种分组),测试的类型和测试的结果作为数字(1-4)。测试类型指向包含测试列表的表,结果是一个数字。我正在尝试创建一个查询/视图,如果合适的话,我可以得到一系列材料的结果,并且每个测试都有一个新列,单元格显示该系列中所有材料中该测试的平均值... < / p>

我在想,因为它是针对一个小项目而且我知道测试(不认为它们会改变但不确定)我可以将测试(它们中的6个)作为列中的列添加表而不是将其作为数据,但对我来说感觉不对。此外,将来可能会添加测试。同时,添加一个列并不难,我只需更改平均值代码就可以忽略特定值的值,这样我就可以在添加测试之前区分值。

那么我该如何去做呢?我这样做是不是一个好主意?

现在我所拥有的可能是为每对家庭/测试制作一个select语句,然后以某种方式创建一个视图(它是一个虚拟表),其中包含这些查询的结果。

所以如果表是

test_result
family_id | material_id | test_id | result

查询将是

SELECT AVG(result) AS 'TEST'
FROM test_result
WHERE family_id = 'family_id'
  AND test_id = 'test_id;

但是我不确定如何继续或者是否有更好的方法而不是这样做6次并以某种方式结合结果

1 个答案:

答案 0 :(得分:1)

我不确定您对数据库设计了解多少。

您要问的问题是,在一个表中有6列test_id而另一个表有family_id和test_id作为主键(唯一标识符)是关于数据库设计的基本列。它与第一范式有关。如果你选择的话,你可以一般地研究第一范式和数据标准化。

对于这种情况,这是一个过于简化的版本。

在一个表格方法中,六列有两个大问题。

首先是:当他们改变主意并添加第七次测试时会发生什么?如果这种情况从未发生过,一切都很好。但如果没有,则必须通过添加另一列来更改表,并且必须更改引用该表的任何查询。如果您的案例中只有一个查询,则可以对其进行管理。如果有数百个查询可能引用该表,而其中一些查询可能需要维护周期来修改查询,那么这可能是一场噩梦。这就是为什么数据库教程中充满了您可能不需要学习的材料,如果这个小项目是您唯一的项目。

第二个是这样的:当你必须编写一个必须查找每次出现testid = 4的查询时会发生什么,无论该值存储在六列中的哪一列?您将不得不在WHERE子句中编写带有五个OR运算符的查询。这很乏味,容易出错,并且运行缓慢。同样,这可能永远不会成为问题。

通常更好的方法是创建第三个表,其中family_id和test_id为列,可能会产生第三列(我不确定material_id是什么......是否有材质表?)

第一个表,系列,具有family_id和任何仅依赖于family的数据,如family_name。

第二个表,tests,包含test_id和任何仅依赖于测试的数据,如test_name。

第三个表包含依赖于两者的数据。

然后编写一个将所有三个表连接在一起的视图,使其看起来像你想要的那样。

如果这涵盖了你已经知道的许多概念,我道歉。再一次,我无法从你的问题中说出来。