第一个范式表示行排序无关紧要。这是否意味着以日期作为键的一部分的表不是 1NF?例如,考虑一个股票价格表,其中日期/时间是 PK 的一部分。在这种情况下,您可以通过按日期对数据进行排序并选择前 1 行来获得最新价格。这是否意味着要实现 1NF,您需要将表拆分为:1)TickerCurrentPrice(每个股票代码 1 行)2)TickerHistoricalPrice 谢谢
4 回答
1NF
是表示关系的表的方面,而不是表本身。
如果您的关系说ticket HAS price
这是1NF
违规行为,因为您无法通过查看单个记录来确定是 aticket
HAS
还是HAS NOT
the 。price
您需要获取此票的所有价格并选择其中的最后一个,这违反non-ordering rule
了1NF
.
如果您的关系说ticket HAD BEGUN TO COST price ON date
,那1NF
没关系,因为每条记录都说明了它所说的内容:this ticket
cost this price
from this 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
就像您将整个表保存在数据库中一样。
不,“选择...按...排序”不违反 1NF。违反 1NF 的行(和列)排序更多地是关于“从 XYZ 中选择 *;然后从顶部选择第三行,从左起第四列”的情况。是的,我见过这样的数据库设计。
这意味着如果要记录数据的某些排序(如按日期),则应明确记录它,例如在日期列中。错误的做法是仅将排序隐含在磁盘上行的物理顺序中(假设您无论如何都可以控制它)。换句话说,您必须按某个列排序才能按该顺序取回数据。
不,这意味着没有内在的秩序。如果您想要最后价格的日期,您必须select max(date)
从您的表格中获取。