2

好吧,我今天刚刚听说过,但我不明白。所以我不应该有带有日期列的事务表(因为同一天可能发生更多事务),但我应该有一个事务和一个日期列,其中一个日期对事务有一个 FK。那有什么意义,而不是日期,我将重复 FK。

一个例子:经纪人可以在任何日期进行交易。(交易则需要持有经纪人和日期信息)。

4

5 回答 5

1

标准化标量值(日期、数字等)通常是多余的。仅仅因为值重复并不意味着它们应该被规范化。只有与行的主键(例如地址)没有直接关系的重复值才应该是规范化的候选对象。

如果您想添加每个日期的不同表示形式(例如月份、季度等),而不必每次都进行数学运算,我可以看到标准化日期的唯一好处。否则,在我看来,drwabacks 超过了优势。

于 2013-11-14T17:37:21.140 回答
1

假设你的日期表就像我们数据仓库中的周期表,它的结构可能是这样的:

Field date, datatype date (not datetime) primary key
other fields include fiscal year and holiday information

那么您的事务表可能类似于以下内容:

broker_id, foreign key to broker
date, foreign key to date
transaction time
other fields as necessary

你的问题是,“有什么意义?”。这种数据库设计让您可以轻松回答诸如“给我经纪人 x 过去 5 个会计年度的统计数据,按会计期间细分”之类的问题

于 2013-11-14T17:34:27.583 回答
1

将日期属性移动到另一个表中并使其成为 Transaction 表中的外键与“规范化”无关。考虑示例关系:

T{TransactionId,Date}

和依赖

{TransactionId}->{Date}

如果 TransactionId 是键,则 T 已经满足第 6 范式。将 Date 移动到另一个表中,用另一个属性替换它和/或使其成为外键不会使 T 比它已经“更规范化”。

属性值是否“重复”与规范化无关。重要的是您要在数据库模式中满足的功能依赖关系和连接依赖关系。“重复数据”是一个有时非正式地用于描述函数依赖关系的短语,但如果说仅仅因为数据重复而需要分解,则过于简单化了。

于 2013-11-15T10:35:28.240 回答
1

查看:

http://en.wikipedia.org/wiki/Database_normalization#Normal_forms

交易日期无需标准化。

但是,想象一下 Transaction 与客户相关联,并且还必须保留客户详细信息 - 这是规范化有助于减少数据冗余的情况。

于 2013-11-14T17:14:10.020 回答
0

使用日期并不是一个理想的例子。考虑与每笔交易相关的客户记录,而不是客户记录。您希望在每个交易行中存储客户的 FK。您不想重复存储客户的姓名、地址、密码!

于 2013-11-14T17:26:17.373 回答