在mysql中使用主键作为外键用于大表

时间:2012-12-12 14:38:41

标签: mysql

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

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

2 - 为“cats_details”的主键和“cats_details”中的另一列“cat_id”创建名为“id”(int auto increment)的列,作为“cats”表的外键。

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

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

2 个答案:

答案 0 :(得分:1)

您期望的可伸缩性数字是多少?你做过任何初步的容量规划吗?

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

除非您在表中查看数百万行,否则使用当前硬件并不重要 - 规范化就可以了。

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

答案 1 :(得分:0)

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