我目前正在维护一个相当大的办公网络应用程序。我最近意识到,通过网络浏览器中的各种开发人员工具,用户可以轻松修改选择框的值(除其他外)。在服务器端,我会验证发布的数据是否为数字(对于下拉列表),但实际上并不检查该值是否存在于数据库表中,例如我有一个用于称呼的下拉框('mr ','ms','mrs','Mr/ms')等与数值相对应。
目前我使用Mysql的Myisam表,它不提供外键引用完整性,所以我正在考虑迁移到Innodb,但这存在以下问题:
如果我想应用引用完整性(以确保插入有效的 ID),这意味着我必须对所有根本不需要为性能问题建立索引的列(如果使用完整性检查)建立索引(例如称呼下拉菜单)。如果一个非常大的数据库客户表有 10 个类似的下拉菜单(例如客户组、员工数量、国家/地区等),那么为每个链接表建立索引似乎有点过分了。
我的问题:
1)使用引用完整性时,列真的也需要索引吗?
2)还有其他我可能忽略的实用解决方案吗? (例如,对每个下拉列表使用单独的查询来查看表中是否存在该值?)
3)其他网络应用程序如何处理此类问题?
感谢帮助!
谢谢 帕特里克
最佳答案
您只需对外键关系中使用的字段建立索引,最新版本的 mysql 无论如何都会自动为您执行此操作。这并不是“矫枉过正”。这实际上是一种优化。
考虑一下,每当您更新/删除/插入记录时,都必须检查外部表是否有匹配的记录 - 如果没有索引,这些检查可能会非常慢。
关于php - mysql 的引用完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17493436/