4

各訪問者の国をデータベースに挿入したいと考えています。Maxmind は、VARCHAR(2)2 バイトを使用する に保存できる 2 文字の国 ISO を返します。または、UNSIGNED TINYINT1 バイトを使用する を使用することもでき、すべての国を含むテーブルの ID になります。

しかし、私はぶつかりました。高速挿入にはエンジンが必要ですMyISAMが、MyISAM は をサポートしていませんFOREIGN KEYS。そのため、挿入ごとに国テーブルで選択を行って国 ID を取得する必要があると思います。

何が最適なオプションなのかわかりません。挿入が多いため、絶対に使用する必要がありますが、国IDを取得するMyISAMために常に作成したくありません。SELECTs

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 をサポートするエンジンを使用する場合、そのレコードの 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 に答える