第一范式和时间数据

时间:2009-02-16 16:22:20

标签: database database-normalization

第一个正常形式表明行排序无关紧要。 这是否意味着日期作为密钥的一部分的表不是1NF? 例如 考虑一个股票价格表,其中日期/时间是PK的一部分。在这种情况下,您可以通过按日期排序数据并选择前1行来获得最后价格。 这是否意味着要实现1NF,您需要将表拆分为: 1)TickerCurrentPrice(每个股票代码1行) 2)TickerHistoricalPrice 感谢

4 个答案:

答案 0 :(得分:5)

1NF是表示关系的表格的一部分,而不是表格的表示。

如果您的关系显示为ticket HAS price,那么这是1NF违规,因为您无法确定ticket HASHAS NOT price通过查看单个记录。您需要获取此故障单上的所有价格并选择最后一个,这违反了non-ordering rule的{​​{1}}。

如果您的关系显示为1NF,那么它就在ticket HAD BEGUN TO COST price ON date中,因为每条记录都说明了这一点: 1NF费用来自 ticket price

因此,我们说当代表第一个关系时,此表不符合date,但当代表第二个关系时,该表符合<。 / p>

当然,桌子本身也是一样的。

虽然您需要拆分表格,但这并不意味着。

1NF的重点是您可以使用relational databases将一个关系转换为另一个关系。

根据relational operatorsrelation是多少?这是一张表格,显示所有组合所有可能的值,这些值在这种关系中属于他们自己。

例如,如果我们需要在RDBMS1的自然数上构建平等关系,我们就有了这个表:

5

此表中出现的所有对都是相等的关系;所有没有出现的对都不是。我们在这里看不到1 1 2 2 3 3 4 4 5 5 (2, 3),因为它们不相等。

但是您不需要将整个对保留在数据库中。您保留单个值并编写查询:

(4, 5)

,它会给你相同的结果。

实际上,普通表单允许您在数据库中保留最简单的关系表,并使用SELECT n1.number, n2.number FROM number n1, number n2 WHERE n1.number = n2.number 查询从它们构建更复杂的关系。

在您的情况下,如果您按以下方式编写查询(或定义视图):

SQL

,您从(SELECT ticket, price FROM mytable WHERE (ticket, date) IN ( SELECT ticket, MAX(date) FROM mytable GROUP BY ticket ) )获得关系(ticket HAS price),就像您将整个表保留在数据库中一样。

答案 1 :(得分:2)

不,“选择......按...排序”不违反1NF。违反1NF的行(和列)排序更多地是关于“select * from XYZ;然后从左边的顶部和第四列中选择第三行”的情况。是的,我见过这样的数据库设计。

答案 2 :(得分:2)

意思是如果要记录数据的某些排序(例如按日期),则应该记录明确,例如在日期列中。什么是错误的是在磁盘上的行的物理顺序中只有隐式的顺序(假设你无论如何都可以控制它)。换句话说,您必须按某些列进行ORDER BY才能按顺序恢复数据。

答案 3 :(得分:0)

没有。这意味着没有内在的秩序。如果您想从表中获得最后价格的日期select max(date)