0

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

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

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

我的问题:

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

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

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

帮助赞赏!

谢谢帕特里克

4

2 回答 2

1
  1. 当您定义外键时,InnoDB 会自动创建索引。如果该列上的索引已经存在,InnoDB 将使用它而不是创建新索引。

    正如@MarcB 在他的回答中提到的那样,InnoDB 使用这些索引在某些类型的数据更改期间使参照完整性检查更加有效。这些更改包括更新或删除父表中的值,以及级联操作。

  2. 您可以使用ENUM数据类型将列限制为一组固定的值。但ENUM 也有一些缺点

  3. 一些 Web 开发人员避免使用外键。为了提供相同的数据完整性保证,他们必须为每种情况编写应用程序代码。因此,如果您喜欢编写和测试大量重复代码,不必要地重复 RDBMS 已经提供的功能,那么请继续!:-)

    大多数不使用外键的开发人员也不会编写这些额外的检查。他们只是没有数据完整性执法。即他们牺牲了质量

PS:我确实建议切换到 InnoDB,而引用完整性只是这样做的原因之一。基本上,如果你想要一个支持ACID的数据库,InnoDB 支持所有方面,而 MyISAM 不支持。

于 2013-07-05T17:06:21.227 回答
1

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

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

于 2013-07-05T16:40:29.580 回答