【问题标题】:Database schema design and foreign keys in MySQLMySQL中的数据库模式设计和外键
【发布时间】:2011-10-10 14:28:27
【问题描述】:

我正在尝试为允许回复 cmets 的博客创建规范化数据库。鉴于我找到的一些答案,我似乎需要查看邻接表模型和修改后的预序树遍历算法。但是,在reading 稍微了解了一下之后,我还没有找到使用外键来强制数据完整性的示例。可以做到吗?

在这种情况下,您推荐哪种数据库设计?理想情况下,我希望能够消除父注释,并且通过使用 PK-FK 关系(PK = 主键,FK = 外键)也能够消除所有子 cmets,以避免在表。

更新:作为澄清,我还想知道允许回复 cmets 的博客中使用了哪种数据库设计(即回复评论的 cmets 回复原始线程)。

【问题讨论】:

    标签: mysql database schema foreign-keys primary-key


    【解决方案1】:

    是的,MySQL 支持外键和级联删除作为其数据库存储引擎的一部分。您将需要使用非默认的 InnoDB。更改存储引擎非常简单,甚至可以在创建表之后完成。

    MySQL 官方文档:

    http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

    改动:

    ALTER TABLE table1 ENGINE=InnoDB;

    使用 InnoDB 引擎与使用 MyISAM 引擎(MySQL 存储引擎默认)还有其他优点和缺点。因此,在将其投入生产环境之前,您应该仔细研究这两者。 MyISAM 不支持外键。

    【讨论】:

    • MyISAM 也不支持多列索引(尽管它允许您将多于 1 列设置为键),即使表很大,从崩溃中恢复也可能需要数小时到数天,崩溃后表损坏,没有事务,表级锁定,没有多版本并发控制和无数其他东西。
    【解决方案2】:

    Reddits 源代码在 Github 上开源,看看他们是如何做到的......

    【讨论】:

    • 嗯,有趣...我会这样做的。
    • 哦,哦... reddit 使用 Cassandra :-(,虽然这种建议可能很有帮助。
    【解决方案3】:

    除非您使用级联删除(不推荐),否则您需要从上到下遍历树,然后从底部开始删除节点。您可以在应用程序层或数据库层(即在存储过程中)执行此遍历,但无论哪种方式,所有删除都应滚动到数据库事务中。

    我还没有找到使用外键来强制数据完整性的示例。可以做到吗?

    我不清楚你在这里问什么。整个模型在很大程度上依赖于 PK/FK 关系(评论与其父级之间)。您链接的文章没有这么明确(我可以看到),但 title 列将是 PK,而 parent 列将是 FK。

    【讨论】:

    • 实际上,我认为我需要使用级联删除。为什么不推荐?。 W.r.t.依赖PK/FK关系的模型,你是对的,但是如果一个父母可以有很多孩子,当你消除一个父母(这是一个PK)时,它的孩子将从那个表中删除,但我想知道是什么样的数据库设计将允许从另一个表(可能是“cmets”表)中删除这些子项,但这将使用级联删除。鉴于不推荐,通过PHP查询删除那些孤儿行不行?
    • Re: 对数据库进行级联删除——对该主题进行一些搜索。我通常不使用它们,但您的场景可能很简单,它们不会引起问题。我认为,如果您想要纯真实的 cmets 嵌套,则需要一个邻接表。我能想到的唯一其他选择是“嵌套集”模型(有些人喜欢它——我个人讨厌它)。我仍然不确定我是否清楚您的 Pk/FK 问题。
    • 感谢您的回复。好吧,我会看看那个。至于 PK/FK 问题,基本上我是在问,当您删除父评论时,什么样的数据库模式将允许保持数据完整性,因为例如,邻接模型提供了一个模型来对表的元素进行分层排序并检索它们但对于具有“回复 cmets”功能的博客而言,仅靠其本身是不够的。
    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2011-05-10
    • 2012-08-10
    • 2014-06-02
    相关资源
    最近更新 更多