第一个正常形式表明行排序无关紧要。 这是否意味着日期作为密钥的一部分的表不是1NF? 例如 考虑一个股票价格表,其中日期/时间是PK的一部分。在这种情况下,您可以通过按日期排序数据并选择前1行来获得最后价格。 这是否意味着要实现1NF,您需要将表拆分为: 1)TickerCurrentPrice(每个股票代码1行) 2)TickerHistoricalPrice 感谢
答案 0 :(得分:5)
1NF
是表示关系的表格的一部分,而不是表格的表示。
如果您的关系显示为ticket HAS price
,那么这是1NF
违规,因为您无法确定ticket
HAS
或HAS NOT
price
通过查看单个记录。您需要获取此故障单上的所有价格并选择最后一个,这违反了non-ordering rule
的{{1}}。
如果您的关系显示为1NF
,那么它就在ticket HAD BEGUN TO COST price ON date
中,因为每条记录都说明了这一点:此 1NF
费用来自此 ticket
的 price
。
因此,我们说当代表第一个关系时,此表不符合date
,但当代表第二个关系时,该表符合<。 / p>
当然,桌子本身也是一样的。
虽然您需要拆分表格,但这并不意味着。
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
),就像您将整个表保留在数据库中一样。
答案 1 :(得分:2)
不,“选择......按...排序”不违反1NF。违反1NF的行(和列)排序更多地是关于“select * from XYZ;然后从左边的顶部和第四列中选择第三行”的情况。是的,我见过这样的数据库设计。
答案 2 :(得分:2)
意思是如果要记录数据的某些排序(例如按日期),则应该记录明确,例如在日期列中。什么是错误的是在磁盘上的行的物理顺序中只有隐式的顺序(假设你无论如何都可以控制它)。换句话说,您必须按某些列进行ORDER BY才能按顺序恢复数据。
答案 3 :(得分:0)
没有。这意味着没有内在的秩序。如果您想从表中获得最后价格的日期select max(date)
。