2012-12-12 96 views
0

我在我的名为“cats”的mysql中有一个表,这个表有'cat_id','cat_parent','cat_name',并且我决定让另一个名为“cats_details “,它有'cat_id','cat_description','cat_keywords'等,因为我的类别可以嵌套(每个主类别可以有无限数量的子类别,每个子类别可以有无限数量的子子类别.. .. 。)和类别的数量可能会超过1000.我需要列在一些页面:P。所以我认为最好的办法是有两个表格,一个用于列出类别并搜索其名称,另一个用于获取有关类别的详细信息。所以我的问题是这种情况的最佳方式是什么?使用主键作为MySQL的大表中的外键

1-使用“cats_details”的“cat_id”作为自己的主键和“cats”表的外键。

2-做一个命名为“cats_details”和“cats_details”作为“猫”表的外键的另一列“CAT_ID”的主键“ID”(INT自动递增)列。

对于大量的类别和大量的访问者,这种解决方案的速度会更快吗?

注意:我只在类别详细信息页面中使用JOIN,而不在列表页面中使用JOIN。

回答

1

你期望什么样的可扩展性数字?你有没有做过任何初步的容量规划?

非规范化通过创建冗余数据来优化数据库的读取,但如果不是统一应用于数据库中数据的所有冗余副本,则插入或删除操作可能会导致数据不一致(因此,维护数据一致性现在存在一些维护开销应用程序的工作)。

除非您正在查看表中的数百万行,使用当前硬件无关紧要 - 规范化没有问题。

我假设cat_id是一个int或Guid。主键将是聚簇索引并使读取更快,因此选项1将导致更快的读取。由于主要通过主键读取/连接,选项2效率较低,因为选项2中的cat_id很可能是非聚集索引(尽管在这种情况下插入/删除操作会更快)。

+0

在一篇文章中我读过:所有表都必须有一个自动递增主键,尽管当你使用它们作为另一个表的一部分,并且外键必须是另一个列。 – IVIR3zaM

+0

但您的信息我决定使用我的主键作为外键。因为我需要加入“猫”表本身(为了获得每个类别的儿童类别),所以它更好地是重量轻。你对此有何看法? – IVIR3zaM

+1

获取子类别:自联接比嵌套查询(在WHERE子句中指定连接条件)更有效。您可以使用查询性能分析器来验证这一点。 – fjxx

0

也许你应该看看表的规范化。这应该可以解决你的问题。一个很好的链接可能是这个:http://www.troubleshooters.com/littstip/ltnorm.html,但任何谷歌搜索表格规范化应该可以帮助你...

+2

我知道正常化。及其级别(1,2,3,4,5,6)。但我的问题是“是正确的使用主键作为外键在MySQL或它最好也有一个主键和一个外键” – IVIR3zaM