第一个正常形式表明行排序无关紧要.这是否意味着日期作为密钥的一部分的表不是1NF?例如,考虑一个股票价格表,其中日期/时间是PK的一部分.在这种情况下,您可以通过按日期排序数据并选择前1行来获得最后价格.这是否意味着要实现1NF,您需要将表拆分为:1)TickerCurrentPrice(每个股票代码1行)2)TickerHistoricalPrice谢谢
1NF
表示关系的表的一个方面,而不是表的表示.
如果你的关系说ticket HAS price
,这是一个1NF
违规行为,因为你不能,如果确定ticket
HAS
或HAS NOT
在price
通过查看上一条记录.您需要获取此故障单上的所有价格并选择最后一个,这违反了该故障non-ordering rule
单1NF
.
如果你的关系说ticket HAD BEGUN TO COST price ON date
,那么它在1NF
所有的权利,因为每个记录说,它说:这个 ticket
费用该 price
由这个 date
.
因此,我们说这个表不遵守1NF
时表示第一关系,但是当它符合代表第二个.
当然,桌子本身保持不变.
虽然您需要拆分表,但这并不意味着什么.
重点relational databases
是您可以使用relational operators
将一个关系转换为另一个关系.
什么是relation
中的条款RDBMS
?这是一张表格,显示了他们之间这种关系中所有可能值的所有组合.
举例来说,如果我们需要构建从自然数相等关系1
到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
从(ticket HAD BEGUN TO COST price ON date
)获得relation(),就像你将整个表保存在数据库中一样.