快速提问我想我知道答案,但在我的脑海中有一个声音在问,"为什么不这样做?!"
所以我正在做一些事情(比其他任何事情更有趣)我需要存储相关项目的列表,比如球的列表,块列表,鱼列表......依此类推,每个项目都有ID,NAME,DETAIL(可能是图像的路径)。
他们最初假设我应该这样做是有两张桌子的。
一个像这样的类别表:
CAT_ID | CAT_NAME
1 | BALLS
2 | BLOCKS
3 | FISH
所有项目的表格,其中CAT_ID与上表中的ID相关。
ITEM_ID | ITEM_CAT_ID | ITEM_NAME | ITEM_DETAIL
1 | 1 | Soccer Ball | A ball used in the game of Soccer
2 | 1 | Rugby Ball | A ball used in the game of Rugby
3 | 3 | Trout | A fresh-water fish
等等......但我想知道,这是一种比为每个类别制作表格并从该表格中选择而不是“CAT_ID =#'?
更好的方法我知道它会以任何方式工作,但这样做的正确/标准方式是什么?
我认为第一种方式的原因是因为所有项目都具有相同的字段,所以也可以使用相同的表格。但是,我错了吗?
答案 0 :(得分:1)
如果你只有几个类别并且你完全了解它们,那么你可以在每张桌子上放一个。但如果你认为,博客的类别:它们可能是数百个,最重要的是你不知道它们是什么。所以你被迫使用两个表和外键
答案 1 :(得分:1)
你在这里没事。需要注意的主要事项是,通过将类别放在自己的表中,您可以帮助避免插入和删除异常。假设你的桌子是这样的:
ITEM_ID | ITEM_CAT | ITEM_NAME | ITEM_DETAIL
1 | Balls | Soccer Ball | A ball used in the game of Soccer
2 | Balls | Rugby Ball | A ball used in the game of Rugby
3 | Fish | Trout | A fresh-water fish
突然间,我没有现有blocks
类别的记录,直到我添加一个具有该类别的项目我才会记录。同样,我可以输入拼写错误并将第2项更改为'blals',现在如果我查询所有类别为balls
的项目,我将无法获得正确的值。我相信你可以看到其他可能的异常情况。
就规范化而言,在此特定示例中,在一个表中使用cat_name而不是cat_id仍然至少处于第三范式,因为每个非键列都取决于键。但是,您可能会出现要保留类别说明的情况。在一个表格中,您将拥有:
item_id | cat_name | cat_description | item_name | item_detail
现在你有一个传递函数依赖项,item_id - > cat_name和cat_name - > cat_description。由于传递函数依赖性,此表仅为第二范式。
如果您不熟悉各种常规表格,我实际上在学习它时会发现Wikipedia有用。