【问题标题】:MySQL relationships & constraints, should I use them?MySQL关系和约束,我应该使用它们吗?
【发布时间】:2011-07-04 02:33:17
【问题描述】:

我在 MySQL 中构建了一个大型数据库,并使用 SQLYog 创建了表之间的所有关系。这一切都很好,但是在我正在构建的 PHP 站点中,当从数据库中删除行时,我经常遇到麻烦,我经常遇到参照完整性约束。因此,我首先尝试从链接表中删除数据或将字段设置为 NULL。我通常可以通过一些试验和错误来让它工作,但似乎没有我应该这样做的方法或适当的过程。我应该使用'on delete set NULL or cascade delete settings'吗?我不知道该使用哪个,并担心它可能会删除其他表中的重要数据。

人们甚至会费心在他们的数据库中设置关系约束吗?我的意思是执行删除似乎要容易得多,然后编写一些额外的行来更新在 PHP 代码中链接到它的其他表。

任何帮助将不胜感激。

【问题讨论】:

  • 我倾向于在我的数据库中添加尽可能多的约束:损坏的代码是暂时的,损坏的数据是永远的。是的,管理约束可能很困难,但由于缺乏约束而清理损坏的数据库甚至是不可能的。
  • 确实,人们只需要完成一次涉及令人发指和损坏的数据库设计的死亡行军,就能体会到完整性检查的重要性。数据库不应信任中间层,而中间层不应信任表示层。

标签: mysql database-design constraints foreign-key-relationship referential-integrity


【解决方案1】:

数据库应该被视为它自己的领地,因为它不应该信任自身之外的数据。我经常看到需要直接连接到数据库的系统,并且违反了原始应用程序设置的任何规则。数据库经常演变为由多个应用程序使用,因此它必须实现自己的数据完整性。假设其他开发人员将完全绕过您的应用程序或中间层。此外,数据库的服务时间往往比最初为服务它而创建的应用程序要长得多。

因此,是的,在您的数据库设计中加入外键约束、正确使用可空性约束等至关重要。您遇到的那些参照完整性约束是为了保护数据免受孤立行的影响。此外,它们还提供有关表如何相互关联的文档。

如果您有一个子实体,当父实体被删除时逻辑上应该被删除,那么您可以考虑级联删除。我倾向于谨慎行事,不要级联删除,除非删除父级的所有代码都已经编码为删除子级,在这种情况下,您不妨级联删除。级联更新显然更安全,通常没有理由不实施它们,除非您担心性能或由于设计中的某些限制而无法实施。

【讨论】:

    【解决方案2】:

    这真的取决于您存储的数据类型,您真的需要数据具有参照完整性吗?对于大多数“信息系统”来说,这是必须的。

    参考你的第二段:

    我的意思是,删除然后写一些额外的行来更新在 PHP 代码中链接到它的其他表似乎要容易得多。

    是的更新/删除/插入相关数据到你的数据库,那一刻你就会明白 Codd 说这话时不是在开玩笑

    完整性约束必须与应用程序分开指定并存储在目录中。必须能够在适当的时候更改这些约束,而不会不必要地影响现有的应用程序。

    阅读 codd 的规则here

    【讨论】:

      【解决方案3】:

      如果您需要控制参照完整性(我会说您在绝大多数情况下都会这样做),最好让 DBMS 为您完成这项工作。

      不仅因为可能有其他应用程序(现在或将来)使用相同的数据,而且您不应该相信它们会像您在代码中那样小心,而且出于效率原因。

      一个好的 DBMS 总是会比您的代码更快地检查约束(例如检查外键的插入是否包含有效的值,即存在于引用表中的值)。由于这种检查是关系数据库的核心,因此 DBMS 非常适合这种检查

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        相关资源
        最近更新 更多