บทที่ 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_mappolygon_id(PK),soil_code(FK),geometry
- ตาราง
soil_seriessoil_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 ได้ทันที
