【问题标题】:Organizing & normalising RSS Feed categories data组织和规范 RSS Feed 类别数据
【发布时间】:2017-09-19 23:13:24
【问题描述】:

我无法将 RSS 提要中的数据标准化到数据库中。

每个帖子都有idcategories

我遇到的问题是categories 是一个未预定义大小的列表。通过 1NF,我应该拆分一个列表,以便每列只有原子数据:

+----+----------+
| id |   name   |
+----+----------+
|  1 | flying   |
|  2 | swimming |
|  3 | throwing |
|  4 | sleeping |
|  5 | etc      |
+----+----------+

但是,博客文章可以标记多个类别。这意味着posts 表可以有一个已标记类别的 id 列表。

或者,categories 表可以有两个 id:

+----+--------+----------+
| id | postId |   name   |
+----+--------+----------+
|  1 |      1 | flying   |
|  2 |      1 | swimming |
|  3 |      1 | throwing |
|  4 |      2 | flying   |
|  5 |      2 | swimming |
|  6 |      2 | etc      |
+----+--------+----------+

postsid 将引用postId 列。但是有重复的数据,不好。

最后,我想到的另一种方法是将所有类别放在一个表中:

+----+--------+----------+----------+----------+-----+
| id | flying | swimming | throwing | sleeping | etc |
+----+--------+----------+----------+----------+-----+
|  1 |      1 |        1 |        1 |        1 |   1 |
|  2 |      0 |        1 |        0 |        0 |   0 |
|  3 |      1 |        1 |        0 |        0 |   1 |
|  4 |      0 |        0 |        1 |        1 |   1 |
+----+--------+----------+----------+----------+-----+

1s 代表出席,0s 代表出席,posts 表中的 id 引用 id。这种方法不会有任何重复的数据。但是,博客中的类别可以随意创建,因此很难维护这样的表,因为每次有新类别时我都需要更新它。

如何将我的数据库置于 3NF 中,在保持可维护性的同时消除重复?

【问题讨论】:

  • 您没有清楚地解释您的表格。另外,您不是说“备用类别表” postId 引用 Posts 表ID,反之亦然;最后一个表 id 引用 Posts 表 id,反之亦然? (也许两者中的行与 Posts 中的行是 1:1 的?)(“参考”的意思是“只能有出现在的值”。)请: 1. 给每个表一个唯一的名称。 2. 举一个 Posts 表的例子。 3.在正确的方向使用“参考”。 4. 根据我的回答,对于每个表给出谓词(按列参数化的句子模板),该谓词由其中的行构成一个真实的语句

标签: sql database-design rss rdbms database-normalization


【解决方案1】:

TL;DR“重复数据”是个问题。了解设计和规范化。从能够明确说明任意情况的直接相关陈述的行/表开始。到目前为止,您只需要:

-- [id] identifies a post with ...
Post(id, ...)
-- post [id] is tagged [name]
Post_Category(id, name)

有重复数据,不好

您认为“重复数据”到底是什么?为什么你认为它“不好”?

将相同的值作为一行的一列或某一行的一列的值的一部分多次出现在本质上并没有什么坏处。重要的是表格中的行是否以某种方式表达了有关情况的重叠内容。

规范化通过连接回它的投影来替换表。这意味着它用行说的表替换了行说(即有谓词)“some stuff AND other stuff”关于列值的表“一些东西”和“其他东西”分开。在这样的行/表含义中使用“AND”并不总是坏事。当只有一个 AND 时,规范化表示在没有共享列集始终在两个表中的任何一个中包含一组唯一值时分解为特定的一对表。

将所有类别放在一个表中

尽管这样的设计不会导致规范化分解它,但您的最后一张表是一个“糟糕”的设计。 (有时这种具有重复相似列的设计被认为违反了“1NF”或“规范化”的某些概念,但这是一种误解。)例如,它的行说“(post [id]被标记为'flying'和[flying ] = 1 或帖子 [id] 未标记为“飞行”且 [飞行] = 0)且(帖子 [id] 已标记为“游泳”且 [游泳] = 1 或帖子 [id] 未标记为“游泳”且[swimming] = 0) AND ..." 而我们可以只创建一个 Post_Category 表,其中的行显示“post [id] is tagged [name]”。例如,我们不能在不明确提及所有类别的情况下编写询问所有类别的查询。例如,如果我们添加一个新类别,那么我们必须向表中添加一个新列,然后如果我们希望我们过去的查询对所有类别都具有相同的含义,那么我们必须添加新列以仍然引用所有类别。

PS 不清楚您为什么要引入 id。我们这样做是有原因的,但您应该这样做是有原因的。 (规范化不引入 id。)例如,如果帖子不能被我们想要记录的其他信息唯一标识,则引入帖子 id。

【讨论】:

  • 你能改写你的答案并在第二部分解释你的例子吗?我应该怎么做?
  • 查看我编辑的帖子。我的谓词中有一些错误,但我只是删除了那个(无关紧要的)部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
相关资源
最近更新 更多