บทที่ 5 : 5.3ความสัมพันธ์ในฐานข้อมูล
๕.๓ ความสัมพันธ์ในฐานข้อมูล (Database Relationships)
(ในระบบฐานข้อมูลของระบบสารสนเทศภูมิศาสตร์ – GIS)
ในระบบฐานข้อมูลของระบบสารสนเทศภูมิศาสตร์ (Geospatial Database System) การจัดเก็บข้อมูลจะดำเนินการในรูปของ “ตารางข้อมูล (Table)” ซึ่งแต่ละตารางจะประกอบด้วย:
- เอนทิตี (Entity) หรือชื่อแฟ้มข้อมูล เช่น
village
,district
,population
- แอตทริบิวต์ (Attribute) หรือคุณลักษณะของข้อมูล เช่น
village_name
,population_total
,district_code
ระบบฐานข้อมูลเชิงสัมพันธ์ (Relational Database) จะอนุญาตให้มีการเชื่อมโยงระหว่างตารางต่าง ๆ ผ่าน ค่ารหัสที่ตรงกัน (Key Matching) โดยเฉพาะการกำหนด Primary Key และ Foreign Key เพื่อสร้าง “ความสัมพันธ์ของข้อมูล” อย่างมีนัยยะ

รูปที่ 5.5 โครงสร้างตารางในแฟ้มข้อมูล
🔗 โครงสร้างความสัมพันธ์ระหว่างตารางในระบบ GIS
ตัวอย่าง: การจัดการข้อมูลประชาชนระดับหมู่บ้าน ในโครงสร้าง GIS
- ตาราง
population
เก็บข้อมูลระดับบุคคล เช่นperson_id
,name
,village_code
- ตาราง
village
เก็บข้อมูลหมู่บ้าน เช่นvillage_code
,village_name
,subdistrict_code
- ตาราง
subdistrict
เชื่อมโยงไปยังdistrict
และprovince
โดยใช้รหัสร่วม เช่น village_code
เป็น Foreign Key ที่เชื่อมกับตาราง village
textCopyEdit[ population ] ← village_code → [ village ] ← subdistrict_code → [ subdistrict ]
🧾 ตัวอย่างความสัมพันธ์ใน GIS (Entity-Relationship: E-R)
ตาราง (Table) | Primary Key | เชื่อมโยงกับตารางใด (Foreign Key) |
---|---|---|
population | person_id | village_code → village.village_code |
village | village_code | subdistrict_code → subdistrict.subdistrict_code |
subdistrict | subdistrict_code | district_code → district.district_code |
district | district_code | province_code → province.province_code |
ความสัมพันธ์นี้ช่วยให้สามารถ:
- ค้นหาว่าบุคคลหนึ่งอยู่ที่ใดได้อย่างรวดเร็ว
- แสดงข้อมูลเชิงพื้นที่ เช่น Highlight เขตตำบลที่มีประชากรเกิน 10,000 คน
- วิเคราะห์ข้อมูลเชิงสถิติในแต่ละระดับพื้นที่

รูปที่ 5.6 โครงสร้างการเชื่อมต่อตารางในแฟ้มข้อมูล
📌 บทบาทของรหัสในการสร้างความสัมพันธ์
ค่าของรหัส เช่น village_code
จะเป็น คีย์หลัก (Primary Key) ในตาราง village
และเป็น คีย์ต่างประเทศ (Foreign Key) ในตาราง population
จึงสามารถใช้เป็นจุดเชื่อมในการ สืบค้น (Query) และ เชื่อมข้อมูลเชิงพื้นที่ (Spatial Join) ได้อย่างมีประสิทธิภาพ
ในฐานข้อมูลอาจจะมีความสัมพันธ์อยู่ 3 ประเภทดังนี้
๕.๔.๑ ความสัมพันธ์แบบหนึ่งต่อหนึ่ง (One-to-One Relationship)
(One-to-One Relationship in GIS Relational Databases)
🔎 คำนิยามทางวิชาการ
ความสัมพันธ์แบบหนึ่งต่อหนึ่ง คือ ความสัมพันธ์ระหว่างสองตารางข้อมูล (Table A และ Table B) โดยที่:
“แต่ละระเบียน (record) ในตาราง A มีความสัมพันธ์กับระเบียนเพียงหนึ่งเดียวในตาราง B และในทางกลับกัน ระเบียนในตาราง B ก็มีความสัมพันธ์เพียงหนึ่งเดียวกับตาราง A”
ในระบบฐานข้อมูลเชิงสัมพันธ์ (Relational Database System) ความสัมพันธ์ประเภทนี้มีลักษณะเฉพาะว่า ค่าของ Primary Key จากตารางหนึ่งจะสัมพันธ์กับค่าของ Primary Key อีกตารางหนึ่งโดยตรง
🗺️ การประยุกต์ใช้ในระบบฐานข้อมูล GIS
✅ ตัวอย่างในระบบ GIS
ชุดข้อมูลที่แสดง ขอบเขตการปกครองระดับอำเภอ ของจังหวัดปทุมธานี มีทั้งหมด 7 อำเภอ โดยในชุดข้อมูลประกอบด้วย:
- ตาราง
amphoe_map
: เก็บรูปแผนที่ (geometry) ของแต่ละอำเภอamphoe_code
(Primary Key)geometry
(Polygon)
- ตาราง
amphoe_info
: เก็บข้อมูลคำอธิบายเฉพาะของแต่ละอำเภอamphoe_code
(Primary Key)amphoe_name
,population
,area_sqkm
, etc.
ความสัมพันธ์ของตารางนี้คือ 1 อำเภอ → 1 geometry และ 1 ข้อมูลเฉพาะ
(ไม่มีการซ้ำซ้อนทั้งสองฝั่ง)
🔗 ภาพจำลองโครงสร้าง (Conceptual Relationship)
textCopyEdit[ amphoe_map ] [ amphoe_info ]
+--------------+ +------------------+
| amphoe_code |◄───────────►| amphoe_code |
| geometry | | amphoe_name |
+--------------+ | population |
| area_sqkm |
+------------------+
🎯 ประโยชน์ของ One-to-One ใน GIS
- เหมาะสำหรับการแยกข้อมูลเฉพาะทาง เช่น ข้อมูลสุขภาพ, เศรษฐกิจ หรือข้อมูลลับออกจากตารางหลัก
- ใช้จัดการ ข้อมูล metadata หรือ รายงานการปรับปรุงแผนที่รายเขต
- ช่วยลดขนาดของตารางหลัก โดยเก็บเฉพาะข้อมูลจำเป็น และแยกข้อมูลเสริมไว้ตารางเฉพาะ
- เพิ่มความปลอดภัยและความเป็นส่วนตัวของข้อมูล เช่น แยก
amphoe_geometry
ออกจากsensitive_demographics
✅ ข้อควรระวัง
- ความสัมพันธ์ประเภทนี้ไม่ควรใช้หากมี ข้อมูลฝั่งใดฝั่งหนึ่งสามารถมีมากกว่าหนึ่งระเบียน
- ในกรณีที่ข้อมูลอาจเพิ่มจำนวนในอนาคต เช่น ผู้ใช้งานหลายคนในตำบลหนึ่ง → ควรใช้ความสัมพันธ์แบบ 1:N

รูปที่ 5.7 การประยุกต์ใช้ความสัมพันธ์แบบหนึ่งต่อหนึ่งในระบบ GIS
๕.๔.๒ ความสัมพันธ์แบบหนึ่งต่อกลุ่ม (One-to-Many Relationship)
(One-to-Many Relationship in Geospatial Databases)
🔎 คำนิยามทางวิชาการ
ความสัมพันธ์แบบหนึ่งต่อกลุ่ม (One-to-Many) คือ ความสัมพันธ์ที่:
แต่ละระเบียนในตาราง A (ต้นทาง) สามารถเชื่อมโยงกับหลายระเบียนในตาราง B (ปลายทาง)
ในขณะที่ แต่ละระเบียนในตาราง B จะสัมพันธ์กับ เพียง 1 ระเบียนในตาราง A เท่านั้น
ความสัมพันธ์ประเภทนี้เป็นโครงสร้างหลักที่ใช้กันอย่างแพร่หลายในระบบฐานข้อมูล โดยเฉพาะในการจัดการ ข้อมูลเชิงพื้นที่ (Spatial Data) ที่มีหน่วยย่อยหลายระดับ เช่น จังหวัด → อำเภอ, ประเภทดิน → หลายพื้นที่ ฯลฯ
🗺️ ตัวอย่างในระบบ GIS: ชุดดินในจังหวัดปทุมธานี
กรณีศึกษา:
ในการจัดทำแผนที่ ขอบเขตชุดดิน (Soil Series Boundaries) ของจังหวัดปทุมธานี มีหลาย polygon ที่แสดงพื้นที่ของชุดดินชนิดเดียวกัน เช่น:
- ชุดดินรหัส 141 ปรากฏอยู่ใน 2 ตำแหน่งบนแผนที่ → 2 Polygon
- แต่ ตารางข้อมูลรายละเอียดชุดดิน จะมีข้อมูลของชุดดินรหัส 141 เพียง หนึ่งระเบียน
✳ โครงสร้างข้อมูล:
- ตาราง
soil_map
polygon_id
(PK),soil_code
(FK),geometry
- ตาราง
soil_series
soil_code
(PK),soil_name
,texture
,depth
, etc.
textCopyEdit[ soil_series ] [ soil_map ]
+-------------+ +-----------------+
| soil_code |◄───────| soil_code (FK) |
| soil_name | | polygon_id |
| texture | | geometry |
+-------------+ +-----------------+
💡 การใช้งานในระบบ GIS
- สามารถใช้ในการ เชื่อมโยงคุณลักษณะ (Attribute Join) จากตาราง
soil_series
ไปยัง shapefile หรือ feature class ที่มีหลาย Polygon ได้ - ใช้ในกรณีที่ entity เชิงพื้นที่ซ้ำ แต่มีคุณลักษณะอ้างอิงชุดเดียวกัน เช่น
- แปลงปลูกพืช → ชนิดพืช
- พื้นที่ป่าต่างกัน → ประเภทป่าเดียวกัน
- พื้นที่น้ำหลายจุด → ประเภทเดียวกัน (เช่น บึง, หนอง)
✅ ข้อดีของ One-to-Many ใน GIS
- ช่วยลดความซ้ำซ้อนของข้อมูลคุณลักษณะ (เช่น soil properties)
- ช่วยให้ระบบฐานข้อมูลมีโครงสร้างที่ มีประสิทธิภาพและประหยัดเนื้อที่
- รองรับการ Query หรือ Filter ข้อมูลที่มีโครงสร้างย่อยซ้ำกันได้ง่าย
- รองรับการทำ Symbology และ Labeling โดยอิงจากข้อมูลเชื่อมโยง
🧭 แนวทางการสร้างความสัมพันธ์ในโปรแกรม GIS
ใน QGIS หรือ ArcGIS, ความสัมพันธ์นี้มักสร้างผ่าน:
- Attribute Join (เชื่อมด้วย
soil_code
) - Relate Table (ใน ArcGIS Pro → แบบ One-to-Many)
- Virtual Layer (ใน QGIS → SQL Join)

รูปที่ 5.8 การประยุกต์ใช้ความสัมพันธ์แบบหนึ่งต่อกลุ่มในระบบ GIS
๕.๔.๓ ความสัมพันธ์แบบกลุ่มต่อกลุ่ม (Many-to-Many Relationship)
(Many-to-Many Relationship in GIS Relational Databases)
🔎 คำนิยามทางวิชาการ
ความสัมพันธ์แบบกลุ่มต่อกลุ่ม หรือ Many-to-Many (M:N) หมายถึง:
แต่ละระเบียนในตาราง A สามารถเชื่อมโยงกับ หลายระเบียนในตาราง B
และในทางกลับกัน แต่ละระเบียนในตาราง B ก็สามารถเชื่อมโยงกับ หลายระเบียนในตาราง A
🗺️ การประยุกต์ใช้ในระบบสารสนเทศภูมิศาสตร์ (GIS)
กรณีศึกษาจาก แผนที่ขอบเขตการปกครองระดับอำเภอของ จ.ปทุมธานี:
▶ ตัวอย่าง:
- ในตาราง
amphoe_map
(ตารางแผนที่อำเภอ):- อำเภอทุกแห่งในจังหวัดปทุมธานีมี รหัสจังหวัดเดียวกัน คือ
28
- อำเภอหนึ่งอาจมีหลายตำบล
- อำเภอทุกแห่งในจังหวัดปทุมธานีมี รหัสจังหวัดเดียวกัน คือ
- ในตาราง
tambon_info
(ข้อมูลตำบล):- แต่ละตำบลมี รหัสอำเภอซ้ำกัน เช่น
2802
(คลองหลวง) มีหลายตำบล - และแต่ละตำบลก็มีรหัสจังหวัดเหมือนกัน คือ
28
- แต่ละตำบลมี รหัสอำเภอซ้ำกัน เช่น
ผลลัพธ์:
- 1 จังหวัด → หลายอำเภอ
- 1 อำเภอ → หลายตำบล
- 1 ตำบล → มีรหัสจังหวัดร่วมกับหลายอำเภอ → ก่อให้เกิด ความซ้อนทับของความสัมพันธ์
🔗 การจัดการความสัมพันธ์แบบกลุ่มต่อกลุ่มในฐานข้อมูล GIS
เนื่องจาก ฐานข้อมูลเชิงสัมพันธ์ (RDBMS) ไม่สามารถแสดงความสัมพันธ์แบบ M:N ได้โดยตรง
วิธีที่ใช้แก้ปัญหา คือการใช้ ตารางเชื่อมกลาง (Join Table) หรือที่เรียกว่า:
Associative Entity หรือ Link Table
ตัวอย่าง:
Table A (project ) | Table B (village ) | Link Table (project_village ) |
---|---|---|
project_id | village_id | project_id , village_id |
ในระบบ GIS:
- ตาราง
amphoe
เชื่อมกับtambon
โดยผ่านamphoe_tambon_relation
- ตารางนี้จะมีหลาย
tambon_code
ที่สัมพันธ์กับamphoe_code
หนึ่งเดียว และในทางกลับกัน
📘 ประโยชน์ของความสัมพันธ์แบบ M:N ใน GIS
- ช่วยวิเคราะห์ความสัมพันธ์ระหว่าง หน่วยเชิงพื้นที่กับกิจกรรม/ข้อมูลเสริม
เช่น:- 1 ตำบลมีหลายโครงการ
- 1 โครงการดำเนินในหลายตำบล
- ใช้เชื่อมโยงกับข้อมูลเชิงคุณลักษณะ เช่น:
- แผนที่พื้นที่เสี่ยงภัย กับหลายประเภทของภัยพิบัติ
- แผนที่ใช้ที่ดินกับหลายกิจกรรมเกษตรกรรม
- เหมาะกับการวิเคราะห์ในระบบ Overlay และ Thematic Mapping
✅ ข้อควรระวัง
- ความสัมพันธ์แบบ M:N ซับซ้อนและอาจเข้าใจยาก
- ต้องออกแบบฐานข้อมูลอย่างมีโครงสร้าง โดยใช้ ตารางกลาง (Intermediate Table) เสมอ
- ต้องกำหนดคีย์ร่วม (
Composite Key
) เพื่อให้การเชื่อมโยงสมบูรณ์
📊 เปรียบเทียบรูปแบบความสัมพันธ์ในฐานข้อมูล GIS
ประเภทความสัมพันธ์ | ลักษณะการเชื่อมโยง | วิธีการใช้ใน GIS |
---|---|---|
One-to-One (1:1) | 1 → 1 | เก็บข้อมูลเฉพาะเพิ่มเติมแบบไม่ซ้ำ |
One-to-Many (1:N) | 1 → หลาย | พื้นที่เดียวมีหลายองค์ประกอบ (ex. ที่นา) |
Many-to-Many (M:N) | หลาย ↔ หลาย | พื้นที่/ข้อมูลเชื่อมโยงหลายรายการ |
🧾 สรุปเชิงวิชาการ
ความสัมพันธ์แบบกลุ่มต่อกลุ่ม (M:N) เป็นโครงสร้างที่จำเป็นต่อการจัดการข้อมูล GIS ที่มีลักษณะซับซ้อน เช่น การจัดการพื้นที่โครงการ, พื้นที่ที่อยู่ภายใต้หน่วยงานหลายฝ่าย หรือการวิเคราะห์พื้นที่ที่มีคุณลักษณะทับซ้อนหลายประเภท ซึ่งจำเป็นต้องใช้ตารางกลางในการอธิบายความสัมพันธ์ดังกล่าวอย่างชัดเจน

รูปที่ 5.9 การประยุกต์ใช้ความสัมพันธ์แบบกลุ่มต่อกลุ่มในระบบ GIS
ตัวอย่างโครงสร้างฐานข้อมูลแบบ Many-to-Many (M:N) สำหรับใช้ใน QGIS โดยเฉพาะเมื่อคุณต้องการจัดการความสัมพันธ์ระหว่าง ข้อมูลเชิงพื้นที่ (Spatial) กับ ข้อมูลเชิงคุณลักษณะ (Attribute) ที่มีความซับซ้อน เช่น:
“หลายพื้นที่สามารถเชื่อมโยงกับหลายกิจกรรม”
เช่น: 1 หมู่บ้านอาจเข้าร่วมหลายโครงการ และ 1 โครงการอาจดำเนินในหลายหมู่บ้าน
🧱 1. โครงสร้างฐานข้อมูล M:N ใน QGIS
📘 ตารางหลัก: village
(Feature Layer)
Field Name | Type | Key | Description |
---|---|---|---|
village_id | Integer | PK | รหัสหมู่บ้าน |
village_name | Text | ชื่อหมู่บ้าน | |
geometry | Geometry | Polygon (ขอบเขตหมู่บ้าน) |
📗 ตารางรอง: project
(Attribute Table)
Field Name | Type | Key | Description |
---|---|---|---|
project_id | Integer | PK | รหัสโครงการ |
project_name | Text | ชื่อโครงการ | |
year | Integer | ปีงบประมาณ |
🔗 ตารางกลาง: village_project_link
(Relational Table)
Field Name | Type | Key | Description |
---|---|---|---|
link_id | Integer | PK | ลำดับการเชื่อมโยง |
village_id | Integer | FK → village.village_id | รหัสหมู่บ้าน |
project_id | Integer | FK → project.project_id | รหัสโครงการ |
role | Text | บทบาทของหมู่บ้านในโครงการ |
🔧 2. การใช้งานใน QGIS
ขั้นตอนการเชื่อมข้อมูล (Relational Join)
- เปิด Project ใน QGIS
- ไปที่เมนู Project > Properties > Relations
- สร้างความสัมพันธ์ดังนี้:
ความสัมพันธ์ที่ 1:
- ชื่อ: village_has_projects
- Referencing Layer:
village_project_link
- Referenced Layer:
village
- Field Match:
village_project_link.village_id
→village.village_id
ความสัมพันธ์ที่ 2:
- ชื่อ: project_in_villages
- Referencing Layer:
village_project_link
- Referenced Layer:
project
- Field Match:
village_project_link.project_id
→project.project_id
- เมื่อสร้างความสัมพันธ์เสร็จแล้ว ให้กลับไปดูที่ Attribute Form ของแต่ละหมู่บ้านหรือโครงการ จะพบ แท็บย่อยที่แสดงความสัมพันธ์แบบหลายรายการ ซึ่งสามารถดูหรือเพิ่มได้
🧪 ตัวอย่างการใช้งาน
- สืบค้นว่าหมู่บ้านใดเข้าร่วมโครงการ “เกษตรพอเพียง” ปี 2566
- ดูว่ามีโครงการใดดำเนินการใน
village_id = 106501
ตั้งแต่ปี 2564–2567 - ใช้ form widget ใน QGIS เพื่อ เพิ่มโครงการใหม่ให้หมู่บ้านได้โดยตรง
✅ ข้อดีของ M:N Structure ใน QGIS
- รองรับการแสดง ข้อมูลซ้อนกัน (overlay) เช่น โครงการซ้อนทับกัน
- รองรับการวิเคราะห์แบบ relational เช่น การหาความถี่ของโครงการในแต่ละพื้นที่
- ใช้ form view ใน QGIS สำหรับการป้อนข้อมูลแบบ relational ได้ทันที