【问题标题】:using primary key as foreign key in mysql for big tables在mysql中使用主键作为大表的外键
【发布时间】:2012-11-30 07:00:07
【问题描述】:

我的 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”的主键创建一个名为“id”的列(int auto increment),并在“cats_details”中创建一个名为“cat_id”的列作为“cats”表的外键。

对于大量类别和大量访问者来说,哪种解决方案更快?

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您期望的可扩展性数字是多少?您是否进行了任何初步的容量规划?

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

    除非您正在查看表中的数百万行,否则使用当前的硬件并不重要 - 规范化很好。

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

    【讨论】:

    • 在我读过的一篇文章中:所有表都必须有一个自动递增的主键,尽管当您将它们用作另一个表的一部分并且外键必须是另一个列时。
    • 但是根据您的信息,我决定使用我的主键作为外键。因为我需要自己加入“猫”表(以获得每个类别的子类别),所以最好是低权重。您对此有何看法?
    • 对于获取子类别:自联接比嵌套查询(其中联接条件在 WHERE 子句中指定)更有效。您可以使用查询性能分析器来验证这一点。
    【解决方案2】:

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

    【讨论】:

    • 我知道规范化。及其级别(1,2,3,4,5,6)。但我的问题是“在mysql中使用主键作为外键是否正确,或者最好也有主键和外键”
    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多