所以我正在做一个任务,我在维基百科上获取一个包含多个列(例如电影名称、类型、演员、情节等)的大量电影列表(30,000 多部)并将其上传到 Elasticsearch。但是,在这样做之后,我现在想使表格至少处于 1NF 中。我在数据库设计方面并没有真正的经验,我最后一次用 Normal Form 做任何事情是在几年前。所以我看着这张表并在想,我怎么能把它放到 1NF 中。例如,如果只有 1 列具有多个值,这很容易,但是当有多个具有多个值的列时,您会怎么做,如下所示。
电影名称 | 导向器 | 投掷 | 类型 | 维基页面 | 阴谋 |
---|---|---|---|---|---|
Chimmie Fadden Out West | 塞西尔·B·德米尔 | 维克多·摩尔 | 喜剧、西部 | https://en.wikipedia.org/wiki/Chimme_Fadden_Out_West | Chimmie被派往西部... |
海底两万里 | 斯图尔特·佩顿 | 路易斯·亚历山大、柯蒂斯·本顿、华莱士·克拉克、艾伦·霍鲁巴 | 动作、冒险 | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | 一个奇怪的... |
猫和金丝雀 | 保罗·莱尼 | 劳拉·拉普兰特、福雷斯特·斯坦利、克赖顿·黑尔 | 喜剧,恐怖,悬疑 | https://en.wikipedia.org/wiki/The_Cat_and_the_Canary_(1927_film)| 在一个... |
难道你只需要做这样的事情......
电影名称 | 导向器 | 投掷 | 类型 | 维基页面 | 阴谋 |
---|---|---|---|---|---|
Chimmie Fadden Out West | 塞西尔·B·德米尔 | 维克多·摩尔 | 喜剧 | https://en.wikipedia.org/wiki/Chimme_Fadden_Out_West | Chimmie被派往西部... |
Chimmie Fadden Out West | 塞西尔·B·德米尔 | 维克多·摩尔 | 西 | https://en.wikipedia.org/wiki/Chimme_Fadden_Out_West | Chimmie被派往西部... |
海底两万里 | 斯图尔特·佩顿 | 路易斯·亚历山大 | 行动 | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | 一个奇怪的... |
海底两万里 | 斯图尔特·佩顿 | 路易斯·亚历山大 | 冒险 | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | 一个奇怪的... |
海底两万里 | 斯图尔特·佩顿 | 柯蒂斯·本顿 | 行动 | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | 一个奇怪的... |
海底两万里 | 斯图尔特·佩顿 | 柯蒂斯·本顿 | 冒险 | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | 一个奇怪的... |
海底两万里 | 斯图尔特·佩顿 | 华莱士克拉克 | 冒险 | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | 一个奇怪的... |
海底两万里 | 斯图尔特·佩顿 | 华莱士克拉克 | 行动 | https://en.wikipedia.org/wiki/20,000_Leagues_Under_the_Sea_(1916_film) | 一个奇怪的... |
ETC?在将具有多个具有多个值的单元格的表格转换为 1NF 时,我肯定会遗漏一些非常简单的东西,但我不确定是什么。
谢谢。
规范化是从表中删除信息,这些信息被多次重复,并且作为 int 的 id 比任何文本都小。
您需要的桥梁表,因为您在电影和用户(演员、导演、音乐家......)之间有一个:n 关系
职业在我看来是电影与用户关系的一种属性
随着您进一步开发,如果您发现更多此类冗余信息,您可以添加更多属性或表格
因此,当有多个字段时,实际上很容易标准化,其中一些字段在同一行的单个字段中具有不同数量的数据点。只需遵循此规则:在同一行的列中具有多个数据点的任何列都应该成为它自己的表。因此,在您的示例中,可能是
Cast
andGenre
。很明显,这两列表示多对多关系,因为在同一行的单个列中存储了多个值。正如 nbk 提到的,您需要一个链接/桥接表来存储该多对多关系。因此,虽然您的新
Cast
表可能有CastId
(primary key)、FirstName
和等列LastName
,但您在and之间的链接表将被命名为类似并且具有带有外键引用的字段(来自您的表),并且它也将具有带有表的外键引用。然后,该链接表中的每一行都将代表一个特定的个人。Cast
Film
FilmCast
FilmId
Film
CastId
Cast
FilmCast
Cast
Film
您将为
Films
表中的每一列重复相同的意识形态,每行有多个数据点。一旦您为每个规范化列提供了适当的表,您就无需再将这些数据存储在主Film
表中,并且可以从中删除这些列。