php - mysql 的引用完整性

标签 php mysql innodb myisam

我目前正在维护一个相当大的办公网络应用程序。我最近意识到,通过网络浏览器中的各种开发人员工具,用户可以轻松修改选择框的值(除其他外)。在服务器端,我会验证发布的数据是否为数字(对于下拉列表),但实际上并不检查该值是否存在于数据库表中,例如我有一个用于称呼的下拉框('mr ','ms','mrs','Mr/ms')等与数值相对应。

目前我使用Mysql的Myisam表,它不提供外键引用完整性,所以我正在考虑迁移到Innodb,但这存在以下问题:

如果我想应用引用完整性(以确保插入有效的 ID),这意味着我必须对所有根本不需要为性能问题建立索引的列(如果使用完整性检查)建立索引(例如称呼下拉菜单)。如果一个非常大的数据库客户表有 10 个类似的下拉菜单(例如客户组、员工数量、国家/地区等),那么为每个链接表建立索引似乎有点过分了。

我的问题:

1)使用引用完整性时,列真的也需要索引吗?

2)还有其他我可能忽略的实用解决方案吗? (例如,对每个下拉列表使用单独的查询来查看表中是否存在该值?)

3)其他网络应用程序如何处理此类问题?

感谢帮助!

谢谢 帕特里克

最佳答案

您只需对外键关系中使用的字段建立索引,最新版本的 mysql 无论如何都会自动为您执行此操作。这并不是“矫枉过正”。这实际上是一种优化。

考虑一下,每当您更新/删除/插入记录时,都必须检查外部表是否有匹配的记录 - 如果没有索引,这些检查可能会非常慢。

关于php - mysql 的引用完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17493436/

相关文章:

php - 编辑 php mysql 中帖子的类别

mysql - 从较小的任务关键型表更新大表,而不锁定小表

php - 与数据库中的多个日期和时间进行比较

PHP 将 POST 变量转发到其他页面

php - 如何创建固定宽度的元素

java - Spigot Minecraft 插件编码 NoClassDefFound 错误 mysql

mysql:sql注入(inject)演示出现问题

mysql - 当在 mysql 中插入或更新行时,索引到底会发生什么?

用于大型日志表的 MySQL 存储引擎

php - 使用 phpunit 在 mysql 中测试二进制类型的数据库