ความแตกต่างระหว่างการเข้าร่วม theta, Equijoin และการเข้าร่วมตามธรรมชาติ


98

ฉันมีปัญหาในการทำความเข้าใจเกี่ยวกับพีชคณิตเชิงสัมพันธ์เมื่อพูดถึงการรวมทีต้า, สมดุลและการรวมธรรมชาติ ใครช่วยกรุณาช่วยให้ฉันเข้าใจดีขึ้นได้ไหม ถ้าฉันใช้เครื่องหมาย = ในการเข้าร่วม theta จะเหมือนกับการใช้การเข้าร่วมแบบธรรมชาติหรือไม่?


คำพูดที่เป็นปัญหาจากเงินรางวัล ... เขาไม่ได้อ้างถึง Codd ที่นั่นเขาอ้างจากคำตอบของฉันที่ความคิดเห็นของเขาปรากฏอยู่ข้างใต้
heisenberg

คำตอบ:


145

การเข้าร่วม thetaช่วยให้สามารถเปรียบเทียบความสัมพันธ์โดยพลการ (เช่น≥)

equijoinเป็นทีเข้าร่วมโดยใช้ประกอบความเสมอภาค

การรวมตามธรรมชาติคือ Equijoin สำหรับแอตทริบิวต์ที่มีชื่อเดียวกันในแต่ละความสัมพันธ์

นอกจากนี้การรวมแบบธรรมชาติจะลบคอลัมน์ที่ซ้ำกันซึ่งเกี่ยวข้องกับการเปรียบเทียบความเท่าเทียมกันดังนั้นคอลัมน์ที่เปรียบเทียบแต่ละคอลัมน์จะเหลือเพียง 1 คอลัมน์ ในแง่พีชคณิตเชิงสัมพันธ์คร่าวๆ: ⋈ = πR,S-as ○ ⋈aR=aS


13
การรวมตามธรรมชาติจะลบคอลัมน์ที่มีชื่อเดียวกัน
Bogdan Gavril MSFT

2
ทั้งหมดหรือทั้งหมด แต่อย่างใดอย่างหนึ่ง?
Christopher Shroba

Equijoin จะลบคอลัมน์ความเท่าเทียมกันหากมีชื่อเดียวกันในทั้งสองตาราง
Vishal R

1
@outis, "theta" ใน "theta join" แปลว่าอะไร?
Pacerier

3
@Pacerier: ในอดีตการthetaเข้าร่วมใน theta หมายถึงเงื่อนไขโดยพลการที่ใช้เป็นเกณฑ์สำหรับการเข้าร่วม (ดูระบบฐานข้อมูล: หนังสือฉบับสมบูรณ์โดย Garcia-Molina, Ullman, Widom, ตอนที่ 2, Theta Join)
Ram ราชโมนี

59

ในขณะที่คำตอบที่อธิบายความแตกต่างนั้นใช้ได้ดี แต่ฉันต้องการแสดงให้เห็นว่าพีชคณิตเชิงสัมพันธ์เปลี่ยนเป็น SQL ได้อย่างไรและค่าที่แท้จริงของ 3 แนวคิดคืออะไร

แนวคิดหลักในคำถามของคุณคือแนวคิดของการเข้าร่วม เพื่อให้เข้าใจถึงการเข้าร่วมคุณจำเป็นต้องเข้าใจผลิตภัณฑ์คาร์ทีเซียน (ตัวอย่างนี้ขึ้นอยู่กับ SQL ซึ่งสิ่งที่เทียบเท่าเรียกว่าการรวมแบบไขว้ในวันเดียวเมื่อชี้ให้เห็น)

สิ่งนี้ไม่มีประโยชน์ในทางปฏิบัติ ลองพิจารณาตัวอย่างนี้

Product(PName, Price)
====================
Laptop,   1500
Car,      20000
Airplane, 3000000


Component(PName, CName, Cost)
=============================
Laptop, CPU,    500
Laptop, hdd,    300
Laptop, case,   700
Car,    wheels, 1000

ผลิตภัณฑ์ผลิตภัณฑ์ Cartesian x ตัวแทนจะได้รับ - ร้องหรือซอ SQL คุณจะเห็นว่ามี 12 แถว = 3 x 4 เห็นได้ชัดว่าแถวอย่าง "แล็ปท็อป" ที่มี "ล้อ" ไม่มีความหมายนี่คือเหตุผลว่าทำไมในทางปฏิบัติผลิตภัณฑ์คาร์ทีเซียนจึงไม่ค่อยได้ใช้

|    PNAME |   PRICE |  CNAME | COST |
--------------------------------------
|   Laptop |    1500 |    CPU |  500 |
|   Laptop |    1500 |    hdd |  300 |
|   Laptop |    1500 |   case |  700 |
|   Laptop |    1500 | wheels | 1000 |
|      Car |   20000 |    CPU |  500 |
|      Car |   20000 |    hdd |  300 |
|      Car |   20000 |   case |  700 |
|      Car |   20000 | wheels | 1000 |
| Airplane | 3000000 |    CPU |  500 |
| Airplane | 3000000 |    hdd |  300 |
| Airplane | 3000000 |   case |  700 |
| Airplane | 3000000 | wheels | 1000 |

เข้าร่วมเพื่อเพิ่มมูลค่าให้กับผลิตภัณฑ์เหล่านี้ สิ่งที่เราต้องการจริงๆคือ "เข้าร่วม" ผลิตภัณฑ์กับส่วนประกอบที่เกี่ยวข้องเนื่องจากส่วนประกอบแต่ละชิ้นเป็นของผลิตภัณฑ์ วิธีดำเนินการคือเข้าร่วม:

สินค้าเข้าร่วมส่วนประกอบบน Pname

แบบสอบถาม SQL ที่เกี่ยวข้องจะเป็นเช่นนี้ (คุณสามารถเล่นกับตัวอย่างทั้งหมดได้ที่นี่ )

SELECT *
FROM Product
JOIN Component
  ON Product.Pname = Component.Pname

และผลลัพธ์:

|  PNAME | PRICE |  CNAME | COST |
----------------------------------
| Laptop |  1500 |    CPU |  500 |
| Laptop |  1500 |    hdd |  300 |
| Laptop |  1500 |   case |  700 |
|    Car | 20000 | wheels | 1000 |

สังเกตว่าผลลัพธ์มีเพียง 4 แถวเนื่องจากแล็ปท็อปมีส่วนประกอบ 3 ส่วนรถมี 1 และเครื่องบินไม่มี สิ่งนี้มีประโยชน์กว่ามาก

กลับไปที่คำถามของคุณการเข้าร่วมทั้งหมดที่คุณถามเป็นรูปแบบของการเข้าร่วมที่ฉันเพิ่งแสดงให้เห็น:

Natural Join = การเข้าร่วม (ส่วนคำสั่ง ON) ถูกสร้างขึ้นในคอลัมน์ทั้งหมดที่มีชื่อเดียวกัน จะลบคอลัมน์ที่ซ้ำกันออกจากผลลัพธ์ซึ่งตรงข้ามกับการรวมอื่น ๆ ทั้งหมด DBMS ส่วนใหญ่ (ระบบฐานข้อมูลที่สร้างโดยผู้จำหน่ายหลายรายเช่น SQL Server ของ Microsoft, MySQL ของ Oracle เป็นต้น) ไม่ต้องกังวลกับการสนับสนุนสิ่งนี้ แต่เป็นการปฏิบัติที่ไม่ดี (หรือจงใจเลือกที่จะไม่ใช้งาน) ลองนึกภาพว่านักพัฒนาเข้ามาและเปลี่ยนชื่อของคอลัมน์ที่สองในผลิตภัณฑ์จากราคาเป็นต้นทุน จากนั้นการรวมแบบธรรมชาติทั้งหมดจะทำใน PName AND on Cost ทำให้เป็น 0 แถวเนื่องจากไม่มีตัวเลขที่ตรงกัน

Theta Join = นี่คือการเข้าร่วมทั่วไปที่ทุกคนใช้เพราะช่วยให้คุณสามารถระบุเงื่อนไข (ส่วนคำสั่ง ON ใน SQL) คุณสามารถเข้าร่วมได้ตามเงื่อนไขที่คุณต้องการตัวอย่างเช่นผลิตภัณฑ์ที่มีตัวอักษร 2 ตัวแรกคล้ายกันหรือมีราคาที่แตกต่างกัน ในทางปฏิบัติมักไม่ค่อยเกิดขึ้น - ใน 95% ของกรณีที่คุณจะเข้าร่วมในเงื่อนไขความเท่าเทียมกันซึ่งนำเราไปสู่:

Equi Join = สิ่งที่ใช้กันทั่วไปในทางปฏิบัติ ตัวอย่างด้านบนคือการเข้าร่วม equi ฐานข้อมูลได้รับการปรับให้เหมาะสมสำหรับการรวมประเภทนี้! oposite ของการรวม equi คือการเข้าร่วมที่ไม่ใช่ equi กล่าวคือเมื่อคุณเข้าร่วมในเงื่อนไขอื่นที่ไม่ใช่ "=" ฐานข้อมูลไม่เหมาะสำหรับสิ่งนี้! ทั้งสองเป็นส่วนย่อยของการเข้าร่วมทีต้าทั่วไป การเข้าร่วมตามธรรมชาติยังเป็นการเข้าร่วมทีต้า แต่เงื่อนไข (ทีต้า) เป็นนัย

ที่มาของข้อมูล: มหาวิทยาลัย + ผู้พัฒนา SQL Server ที่ได้รับการรับรอง + เพิ่งเสร็จสิ้น MOO "Introduction to databases" จาก Stanford ดังนั้นฉันกล้าพูดว่าฉันมีพีชคณิตเชิงสัมพันธ์อยู่ในใจ


1
คุณใช้คำว่า 'ผลิตภัณฑ์คาร์ทีเซียน' ค่อนข้างหลวม ๆ ผลิตภัณฑ์ตัวดำเนินการเชิงสัมพันธ์ส่งผลให้เกิดความสัมพันธ์ (เหมือนกันกับตัวดำเนินการเชิงสัมพันธ์ทั้งหมด!) การCROSS JOINดำเนินการใน SQL ส่งผลให้เกิดนิพจน์ตาราง (แถวของคอลัมน์) การดำเนินการตั้งค่าผลิตภัณฑ์คาร์ทีเซียนส่งผลให้เกิดชุดคู่
onedaywhen

2
เมื่อคุณพูดว่า "ฐานข้อมูล" คุณหมายถึง "DBMS" ซึ่งเป็นความแตกต่างที่สำคัญเมื่อกล่าวถึง "แนวคิด"
onedaywhen

3
onedaywhen - ขอบคุณสำหรับความคิดเห็นที่เป็นประโยชน์! รู้สึกเหมือนการตรวจสอบโค้ด :) ฉันแก้ไขปัญหาผลิตภัณฑ์คาร์ทีเซียนและ DBMS ฉันคงความเห็นว่าการรวมแบบธรรมชาติเป็นเพียงความสนใจทางวิชาการและ DBMS ที่สำคัญเช่น SQL Server ไม่ได้ใช้สิ่งนี้โดยมีจุดประสงค์ - การเพิ่มเงื่อนไขจะนำไปสู่ความเข้าใจและการบำรุงรักษาโค้ดที่ดีขึ้นอย่างชัดเจน คำถามที่เกี่ยวข้อง: stackoverflow.com/questions/4826613/natural-join-in-sql-server
Bogdan Gavril MSFT

1
@HLGEM: อาจมีข้อโต้แย้งที่คล้ายกันSELECT * FROM...(และบางทีคุณอาจทำ) แต่มันเป็นภาษามันอยู่ในการใช้งาน SQL ทุกครั้งและฉันก็ใช้บ่อย (และฉันก็เดิมพันด้วย!) คำแนะนำไม่ใช่รหัสทั้งหมดที่เป็นรหัสการผลิต
onedaywhen

2
ปัญหาที่แท้จริงของคอลัมน์ที่รวม "ธรรมชาติ" ไม่ได้เกี่ยวกับการเปลี่ยนชื่อ แต่เป็นการเพิ่มชื่อใหม่ที่ต้องไม่ขัดแย้งกันระหว่างตารางที่รวมทั้งหมดในระบบ ใช้คอลัมน์ที่ใช้กันทั่วไปเช่น "name", "description", ... การใช้ "natural join" จะทำให้พวกเขาเข้าร่วมในขณะที่มันไร้สาระและอื่น ๆ เป็นการขัดต่อตรรกะทางธุรกิจและนำไปสู่ข้อผิดพลาด ใช่แล้ว "การเข้าร่วมโดยธรรมชาติ" เป็นสิ่งที่อันตราย มันบังคับให้คุณมีชื่อที่แตกต่างกันยกเว้น colulmns ของคีย์ (หลัก / ต่างประเทศ) และสูญเสีย "ระยะห่างของชื่อ"
LoganMzz

13

คำตอบของ @ outis นั้นดี: กระชับและถูกต้องตามความสัมพันธ์

อย่างไรก็ตามสถานการณ์มีความซับซ้อนกว่าเล็กน้อยเกี่ยวกับ SQL

พิจารณาฐานข้อมูลซัพพลายเออร์และชิ้นส่วนตามปกติแต่ใช้ใน SQL:

SELECT * FROM S NATURAL JOIN SP;

จะส่งคืนชุดผลลัพธ์ ** พร้อมคอลัมน์

SNO, SNAME, STATUS, CITY, PNO, QTY

SNOเข้าร่วมจะดำเนินการในคอลัมน์ที่มีชื่อเดียวกันในตารางทั้งสอง โปรดทราบว่า resultset SNOมีหกคอลัมน์และมีเพียงหนึ่งคอลัมน์

ตอนนี้ให้พิจารณา theta eqijoin โดยที่ชื่อคอลัมน์สำหรับการเข้าร่วมจะต้องระบุอย่างชัดเจน (ตัวแปรช่วงบวกSและSPจำเป็น):

SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;

resultset SNOจะมีเจ็ดคอลัมน์รวมทั้งสองคอลัมน์สำหรับ ชื่อของชุดผลลัพธ์คือสิ่งที่ SQL Standard อ้างถึงว่า "ขึ้นอยู่กับการนำไปใช้งาน" แต่อาจมีลักษณะดังนี้:

SNO, SNAME, STATUS, CITY, SNO, PNO, QTY

หรือบางทีนี่

S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY

กล่าวอีกนัยหนึ่งNATURAL JOINใน SQL สามารถพิจารณาลบคอลัมน์ที่มีชื่อซ้ำกันออกจากชุดผลลัพธ์ได้ (แต่อนิจจาจะไม่ลบแถวที่ซ้ำกัน - คุณต้องจำไว้ว่าต้องเปลี่ยนSELECTเป็นSELECT DISTINCTตัวคุณเอง)


** ฉันไม่ค่อยรู้ว่าผลของSELECT * FROM table_expression;มันคืออะไร ฉันรู้ว่ามันไม่ใช่ความสัมพันธ์เนื่องจากเหตุผลอื่น ๆ อาจมีคอลัมน์ที่มีชื่อซ้ำกันหรือคอลัมน์ที่ไม่มีชื่อ ฉันรู้ว่ามันไม่ใช่ชุดเนื่องจากเหตุผลอื่น ๆ ลำดับคอลัมน์มีความสำคัญ ไม่ใช่แม้แต่ตาราง SQL หรือนิพจน์ตาราง SQL ฉันเรียกมันว่าชุดผลลัพธ์


JOIN ... USING(...)เดียวกันจะไปสำหรับ
Benoit

ทำไมคุณถึงพูดว่า"ฉันไม่ค่อยรู้ว่าผลของSELECT * FROM table_expression;มันคืออะไร" ?
Pacerier

@Pacerier: เอ่อเพราะฉันไม่รู้ว่ามันคืออะไร! ครั้งล่าสุดที่ฉันดู SQL Standard หลีกเลี่ยงการกำหนดว่ามันคืออะไร ฉันรู้ว่ามันไม่ใช่อะไร (ไม่ใช่ความสัมพันธ์ไม่ใช่เซตไม่ใช่ตารางไม่ใช่นิพจน์ตาราง) ดังนั้นเพื่อความสะดวกในการอ้างอิงฉันจึงใช้คำว่า 'resultset' ของตัวเอง โปรดสังเกตว่าในโมเดลเชิงสัมพันธ์ผลลัพธ์ของการดำเนินการที่เกี่ยวข้องกับสองความสัมพันธ์คือความสัมพันธ์ ไม่สามารถสร้างคำสั่งเทียบเท่าสำหรับ SQL AFAIK
58

11

Natural เป็นส่วนย่อยของ Equi ซึ่งเป็นส่วนย่อยของ Theta

ถ้าฉันใช้เครื่องหมาย = ในการเข้าร่วม theta มันเหมือนกับการใช้การเข้าร่วมแบบธรรมชาติทุกประการ ???

ไม่จำเป็น แต่มันจะเป็น Equi หมายถึงธรรมชาติที่คุณจับคู่กับคอลัมน์ที่มีชื่อคล้ายกันทั้งหมด Equi เพียงหมายความว่าคุณกำลังใช้ '=' เท่านั้น (และไม่ 'น้อยกว่า' เช่น ฯลฯ )

นี่เป็นสถาบันการศึกษาที่บริสุทธิ์คุณสามารถทำงานกับฐานข้อมูลเชิงสัมพันธ์ได้เป็นเวลาหลายปีและไม่เคยได้ยินใครใช้คำเหล่านี้


ฉันสงสัยว่าเมื่อคุณพูดว่า "ฐานข้อมูลเชิงสัมพันธ์" ฉันสงสัยว่าคุณหมายถึงอย่างอื่นเช่น "SQL"
onedaywhen

งานที่ไม่ใช่สถาบันการศึกษากับฐานข้อมูลเชิงสัมพันธ์ที่ไม่ใช่ SQL? คุณหมายถึงผลิตภัณฑ์ใด?
onedaywhen

3
ในพีชคณิตดั้งเดิมของ Codd การรวมตามธรรมชาติเป็นประเภทพื้นฐานของการเข้าร่วมในขณะที่ "การเข้าร่วม" หรือ equi- หรือ theta- เป็นชวเลขสำหรับ NJ (เช่นผลิตภัณฑ์ข้าม) ตามด้วยข้อ จำกัด "Natural เป็นส่วนย่อยของ Equi ซึ่งเป็นส่วนย่อยของ Theta" โดยสันนิษฐานว่าหมายความว่าทุก NJ สามารถแสดงเป็น EJ หรือ TJ ได้เช่นกัน ฉันคิดว่ามันเป็นจริงถ้าσ 1 = 1 (A x B) นับเป็น Equijoin ซึ่งในกรณีนี้การดำเนินการทุกอย่างของพีชคณิตเชิงสัมพันธ์สามารถแสดงเป็น Equijoin ในรูปแบบนั้นได้ ความคลุมเครือก็คือมีตัวดำเนินการพื้นฐานที่เป็นไปได้มากกว่าหนึ่งชุดสำหรับ RA
nvogel

2
@EricFail: sqlvogel เป็นเพียงการอ้างคำตอบของ kekekela แทนที่จะเป็นอะไรจาก Codd หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับงานเขียนของ Codd เกี่ยวกับการเข้าร่วม (θหรืออื่น ๆ ) คุณอาจลอง "ความสัมพันธ์แบบจำลองสำหรับการจัดการฐานข้อมูล" หรือวิธีการทำงานของคุณผ่านเขาบรรณานุกรม
outis

1
... คำถามที่คุณเชื่อมโยงมีคำตอบที่ใกล้เคียงกับสิ่งที่คุณกำลังมองหาซึ่งอาจจะใกล้เคียงที่สุด มันเชื่อมโยงไปสัมพันธ์ความครบถ้วนของฐานข้อมูลภาษาย่อย หน้า 10 อธิบายการเชื่อมต่อระหว่างθ, = และการรวมแบบธรรมชาติ (แม้ว่า natural จะไม่ใช่เซตย่อยของ = ในสูตรของ Codd อย่างเคร่งครัด แต่เป็นการคาดคะเนของ = -joins)
outis

8

เข้าร่วม Theta: เมื่อคุณสร้างแบบสอบถามสำหรับการเข้าร่วมโดยใช้ตัวดำเนินการใด ๆ (เช่น =, <,>,> = ฯลฯ ) แบบสอบถามการเข้าร่วมนั้นจะอยู่ภายใต้การเข้าร่วม Theta

Equi Join: เมื่อคุณสร้างแบบสอบถามสำหรับการเข้าร่วมโดยใช้ตัวดำเนินการความเท่าเทียมกันเท่านั้นแบบสอบถามการเข้าร่วมนั้นจะอยู่ภายใต้การเข้าร่วม Equi

ตัวอย่าง:

> เลือก * จาก Emp JOIN Dept บน Emp.DeptID = Dept.DeptID;
> เลือก * จาก Emp INNER JOIN Dept USING (DeptID)
สิ่งนี้จะแสดง:
 _________________________________________________
| Emp.Name | Emp.DeptID | ฝ่ายชื่อ | Dept.DeptID |
| | | | |

หมายเหตุ: การเข้าร่วม Equi ยังเป็นการเข้าร่วม theta!

Natural Join: Equi Join ประเภทหนึ่งซึ่งเกิดขึ้นโดยปริยายโดยการเปรียบเทียบคอลัมน์ชื่อเดียวกันทั้งหมดในทั้งสองตาราง

หมายเหตุ: ที่นี่ผลการรวมมีคอลัมน์เดียวสำหรับคอลัมน์ที่มีชื่อเดียวกันแต่ละคู่

ตัวอย่าง

 เลือก * จาก Emp NATURAL JOIN Dept
สิ่งนี้จะแสดง:
 _______________________________
| DeptID | Emp.Name | ฝ่ายชื่อ |
| | | |

1

ผลคูณคาร์ทีเซียนของตารางสองตารางให้การรวมกันของทูเปิลที่เป็นไปได้ทั้งหมดเช่นตัวอย่างในคณิตศาสตร์ผลคูณสองชุด เนื่องจากหลายครั้งมีค่าขยะบางอย่างที่ใช้พื้นที่ที่ไม่จำเป็นในหน่วยความจำด้วยดังนั้นการรวมเข้าด้วยกันจึงเข้ามาช่วยเหลือซึ่งจะรวมเฉพาะค่าแอตทริบิวต์ที่จำเป็นและมีความหมาย

การรวมภายในให้ฟิลด์ที่ซ้ำกันในตารางสองครั้งในขณะที่การรวมแบบธรรมชาติที่นี่จะช่วยแก้ปัญหาได้โดยเพียงแค่กรองคอลัมน์ที่ซ้ำแล้วแสดงเพียงครั้งเดียวจากนั้นทั้งสองจะทำงานเหมือนกัน การรวมแบบธรรมชาติมีประสิทธิภาพมากกว่าเนื่องจากรักษาหน่วยความจำนอกจากนี้ความซ้ำซ้อนจะถูกลบออกในการรวมตามธรรมชาติ

การรวม equi ของสองตารางคือการแสดงเฉพาะสิ่งที่ตรงกับค่าในตารางอื่น ตัวอย่างเช่นให้ new1 และ new2 เป็นสองตาราง ถ้า sql query เลือก * จาก new1 เข้าร่วม new2 บน new1.id = new.id (id คือคอลัมน์เดียวกันในสองตาราง) จากนั้นเริ่มจากตาราง new2 และเข้าร่วมซึ่งตรงกับ id ในตารางที่สอง นอกจากนี้การเข้าร่วมที่ไม่ใช่ equi ไม่มีตัวดำเนินการความเท่าเทียมกันที่พวกเขามี <,> และระหว่างตัวดำเนินการ

การเข้าร่วม theta ประกอบด้วยตัวดำเนินการเปรียบเทียบทั้งหมดรวมถึงความเท่าเทียมกันและตัวดำเนินการเปรียบเทียบอื่น ๆ <,> เมื่อใช้ตัวดำเนินการความเท่าเทียมกัน (=) จะเรียกว่าการเข้าร่วม equi


0

การเข้าร่วมตามธรรมชาติ: การเข้าร่วมตามธรรมชาติสามารถเกิดขึ้นได้เมื่อมีคุณสมบัติทั่วไปอย่างน้อยหนึ่งอย่างในสองความสัมพันธ์

การเข้าร่วม Theta: การเข้าร่วม Theta สามารถเกิดขึ้นได้เมื่อทั้งสองปฏิบัติตามเงื่อนไขเฉพาะ

การเข้าร่วม Equi: Equi สามารถเกิดขึ้นได้เมื่อทั้งสองดำเนินการตามเงื่อนไขความเป็นเจ้าของ เป็นการเข้าร่วมทีต้าประเภทหนึ่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.