Ben her kullanıcı için mysql ülke isimlerini saklamak gerekir?

8 Cevap php

Aşağıda ben bir PHP dizi, bu ülkeler adına ve bu ülke için bir dizi ile 1-228 listesi vardır. Ben mysql DB ben bir numarası olarak bir kullanıcının ülkesini kurtardı ve sonra sayfalarında başka bir mysql sorgu yaparken önlemek için bu diziyi kullanabilirsiniz eski bir proje üzerinde kullanılır.

Şimdi verimlilik önemli olan farklı bir site yapıyorum. Ben onu yapıyorum nasıl terk etmek veya değiştirmek ve her kullanıcı için DB içine ülkenin gerçek ismini saklamak için iyi olurdu? Hangi yol en likey bilge iyi performans olurdu?

$country_array = array("1" => "Afghanistan","2" => "Albania","3" => "Algeria","4" => "American Samoa","5" => "Andorra","6" => "Angola","7" => "Anguilla","8" => "Antarctica","9" => "Antigua and Barbuda","10" => "Argentina","11" => "Armenia","12" => "Aruba","13" => "Australia","14" => "Austria","15" => "Azerbaijan","16" => "Bahamas","17" => "Bahrain","18" => "Bangladesh","19" => "Barbados","20" => "Belarus","21" => "Belgium","22" => "Belize","23" => "Benin","24" => "Bermuda","25" => "Bhutan","26" => "Bolivia","27" => "Bosnia and Herzegowina","28" => "Botswana","29" => "Bouvet Island","30" => "Brazil","31" => "British Indian Ocean Territory","32" => "British Virgin Islands","33" => "Brunei Darussalam","34" => "Bulgaria","35" => "Burkina Faso","36" => "Burundi","37" => "Cambodia","38" => "Cameroon","40" => "Cape Verde","41" => "Cayman Islands","42" => "Central African Republic","43" => "Chad","44" => "Chile","45" => "China","46" => "Christmas Island","47" => "Cocos (Keeling) Islands","48" => "Colombia","49" => "Comoros","50" => "Congo","51" => "Cook Islands","52" => "Costa Rica","53" => "Cote D'ivoire","54" => "Croatia","55" => "Cuba","56" => "Cyprus","57" => "Czech Republic","58" => "Czechoslovakia","59" => "Denmark","60" => "Djibouti","61" => "Dominica","62" => "Dominican Republic","63" => "East Timor","64" => "Ecuador","65" => "Egypt","66" => "El Salvador","67" => "Equatorial Guinea","68" => "Eritrea","69" => "Estonia","70" => "Ethiopia","71" => "Falkland Islands (Malvinas)","72" => "Faroe Islands","73" => "Fiji","74" => "Finland","75" => "France","76" => "France, Metropolitan","77" => "French Guiana","78" => "French Polynesia","79" => "French Southern Territories","80" => "Gabon","81" => "Gambia","82" => "Georgia","83" => "Germany","84" => "Ghana","85" => "Gibraltar","86" => "Greece","87" => "Greenland","88" => "Grenada","89" => "Guadeloupe","90" => "Guam","91" => "Guatemala","92" => "Guinea","93" => "Guinea-Bissau","94" => "Guyana","95" => "Haiti","96" => "Heard and McDonald Islands","97" => "Honduras","98" => "Hong Kong","99" => "Hungary","100" => "Iceland","101" => "India","102" => "Indonesia","103" => "Iraq","104" => "Ireland","105" => "Islamic Republic of Iran","106" => "Israel","107" => "Italy","108" => "Jamaica","109" => "Japan","110" => "Jordan","111" => "Kazakhstan","112" => "Kenya","113" => "Kiribati","114" => "Korea","115" => "Korea, Republic of","116" => "Kuwait","117" => "Kyrgyzstan","118" => "Laos","119" => "Latvia","120" => "Lebanon","121" => "Lesotho","122" => "Liberia","123" => "Libyan Arab Jamahiriya","124" => "Liechtenstein","125" => "Lithuania","126" => "Luxembourg","127" => "Macau","128" => "Macedonia","129" => "Madagascar","130" => "Malawi","131" => "Malaysia","132" => "Maldives","133" => "Mali","134" => "Malta","135" => "Marshall Islands","136" => "Martinique","137" => "Mauritania","138" => "Mauritius","139" => "Mayotte","140" => "Mexico","141" => "Micronesia","142" => "Moldova, Republic of","143" => "Monaco","144" => "Mongolia","145" => "Montserrat","146" => "Morocco","147" => "Mozambique","148" => "Myanmar","149" => "Namibia","150" => "Nauru","151" => "Nepal","152" => "Netherlands","153" => "Netherlands Antilles","154" => "New Caledonia","155" => "New Zealand","156" => "Nicaragua","157" => "Niger","158" => "Nigeria","159" => "Niue","160" => "Norfolk Island","161" => "Northern Mariana Islands","162" => "Norway","163" => "Oman","164" => "Pakistan","165" => "Palau","166" => "Panama","167" => "Papua New Guinea","168" => "Paraguay","169" => "Peru","170" => "Philippines","171" => "Pitcairn","172" => "Poland","173" => "Portugal","174" => "Puerto Rico","175" => "Qatar","176" => "Reunion","177" => "Romania","178" => "Russian Federation","179" => "Rwanda","180" => "Saint Lucia","181" => "Samoa","182" => "San Marino","183" => "Sao Tome and Principe","184" => "Saudi Arabia","185" => "Senegal","186" => "Seychelles","187" => "Sierra Leone","188" => "Singapore","189" => "Slovakia","190" => "Slovenia","191" => "Solomon Islands","192" => "Somalia","193" => "South Africa","194" => "Spain","195" => "Sri Lanka","196" => "St. Helena","197" => "St. Kitts And Nevis","198" => "St. Pierre and Miquelon","199" => "St. Vincent And The Greadines","200" => "Sudan","201" => "Suriname","202" => "Svalbard and Jan Mayen Islands","203" => "Swaziland","204" => "Sweden","205" => "Switzerland","206" => "Syrian Arab Republic","207" => "Taiwan","208" => "Tajikistan","209" => "Tanzania, United Republic of","210" => "Thailand","211" => "Togo","212" => "Tokelau","213" => "Tonga","214" => "Trinidad and Tobago","215" => "Tunisia","216" => "Turkey","217" => "Turkmenistan","218" => "Turks and Caicos Islands","219" => "Tuvalu","220" => "Uganda","221" => "Ukraine","222" => "United Arab Emirates","225" => "United States Virgin Islands","226" => "Uruguay","227" => "Uzbekistan","228" => "Vanuatu","229" => "Vatican City State","230" => "Venezuela","231" => "Viet Nam","232" => "Wallis And Futuna Islands","233" => "Western Sahara","234" => "Yemen","235" => "Yugoslavia","236" => "Zaire","237" => "Zambia","238" => "Zimbabwe");

8 Cevap

Bu yabancı anahtar tutan country veya country_id denilen users masaya countries adında bir tablo ve bir alanı tutmak için hızlı olacaktır countries tablosundaki her kullanıcıları ülke için.

MySQL katılmak (hemen hemen her zaman) normal döndürülen kayıtların listesi yineleme ve kullanıcı ile ülkeyi eşleştirme daha hızlıdır.

Edit: ikinci geçişte, ben dizeleri hakkında aşağıda söylenen şeyin düşünün, ama bir enum alan için tercih. Tüm ülkeleri içeren veritabanında bir enum oluşturmak ve bu yerine dizeleri ya da başka bir tablo kullanın. Size (a katılmak olmadan geri istiyorum değerini alma gibi) dizeleri ve ikinci bir tablo kullanmanın yararları tüm kullanmanın tüm yararları vermelidir.


Birincil kullanımı vaka etkisi şey olduğunu varsayarak "Tüm kullanıcıların ve ülke bana olsun" ya da daha sonra fastest Yapabileceğiniz "Bana kullanıcı N ve ülke olsun" dizesini saklamaktır.

Bu, bazı tuzaklar vardır: string (başka bir yanıt tartışılan) endeksli bir yaklaşım demek daha maliyetlidir karşılaştırır ve sık sık etkisi şey çalışan planlıyorsanız o zaman iyi dizinini bilmeniz nerede "ülke X bana bütün kullanıcılar olsun" Eğer dize karşılaştırabilirsiniz önleyebilirsiniz.

İkinci durumda varsa bile, o gerçekten sadece ikinci durumda kullanımını hakim başka bir tablo var öder, veri isterseniz, (sen, daha sonra yeni ülkeler ekleyerek ülkelerin isimlerini güncelleme planı) değişen olacak bazı kullanıcı yerel ayarı, vb dayalı değiştirmek için ülke adının dilini değiştirmek için

Kaçınmak bazı yürütme zaman kazandıracak katılır, ancak ikinci bir tablo could da sizin için doğru olabilir.

Veritabanı değerleri ile tabloyu doldurunuz başladığında hızlı bellek ile bir tablo oluşturmak geliştirmek için storage engine, ekstra hızlı.

Eğer not searching the array, sen (int tuşları ile) konumunu biliyor ve sadece orada aramak çünkü Ayrıca dizi erişim, çok hızlı.

Genellikle, tamsayı değerlerini karşılaştırarak dizeleri karşılaştırırken daha verimlidir.

Bu bir dizi ülkelerin isimlerini saklamak olmayacak gibi kullanıcı adları ile tablodaki ülkelerin isimlerini koyarak size bellek performansını kurtaracak gibi geliyor bana. Eğer ülke adlarını almak için sorgu olmadan haricinde orijinal yolu ile olduğu gibi sorgular aynı sayıda yapıyoruz gibi ama çok başka tasarruf olmaz.

PHP ile çok aşina değilim, ama (bu listeye kullanıcıların tablodaki FK ile) DB ülke listesini saklamak değil, önbellek listesini saklamak, ve bir şey değiştiğinde önbelleğini güncellemek? Bu dünyadaki tüm istikrarsızlık gibi görünüyor, sen biraz sık sık bu listeyi güncellemek için muktedir istiyorum, ve sert bu gibi kodlama kodunuzu bir iç savaş var, her zaman değiştirmek için gerektirir.

Verilerin ilk yük için, ISO-3166 verileri kullanabilirsiniz. Çoğu Linux dağıtımları tüm ülkeler ve isimleri translated to many languages listesini içeren bir paket (iso-kodlar) ile birlikte gelir. Çeşitli biçimlerde de (CSV, XML, ve çeviriler için. Po) içinde.

http://pkg-isocodes.alioth.debian.org/

Anahtarlar o güzel dışında tamsayılar, değil dizeleri olmalıdır.