我目前正在学习外键并尝试在我的应用程序中尽可能多地添加外键以确保数据完整性。我在Mysql上使用INNODB。
我的vs = v1 + v2
表的结构类似于......
clicks
等约12个_id列。
显然这些都指向其他表,所以我应该在它们上面添加一个外键吗? MySQL正在为每个外键自动创建一个索引,所以基本上我会在每一列上都有一个索引?这是我想要的吗?
仅供参考 - 这张桌子基本上是我最笨重的桌子。我的研究基本上告诉我,我牺牲性能的完整性,但并没有暗示性能下降会有多严重。
答案 0 :(得分:0)
通用答案是,如果您认为数据项非常重要以至于您为可能的值创建了查找表,则应创建外键关系以确保您没有获得任何孤立记录。
但是,您应该重新考虑点击表中的所有数据项(字段)是否需要查找表。例如,ip_id
字段可能代表IP地址。您只需将IP地址直接存储在点击表中,就不需要查找表,因为IP地址的范围很广,IP地址也是唯一的。
根据对字段的重新评估,您可以减少相关表的数量,从而减少外键和索引的数量。
答案 1 :(得分:0)
以下三点需要考虑:
gender_id
列上有索引,则可能是浪费空间。我的一般规则是没有包含列的索引应该有大约1000个不同的值(除非值是唯一的),然后从那里进行调整。last_modified_user_id
字段,但您从未有任何查询会返回特定用户上次修改过的项目列表,那么该字段上的索引就不那么有用了。关于索引的一点知识可以有很长的路要走。我推荐http://use-the-index-luke.com
答案 2 :(得分:0)
在插入这样一行之前,你做了12次插入或查找以获取ID,对吗?然后,当您执行INSERT
时,它将执行12次检查以验证所有这些ID是否匹配。何必;你刚刚用代码验证了它们。
当然,让FK正在开发中。但是在制作中,你应该已经清除了所有的编码错误,所以FK是一种浪费。
相关提示 - 不要一次完成所有工作。将原始(尚未规范化)数据放入临时表中。定期执行批量操作以添加新的规范化密钥并返回_id。 然后将它们移入真实的'表。这具有减少对桌子上的读取的干扰的附加优点。如果您期望每秒插入超过100次,请进一步讨论。