MySQL关系&约束,我应该使用它们吗?

时间:2011-02-25 06:09:25

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

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

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

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

参考你的第二段:

  

我的意思是,删除然后编写一些额外的行以更新在PHP代码中链接到它的其他表格会更容易。

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

  

完整性约束必须与应用程序分开指定并存储在目录中。必须有可能在适当时更改此类限制,而不会对现有应用程序产生不必要的影响。

阅读codd的规则here

答案 2 :(得分:1)

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

不仅因为可能有其他应用程序(现在或将来)使用相同的数据,您不应该信任它们在代码中的谨慎,但也出于效率原因。

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