2

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

4

4 回答 4

4

1NF是表示关系的表的方面,而不是表本身。

如果您的关系说ticket HAS price这是1NF违规行为,因为您无法通过查看单个记录来确定是 aticket HAS还是HAS NOTthe 。price您需要获取此票的所有价格并选择其中的最后一个,这违反non-ordering rule1NF.

如果您的关系说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就像您将整个表保存在数据库中一样。

于 2009-02-16T16:32:14.073 回答
2

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

于 2009-02-16T16:31:08.397 回答
2

这意味着如果要记录数据的某些排序(如按日期),则应明确记录它,例如在日期列中。错误的做法是仅将排序隐含在磁盘上行的物理顺序中(假设您无论如何都可以控制它)。换句话说,您必须按某个列排序才能按该顺序取回数据。

于 2009-02-16T17:56:55.757 回答
0

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

于 2009-02-16T16:27:50.930 回答