1

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

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

任何帮助将非常感激。

4

3 回答 3

4

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

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

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

于 2011-02-25T06:59:03.723 回答
3

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

参考您的第二段:

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

是的,当你只做一个小规模的系统时可能会更容易,但是想象你的应用程序是成功的,并且你有更多的客户,需要实现更多的功能,需要更多的程序员,那么你将不可避免地忘记更新/删除/insert 相关数据到你的数据库,那一刻你就会明白 Codd 说这话时不是在开玩笑

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

在这里阅读 codd 的规则

于 2011-02-25T07:03:26.203 回答
1

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

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

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

于 2011-02-26T18:07:54.260 回答