【发布时间】:2013-10-31 17:42:47
【问题描述】:
我已尝试创建规范化数据库,但无法以表格格式显示数据。
在下面的示例中,数据库用于按日期跟踪数字(在各种任意命名的类别中)。例如,用户可以跟踪每天有多少水果和蔬菜被送到他的杂货店。用户定义水果和蔬菜类别的名称,以及存在多少类别。以下是与此示例对应的表格:
tracker 表:
id | name
----+---------------------
1 | Grocery deliveries
2 | Sports cars
entries 表:
id | datetime | tracker_id
----+---------------------+------------
1 | 2013-10-01 00:00:00 | 1
2 | 2013-10-02 00:00:00 | 1
3 | 2013-10-03 00:00:00 | 1
values 表:
id | number | entry_id | category_id
----+--------+----------+-------------
1 | 10.0 | 1 | 1
3 | 20.0 | 1 | 2
5 | 21.0 | 1 | 3
7 | 18.0 | 2 | 2
8 | 4.0 | 3 | 1
9 | 9.0 | 3 | 2
还有一个category 表:
id | name | tracker_id
----+-----------------+------------
1 | Tomatoes | 1
2 | Carrots | 1
3 | Brussel sprouts | 1
4 | Ferraris | 2
我想为跟踪器 1 打印一个表格,每一行对应一个日期(没有重复的日期)。这些列将是:日期、第 1 类(西红柿)、第 2 类(胡萝卜)、第 3 类(球芽甘蓝)。如果在给定日期没有给定类别的值,它将为空或显示为 null。所以,理想情况下,它看起来像这样:
datetime | Tomatoes | Carrots | Brussel sprouts
---------------------+----------+---------+-----------------
2013-10-01 00:00:00 | 10.0 | 20.0 | 21.0
2013-10-02 00:00:00 | Null | 18.0 | Null
2013-10-03 00:00:00 | 4.0 | Null | 9.0
我不确定如何执行此操作,或者是否有更好的方法来存储这些数据。有什么建议吗?
当entries 和values 由一个表表示(条目是行,值是列)时,显示数据很容易。但在这种情况下,最大类别数受到我表中列数的限制。我更喜欢标准化方法如何允许每个“跟踪器”表示任意数量的类别。
【问题讨论】:
-
如果你想在查询中这样做,并且你事先不知道可能的列,你需要创建一个透视查询,这在标准 SQL 中是不可能的,但是一些 DBMS 支持.你知道它只是三列(西红柿、胡萝卜、球芽甘蓝)吗?
-
您的确切 RDBMS 是什么(SQL Flavor)?您知道设计时的列数及其标题吗?
-
@FabianBüttner 不,我希望每个“跟踪器”都有一组由用户定义的不同类别。类别的名称和数量将由用户定义。
-
@PM77-1 PostgreSQL。不,我不知道列数或其标题。我已经考虑将列数固定到某个最大值(比如 10 ......谁需要超过 10 个类别??)。但允许每个跟踪器任意数量的类别是理想的。
-
看看crosstab函数。
标签: sql database postgresql database-design normalization