1

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

人们是否打算在数据库中设置关系约束?我的意思是做一个删除似乎更容易,然后写一些额外的行来更新在PHP代码中链接到它的其他表。

任何帮助将不胜感激。

+3

我倾向于为我的数据库添加尽可能多的约束条件:破损的代码是暂时的,破碎的数据是永久的。是的,管理你的约束可能很困难,但由于缺乏约束可能无法清理破损的数据库。 – 2011-02-25 06:33:14

+4

事实上,只需要进行一次死亡游行就可以了解完整性检查的重要性,其中包括一个令人发指的破坏数据库设计。数据库不应该信任中间层,中间层不应该信任表示层。 – Thomas 2011-02-25 07:04:40

回答

3

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

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

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

3

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

参考你的第二个段落:

我的意思是它似乎容易得多做了删除,然后写一些多余的线条,更新被链接到它在PHP代码中的其他表。

是的,当你只是做一个小规模的系统也许容易,但想象一下,你的申请成功,你有更多的客户,需要实现更多的功能,更多的程序员需要,那么你会不可避免地忘记更新/删除/相关数据插入到数据库,这将是瞬间,你会明白,科德不是在开玩笑时,他说,

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

读了Codd的规则here

+0

好的解释谢谢ZaQ。 – zuallauz 2011-02-26 10:18:08

1

如果你需要控制的参照完整性(和我倒是说你在绝大多数情况下这样做)it's总是最好让DBMS做的工作为你。

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

一个好的DBMS将总是比你的代码更快地检查约束(例如检查外键的插入是否保存有效值,即存在于被引用表中的值)。由于这种检查是关系数据库的核心,所以DBMS对此非常优化

相关问题