我想在我的数据库中插入每个访问者的国家/地区。 Maxmind返回我可以存储在VARCHAR(2)
中的2个字母的国家ISO,它将使用2个字节,或者,我可以使用将使用1个字节的UNSIGNED TINYINT
,并且将来自与所有国家签订的表格。
然而我碰到了一个凹凸;我需要MyISAM
引擎进行快速插入,但MyISAM不支持FOREIGN KEYS
,所以我想对于每次插入,我都必须在countries表中进行选择以检索国家/地区ID。
我不知道什么是最好的选择,我绝对需要使用MyISAM
,因为会有很多插入,但我不想经常让SELECTs
来检索国家/地区ID
答案 0 :(得分:1)
如果您只需要2个字母的ISO国家/地区代码(而不是国家/地区名称,语言或其他信息),那么我会说将其存储为CHAR(2)而不使用外部表格会减少资源消耗而不是将其存储为SMALLINT(TINYINT不足以涵盖所有国家/地区),并查找其他表格。
注意:在这种情况下不需要VARCHAR(2),CHAR(2)会更有效。
答案 1 :(得分:0)
您可以从国家/地区表格创建关联数组。将国家/地区ID作为此阵列的键。然后将其提供给您的观点。因此,在视图中,您可以对国家/地区阵列进行查找并显示相关国家/地区。例如
<?php echo $country[$customer['country_id']]['country_name']; ?>
答案 2 :(得分:0)
获得FK支持与没有FK支持之间的唯一区别是确保完整性。如果您使用支持FK的引擎,则不允许您在没有该记录ID的情况下设置该国家。
那说国家的数量是半静态的,我们只谈数百......你可能会把所有这些保留在内存中,并且ID是可用的。
或者,您可以在插入期间执行选择,如:
INSERT INTO sometable (col1,col2,country_id) VALUES('val1','val2', (SELECT id FROM countries WHERE iso_code = ?))
?
将是您的ISO值。