假设我有一些永远不变的表,例如“州”(指美国各州)或“国家”表。如果我接下来有一个Customer表来存储诸如CustomerState,CustomerCountry之类的信息,是否真的有必要将它们作为FK存储到相应的表中?
这些值是从从State或Country提取适当数据的表单中填充的(即,州将始终以其正确的2字母代码进入-用户无法输入自定义输入或类似的内容)。
我问是因为似乎为简单的事情添加额外的联接只会减慢查询速度。现在,这对我来说不是问题,因为我在一个很小的数据库上工作……但是总有一天我可能不会。甚至有关系吗?性能损失微不足道以至于我应该这样做吗?
这里的经验法则是,如果一组值的基数较低并且其成员是稳定的(尽管不一定是不变的),则使用CHECK约束(例如:ISO 5218性别代码)。否则,请使用带有外键的查找表。
CHECK
请注意,某些民族国家(边界和名称)不如其他国家稳定:)CustomerCountry对于不同的消费者可能具有不同的含义。考虑一下您可以在蜗牛邮件上放置的所有国家名称的变体(英国,英国,大不列颠及北爱尔兰联合王国,安格特雷等),但仍希望它能被交付,而您的申请逻辑可能希望专门使用该值ISO 3166-1 alpha-3 = 'GBR'
CustomerCountry
ISO 3166-1 alpha-3 = 'GBR'
请注意,在mySQL中,尽管使用CHECK约束是有效的语法,但实际上从未对其进行检查,因此,我想,mySQL的经验法则是始终使用带有外键的查找表!