Jadual Kandungan
回复内容:
数据结构
查询方法
遍历方法
优势和弱点
数据哪里来?
具体地址怎么存?
如何应对不存在的省市区名称?
Rumah pembangunan bahagian belakang tutorial php 你们都是怎么在数据库中存储邮政地址的?

你们都是怎么在数据库中存储邮政地址的?

Jun 06, 2016 pm 08:48 PM
mysql php

一般的邮政地址都要包含国家、省份、市县乡之类的数据,大家一般都是怎么存储的?

回复内容:

一般的邮政地址都要包含国家、省份、市县乡之类的数据,大家一般都是怎么存储的?

基本上摘自我在sf的博客文章:http://blog.segmentfault.com/shamiao/1190000000329012。

我喜欢用左右值法来组织省-市-区的表格。

数据结构

-------------------------------------
name    lbb   ubb   depth  注:ID省略
-------------------------------------
吉林省   1     14    1
长春市   2     7     2
朝阳区   3     4     3
南关区   5     6     3
辽源市   8     13    2
龙山区   9     10    3
东丰县   11    12    3
辽宁省   15    18    1
沈阳市   16    17    2
-------------------------------------
Salin selepas log masuk

数据表就像这样。这个组织方法的特点是:

  • 每一个区划覆盖一个整数值区间
  • 各个区间只嵌套不交叉。
  • 甚至各区间的上下限不允许重叠,左右值是无重复的。
    这是一个相当重要的优化。下边的查询,没有这个条件基本都不能成立或不太方便。
  • 最小的区间长度至少为1。
  • 总体是一个无限嵌套的结构。

以上边这个表格为例,他表示了这样一个分层结构:

1------------------吉林-------------------14 15---辽宁---18
 2------长春------7 8--------辽源--------13    16-沈阳-17
  3-朝阳-4 5-南关-6   9-龙山-10 11-东丰-12
Salin selepas log masuk

这样,省-市-区就只需要存储一个数字,即该区划的左值,就可以了。

但必须注意:虽然存左值完全够实用了,但为了数据安全,必须另开设一个字段存储对应区划的ID,作为“真正唯一的关联数据(虽然不怎么用得到)”。而左值只能当作“非常有用的冗余数据”,做好一更新随时会被重写的准备。原因末尾“优势和弱点”一节会解释。

查询方法

根据号码查询单个区划的名称,查左值相等的就行了。

如果要列出所有的上级区划,尤其方便。由于区间包含是一个简单的数学关系,所以再也不必要像典型的存储父记录号码那样,费时费力去做回溯操作。

只要把包含区间的值的所有区间取出,就是这个区划的所有上级。并且,由于大区间的左值一定比小区间的小,所以只需要按照左值升序,就可以把区间从大到小排序。

例如查询朝阳区(左值=3)的所有上级:

SELECT * FROM regiontable WHERE lbb<=3 AND ubb>3 ORDER BY lbb ASC
Salin selepas log masuk

得到结果:

-------------------------------------
name    lbb   ubb   depth
-------------------------------------
吉林省   1     14    1
长春市   2     7     2
朝阳区   3     4     3
-------------------------------------
Salin selepas log masuk

即吉林省-长春市-朝阳区。

遍历方法

数据表中存储了depth冗余字段代表层级深度。这个字段会在查询中起大作用。

例如列出下级所有区域(已知当前级别的左右界和深度):

SELECT * FROM regiontable WHERE lbb>左界 AND ubb<右界 AND depth=(深度+1) ORDER BY lbb ASC
Salin selepas log masuk

如果列出第一级那就只查depth=1就行了。

这个查询不仅可以用于行政区划表格,也可以用于用户数据表格。例如列出属于某区域的所有用户(已知此级别的左右界):

SELECT * FROM userinfo WHERE region>=左界 AND region<右界
Salin selepas log masuk

而无论对于多大的区域,这个查询效率的都是均等的高,彻底杜绝区域大了查不动。

优势和弱点

左右值法快就快在查询和排序都有数学的自然性。一步到位,无需回溯,效率是显而易见的。

而弱点同样显而易见:修改极其麻烦,并且往往是牵一发而动全身。一处写入,估计大半张表格都要跟着修改。算法就会很麻烦。

而这要注意对于任何一个记录,其左右值都是不稳定的,只能用于查询,绝对不能用来与数据表建立持久稳定的关系!这也就是前边说过一定要存区划ID的意义。

这个需求中,我们恰好使用了优势,而规避了弱点。因为行政区划数据天天查,但很少改。

数据哪里来?

要求不高的,维基百科去抄,或者到别的程序里去扒。

要求高的,去买民政部出的《中华人民共和国行政区划简册2013》,权威性没商量。

注意港澳台的行政区划问题。我建议以下的方案:

  • 香港、澳门特别行政区,仅列在中华人民共和国下,不列入单独的国家/地区。
  • 中华人民共和国下存在台湾省,但不再向下延伸;
  • 第一级国家/地区(如果有的话)单列台湾,并按维基百科资料,或参考台湾执政部门资料,填入对应的下级行政区域。最好使用正体(繁体)中文。
  • 另外,小心使用洋人做的国家列表。要是一不小心新疆和西藏单列了国家和地区,就自己考虑后果吧。

具体地址怎么存?

像淘宝那样,把省市区放在一行内,摆在地址文本框的旁边,并明示用户:地址中不必再输入省市区。

如何应对不存在的省市区名称?

我推荐的方法是:提示用户能选到多细选多细,如果再细没有了,就放在具体地址前边,一起输入到地址文本框中。

我是绝对反对整几个小文本框,给用户在找不到自己的省市区的时候,去自定义输入的。
理由也很简单:就算我们的行政区划数据库再老,再不准确,那也能保证99%的人都能找到自己的地址。
所以这个思路看似很自然(没有就自定义嘛!),但其实是在为了1%的需求投入100%的开发精力,到头来是极其愚蠢和低效的。

HTML 表格中有几个数据段, 我的数据库就相应的有几个column.

国家,省份,城市名称,我是这么干的:

plus_id, country, province, city
1      ,   中国 ,    北京  , null
2      ,   中国 ,    河北  , 廊坊
Salin selepas log masuk

然后info表里关联ID就行。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Masa Depan PHP: Adaptasi dan Inovasi Masa Depan PHP: Adaptasi dan Inovasi Apr 11, 2025 am 12:01 AM

Masa depan PHP akan dicapai dengan menyesuaikan diri dengan trend teknologi baru dan memperkenalkan ciri -ciri inovatif: 1) menyesuaikan diri dengan pengkomputeran awan, kontena dan seni bina microservice, menyokong Docker dan Kubernetes; 2) memperkenalkan pengkompil JIT dan jenis penghitungan untuk meningkatkan prestasi dan kecekapan pemprosesan data; 3) Berterusan mengoptimumkan prestasi dan mempromosikan amalan terbaik.

Cara membuka phpmyadmin Cara membuka phpmyadmin Apr 10, 2025 pm 10:51 PM

Anda boleh membuka phpmyadmin melalui langkah -langkah berikut: 1. Log masuk ke panel kawalan laman web; 2. Cari dan klik ikon phpmyadmin; 3. Masukkan kelayakan MySQL; 4. Klik "Login".

PHP vs Python: Memahami Perbezaan PHP vs Python: Memahami Perbezaan Apr 11, 2025 am 12:15 AM

PHP dan Python masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1.Php sesuai untuk pembangunan web, dengan sintaks mudah dan kecekapan pelaksanaan yang tinggi. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan yang kaya.

MySQL: Pengenalan kepada pangkalan data paling popular di dunia MySQL: Pengenalan kepada pangkalan data paling popular di dunia Apr 12, 2025 am 12:18 AM

MySQL adalah sistem pengurusan pangkalan data relasi sumber terbuka, terutamanya digunakan untuk menyimpan dan mengambil data dengan cepat dan boleh dipercayai. Prinsip kerjanya termasuk permintaan pelanggan, resolusi pertanyaan, pelaksanaan pertanyaan dan hasil pulangan. Contoh penggunaan termasuk membuat jadual, memasukkan dan menanyakan data, dan ciri -ciri canggih seperti Operasi Join. Kesalahan umum melibatkan sintaks SQL, jenis data, dan keizinan, dan cadangan pengoptimuman termasuk penggunaan indeks, pertanyaan yang dioptimumkan, dan pembahagian jadual.

Cara menggunakan redis berulir tunggal Cara menggunakan redis berulir tunggal Apr 10, 2025 pm 07:12 PM

Redis menggunakan satu seni bina berulir untuk memberikan prestasi tinggi, kesederhanaan, dan konsistensi. Ia menggunakan I/O multiplexing, gelung acara, I/O yang tidak menyekat, dan memori bersama untuk meningkatkan keserasian, tetapi dengan batasan batasan konkurensi, satu titik kegagalan, dan tidak sesuai untuk beban kerja yang berintensifkan.

Mengapa menggunakan mysql? Faedah dan kelebihan Mengapa menggunakan mysql? Faedah dan kelebihan Apr 12, 2025 am 12:17 AM

MySQL dipilih untuk prestasi, kebolehpercayaan, kemudahan penggunaan, dan sokongan komuniti. 1.MYSQL Menyediakan fungsi penyimpanan dan pengambilan data yang cekap, menyokong pelbagai jenis data dan operasi pertanyaan lanjutan. 2. Mengamalkan seni bina pelanggan-pelayan dan enjin penyimpanan berganda untuk menyokong urus niaga dan pengoptimuman pertanyaan. 3. Mudah digunakan, menyokong pelbagai sistem operasi dan bahasa pengaturcaraan. 4. Mempunyai sokongan komuniti yang kuat dan menyediakan sumber dan penyelesaian yang kaya.

PHP: Adakah ia mati atau hanya menyesuaikan diri? PHP: Adakah ia mati atau hanya menyesuaikan diri? Apr 11, 2025 am 12:13 AM

PHP tidak mati, tetapi sentiasa menyesuaikan diri dan berkembang. 1) PHP telah menjalani beberapa lelaran versi sejak tahun 1994 untuk menyesuaikan diri dengan trend teknologi baru. 2) Ia kini digunakan secara meluas dalam e-dagang, sistem pengurusan kandungan dan bidang lain. 3) Php8 memperkenalkan pengkompil JIT dan fungsi lain untuk meningkatkan prestasi dan pemodenan. 4) Gunakan OPCACHE dan ikut piawaian PSR-12 untuk mengoptimumkan prestasi dan kualiti kod.

Tempat Mysql: Pangkalan Data dan Pengaturcaraan Tempat Mysql: Pangkalan Data dan Pengaturcaraan Apr 13, 2025 am 12:18 AM

Kedudukan MySQL dalam pangkalan data dan pengaturcaraan sangat penting. Ia adalah sistem pengurusan pangkalan data sumber terbuka yang digunakan secara meluas dalam pelbagai senario aplikasi. 1) MySQL menyediakan fungsi penyimpanan data, organisasi dan pengambilan data yang cekap, sistem sokongan web, mudah alih dan perusahaan. 2) Ia menggunakan seni bina pelanggan-pelayan, menyokong pelbagai enjin penyimpanan dan pengoptimuman indeks. 3) Penggunaan asas termasuk membuat jadual dan memasukkan data, dan penggunaan lanjutan melibatkan pelbagai meja dan pertanyaan kompleks. 4) Soalan -soalan yang sering ditanya seperti kesilapan sintaks SQL dan isu -isu prestasi boleh disahpepijat melalui arahan jelas dan log pertanyaan perlahan. 5) Kaedah pengoptimuman prestasi termasuk penggunaan indeks rasional, pertanyaan yang dioptimumkan dan penggunaan cache. Amalan terbaik termasuk menggunakan urus niaga dan preparedStatemen

See all articles