我无法将RSS Feed中的数据规范化为数据库。
每封帖子都有id
和categories
。
我遇到的问题是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 |
+----+--------+----------+
posts
表id
将引用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 |
+----+--------+----------+----------+----------+-----+
1
代表当前和代表缺席的0
,id
表格中的posts
引用id
。该方法不会有任何重复数据。但是,博客中的类别可以随意创建,因此很难维护这样的表格,因为每当有新类别时我都需要更新它。
如何将数据库放入3NF,消除重复,同时保持其可维护性?
答案 0 :(得分:0)
TL; DR “重复数据”是一个bugbear。了解设计和规范化。从行/表开始,使明确关于任意情况的相关陈述。到目前为止,您只需要:
-- [id] identifies a post with ...
Post(id, ...)
-- post [id] is tagged [name]
Post_Category(id, name)
有重复的数据,这是不好的
您认为“重复数据”究竟是什么?为什么你认为它“不好”?
将相同的值多次显示为行的列或行的列的一部分值没有任何本质上的错误。重要的是表格中的行是否以某种方式说明情况重叠。
规范化通过连接它的投影来替换表。这意味着它会替换行所说的表(即谓词)“一些东西和其他东西”关于列值的表格“一些东西”和“其他东西”分开。在这样的行/表中含有“AND”并不总是坏的。当只有一个AND时,规范化表示在没有共享列集总是在两个表中的任何一个表中保存唯一值集时,分解为特定的一对表。
将所有类别放在一个表中
虽然没有任何关于这样的设计会导致规范化分解它,但你的最后一个表是一个“坏”的设计。 (有时这种具有重复相似列的设计被认为违反了“1NF”或“规范化”的概念,但这是一种误解。)例如它的行说“(post [id]被标记'飞'和[飞行] ] = 1或帖子[id]没有标记为'flying'且[flying] = 0)AND(post [id]标记为'游泳'且[游泳] = 1或帖子[id]未标记为'游泳'AND [游泳] = 0)AND ...“而当我们可以只有一个表Post_Category,其中的行说”post [id]被标记为[name]“。例如,我们不能在不明确提及所有类别的情况下编写询问所有类别的查询。例如,如果我们添加一个新类别,那么我们必须在表中添加一个新列,然后如果我们想要我们过去的查询,则所有类别都意味着相同的事情,那么我们必须添加新列仍然是指所有类别。 / p>
PS目前尚不清楚为什么要介绍ID。我们有理由这样做,但您应该 这样做。 (规范化不会引入ID。)例如,如果帖子不能被我们想要记录的其他信息唯一识别,则引入帖子ID。