我目前正在维护一个相当大的办公室网络应用程序。我最近意识到,通过Web浏览器中的各种开发人员工具,用户可以轻松地修改选择框的值(以及其他内容)。在服务器端,我确认发布的数据是否为数字(用于下拉列表),但实际上不检查数据库表中是否存在该值,例如我有一个用于称呼的下拉框('mr ','ms','mrs','Mr / ms')等与数值对应。
目前我使用Mysql的Myisam表,它不提供外键引用完整性,所以我正在考虑转移到Innodb,但这会产生以下问题:
如果我想应用引用完整性(以确保插入有效的ID),则意味着我必须索引所有列(如果使用完整性检查),这些列根本不需要为性能问题编制索引(例如致敬下降)。如果一个非常大的数据库客户端表已经说出了10个类似的下拉列表(例如客户端组,员工编号,国家/地区等),那么索引每个链接表似乎有点过分了。
我的问题:
1)使用参照完整性时,是否真的需要对列进行索引?
2)我可能会忽略其他实用的解决方案吗? (例如,对每个下拉列表使用单独的查询以查看表中是否存在该值?)
3)其他网络应用程序如何处理此类问题?
帮助感谢!
感谢 帕特里克
答案 0 :(得分:1)
您只需索引外键关系中使用的字段,并且最新版本的mysql会自动为您执行此操作。这不是“过度杀伤”。它实际上是一种优化。
请注意,无论何时更新/删除/插入记录,都必须检查外部表的匹配记录 - 如果没有索引,这些检查可能会非常缓慢。
答案 1 :(得分:1)
InnoDB在您定义外键时自动创建索引。如果该列上的索引已经存在,InnoDB将使用它而不是创建新索引。
正如@MarcB在他的回答中提到的,InnoDB使用这些索引在某些类型的数据更改期间更有效地进行参照完整性检查。这些更改包括更新或删除父表中的值以及级联操作。
您可以使用ENUM
data type将列限制为一组固定值。但ENUM
has some disadvantages也是如此。
一些Web开发人员避开了外键。为了提供相同的数据完整性保证,他们必须为每个这样的情况编写应用程序代码。因此,如果您想编写和测试大量重复代码,不必要地重复RDBMS已经提供的功能,那么请继续! : - )
大多数不使用外键的开发人员也不会编写这些额外的检查。他们只是没有数据完整性实施。即他们牺牲了质量。
PS:我建议切换到InnoDB,参考完整性只是其中一个原因。基本上,如果你想要一个支持ACID的数据库,InnoDB支持它的所有方面,MyISAM不支持任何方面。