存储多个类别的数据?

时间:2015-02-05 08:08:53

标签: mysql

快速提问我想我知道答案,但在我的脑海中有一个声音在问,"为什么不这样做?!"

所以我正在做一些事情(比其他任何事情更有趣)我需要存储相关项目的列表,比如球的列表,块列表,鱼列表......依此类推,每个项目都有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 =#'?

更好的方法

我知道它会以任何方式工作,但这样做的正确/标准方式是什么?

我认为第一种方式的原因是因为所有项目都具有相同的字段,所以也可以使用相同的表格。但是,我错了吗?

2 个答案:

答案 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有用。