消除数据库中重复数据的距离是多远?

时间:2012-12-16 16:22:03

标签: database database-normalization

消除数据库中重复数据的距离是多远?因为你可以去OTT,它会变得疯狂。让我举个例子......

如果我要创建一个Zoo数据库,其中包含一个表'Animal',其中包含'name','species'和'country_of_birth'

但是那里会有重复数据,因为许多动物可能来自同一个国家,例如可能有很多老虎。

所以真的应该有'Species'表和'Country_of_birth'表 但过了一会儿你会有很多桌子 那你走了多远?

在这个问题中,我只是以一张桌子为例。 Animal表中的一行存储有关动物园中单个动物的信息。这样动物的名字,种类和出生国家,以及独特的动物ID。

3 个答案:

答案 0 :(得分:1)

  

但是那里会有重复的数据,因为很多动物都可以来自   例如,同一个国家可能会有很多老虎。

这表明你想要追踪个体动物,而不仅仅是动物。让我们假设动物园使用某种数字纹身或微芯片来识别个体动物。

假设此样本数据具有代表性。 (不是,但教学没问题。)

Animals
Predicate: Animal having microchip <chip_num> of species <species> 
           has name <name> and was born in <birth_country_code>.

chip_num  name       species          birth_country_code
--
101234    Anita      Panthera tigris  USA
101235    Bella      Panthera tigris  USA
101236    Calla      Panthera tigris  USA
101237    Dingo      Canis lupus      CAN
101238    Exeter     Canis lupus      CAN
101239    Bella      Canis lupus      USA
101240    Bella      Canis lupus      CAN

该表中没有冗余数据。如果不彻底改变该表的含义,则不能删除这些列。它有一个候选键:chip_num。它在5NF。

在非键列中重复值。那是种类非密钥(非素数)列的定义。键列(或键列集)中的值是唯一的;非键列中的值不是。

如果要将“birth_country_code”中的值限制为有效的三字母ISO国家/地区代码,可以添加有效的三字母ISO国家/地区代码表,并设置外键参考它。这通常是Good Thing,但它与与规范化有关。

iso_country_code
--
CAN      
USA

你可以为“物种”做同样的事情。这通常也是一件好事,而且它也可能没有与规范化有关。

答案 1 :(得分:0)

首先,您决定该表应包含 的信息。在你的例子中。关于个体动物的表格?或者它是关于动物的种类和每种物种的数量?你有出生国的事实可能表明某人希望它成为前者。如果是这种情况,您必须有一个识别个体动物的钥匙。您有一个与个人相关联的属性(属性),因此每行必须(应该?)代表个人。您应该阅读有关Identity和Individualuation的数据库建模概念的Here

为了正确地执行此操作,实际上,您为数据模型中的 每个 事物执行此操作,然后将该模型转换为数据库表。

答案 2 :(得分:0)

归结为决定对您的系统重要的是什么

决定某事物(例如“出生国”)是否只是一个属性,或者本身就是一个完整的实体,取决于您的系统需要了解的有关国家的其他信息以及您的系统可以跟踪的属性数量在功能上完全依赖于国家。

您还应该考虑您的属性是否容易更新异常。如果您在动物表中的国家声明采用该国家的完整正式名称的形式,那么,如果“比利时刚果”突然变成“刚果民主共和国”,那么您可能会面临风险 - < em>哦等等,已经发生了!

规范化的规则并不神圣不可侵犯。它们是非常有用的经验法则,旨在让您在大多数情况下避免麻烦。尽管如此,规则仍然被打破 - 但你应该只是故意破坏它们并仔细考虑后果的理解。