4

我想在我的数据库中插入每个访问者的国家。Maxmind 返回我可以存储在 a 中的 2 个字母的国家/地区 ISO VARCHAR(2),这将使用 2 个字节,或者,我可以使用UNSIGNED TINYINT将使用 1 个字节的 an,并且将是包含所有国家/地区的表中的 id。

但是我遇到了一个障碍;我需要MyISAM快速插入的引擎,但 MyISAM 不支持FOREIGN KEYS,所以我想对于每次插入,我都必须在国家表中进行选择以检索国家/地区 ID。

我不知道什么是最好的选择,我绝对需要使用MyISAM,因为会有很多插入,但我不想不断SELECTs地检索国家 ID。

4

3 回答 3

1

如果您只需要 2 个字母的 ISO 国家/地区代码(而不是国家/地区名称、语言或其他信息),那么我会说将其存储为 CHAR(2) 而没有外部表将比存储它占用更少的资源因为 SMALLINT(TINYINT 不足以覆盖所有国家)并查找附加表。

注意:在这种情况下不需要 VARCHAR(2),CHAR(2) 会更有效。

于 2013-07-18T03:33:31.877 回答
0

您可以从国家/地区表创建关联数组。将国家 ID 作为该数组的键。然后将其提供给您的视图。因此,您可以从视图中查找国家/地区数组并显示相关国家/地区。例如

<?php echo $country[$customer['country_id']]['country_name']; ?>
于 2013-07-18T03:27:09.347 回答
0

拥有 FK 支持和没有 FK 支持的唯一区别是确保完整性。如果您要使用支持 FK 的引擎,则不允许您在没有该记录 ID 的情况下设置国家/地区。

也就是说,国家的数量是半静态的,我们只是在谈论数百个......你可以将所有这些都保存在内存中并让 ID 可用。

或者,您可以在插入期间进行选择,例如:

INSERT INTO sometable (col1,col2,country_id) VALUES('val1','val2', (SELECT id FROM countries WHERE iso_code = ?))

?将是您的 ISO 值。

于 2013-07-18T03:28:24.490 回答