1

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

如果我要创建一个包含表“动物”的动物园数据库,该表具有“名称”、“物种”和“国家出生”

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

所以真的应该有一个'Species'表和一个'Country_of_birth'表但是过了一段时间你会有很多表那么你走多远?

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

4

3 回答 3

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 国家代码表,并为其设置外键引用。这通常是一件好事,但它与规范化无关。

iso_country_code
--
CAN      
USA

你可以对“物种”再次做同样的事情。这通常也是一件好事,而且它也与规范化无关。

于 2012-12-19T05:29:34.320 回答
0

首先,您决定表应该包含什么信息。在你的例子中。是关于个别动物的表吗?或者是关于动物的种类以及每个种类有多少?您有出生国家这一事实可能表明有人希望它是前者。如果是这种情况,您必须有一个识别单个动物的密钥。您有一个与个体相关联的属性(属性),因此每一行必须(应该?)代表一个个体。您应该在此处阅读有关身份和个性化的数据库建模概念的信息。

实际上,要正确执行此操作,您需要对数据模型中的每一件事都执行此操作,然后将该模型转换为数据库表。

于 2012-12-16T16:38:24.203 回答
0

它归结为决定什么对您的系统很重要。

决定某事物(例如“出生国”)仅仅是一个属性还是本身就是一个成熟的实体,这取决于您的系统还需要了解有关国家/地区的其他信息,以及您的系统可以跟踪的完全属性在功能上依赖于国家。

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

规范化规则并非神圣不可侵犯。它们是非常有用的经验法则,旨在让您在大多数情况下远离麻烦。尽管如此,规则是要被打破的——但你应该只在知情的情况下打破它们,并仔细考虑后果。

于 2012-12-16T17:14:35.863 回答