แชร์ผ่าน


จัดการความสัมพันธ์ใน Fabric API สําหรับ GraphQL

ความสัมพันธ์จะเปลี่ยน GraphQL API ของคุณจากการเข้าถึงข้อมูลอย่างง่ายเป็นกราฟที่ทรงพลังซึ่งสะท้อนให้เห็นว่าหน่วยงานธุรกิจของคุณเชื่อมต่อกันอย่างไร แทนที่จะบังคับให้ลูกค้าโทรไปกลับหลายครั้งและต่อข้อมูลเข้าด้วยกันด้วยตนเองความสัมพันธ์ช่วยให้คุณสามารถดึงข้อมูลที่เกี่ยวข้องที่ซ้อนกันอย่างลึกซึ้งในคิวรีเดียวโดยดึงข้อมูลลูกค้าคําสั่งซื้อผลิตภัณฑ์ในคําสั่งซื้อเหล่านั้นและหมวดหมู่ผลิตภัณฑ์ทั้งหมดในคราวเดียว

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

Fabric API สําหรับ GraphQL รองรับรูปแบบความสัมพันธ์สามรูปแบบที่ครอบคลุมสถานการณ์การสร้างแบบจําลองข้อมูลทั่วไปทั้งหมด:

  • แบบตัวต่อตัว (1:1): แต่ละเรกคอร์ดในชนิดหนึ่งเกี่ยวข้องกับเรกคอร์ดหนึ่งในอีกชนิดหนึ่ง (เช่น Product → ProductCategory ซึ่งแต่ละผลิตภัณฑ์มีหนึ่งประเภท)
  • หนึ่งต่อกลุ่ม (1:N): แต่ละเรกคอร์ดในชนิดหนึ่งเกี่ยวข้องกับหลายเรกคอร์ดในอีกชนิดหนึ่ง (ตัวอย่าง: ProductCategory → Product ซึ่งแต่ละประเภทมีผลิตภัณฑ์จํานวนมาก)
  • กลุ่มต่อกลุ่ม (M:N): เรกคอร์ดในทั้งสองชนิดสามารถเกี่ยวข้องกับหลายเรกคอร์ดในชนิดอื่น (ตัวอย่าง: ผลิตภัณฑ์ SalesOrderHeader ↔ ซึ่งใบสั่งมีผลิตภัณฑ์หลายรายการและผลิตภัณฑ์ปรากฏในใบสั่งหลายรายการ)

การสร้างแบบจําลองความสัมพันธ์เหล่านี้ในสคีมา GraphQL จะช่วยสร้าง API ที่ใช้งานง่ายซึ่งสะท้อนถึงโมเดลโดเมนของคุณและลดความซับซ้อนของโค้ดแอปพลิเคชันไคลเอ็นต์ได้อย่างมาก

ข้อกําหนดเบื้องต้น

ก่อนสร้างความสัมพันธ์ คุณต้อง:

  • อย่างน้อยสองประเภทที่กําหนดไว้ใน GraphQL API Schema ของคุณ ตัวอย่างเช่น ถ้าคุณกําลังใช้ข้อมูลตัวอย่าง AdventureWorks คุณอาจมีชนิด เช่น Product, ProductCategory, SalesOrderHeaderและ SalesOrderDetail สร้างขึ้นแล้วจากตารางเลคเฮาส์หรือคลังสินค้าของคุณ หากคุณยังไม่มีประเภท โปรดดู สร้าง API สําหรับ GraphQL ใน Fabric และเพิ่มข้อมูล

  • การจับคู่ฟิลด์ (คีย์นอก) ระหว่างชนิดที่คุณต้องการเชื่อมโยง สําหรับความสัมพันธ์แบบหนึ่งต่อหนึ่งหรือหนึ่งต่อกลุ่ม คุณต้องมีเขตข้อมูลทั่วไปในทั้งสองชนิด เช่น ProductCategoryID ปรากฏในProductProductCategoryทั้ง และ ฟิลด์เหล่านี้ทําหน้าที่เป็นจุดเชื่อมต่อสําหรับความสัมพันธ์

  • ชนิดการเชื่อมโยง (ตารางรวมสัญญาณ) สําหรับความสัมพันธ์แบบกลุ่มต่อกลุ่ม หากคุณกําลังสร้างความสัมพันธ์แบบกลุ่มต่อกลุ่ม คุณต้องมีประเภทที่สามที่เชื่อมโยงอีกสองประเภท ตัวอย่างเช่น เมื่อต้องการเชื่อมโยง SalesOrderHeader และ Product ในความสัมพันธ์แบบกลุ่มต่อกลุ่ม คุณต้อง SalesOrderDetail เป็นชนิดการเชื่อมโยง ชนิดการเชื่อมโยงนี้ต้องมีคีย์นอกที่ชี้ไปยังทั้งสองชนิดที่คุณต้องการเชื่อมโยง (เช่น SalesOrderID และ ProductID) เรียนรู้เพิ่มเติมเกี่ยวกับความสัมพันธ์แบบกลุ่มต่อกลุ่ม

สร้างความสัมพันธ์แบบตัวต่อตัวใหม่

ความสัมพันธ์แบบหนึ่งต่อหนึ่งจะเชื่อมต่อสองชนิดโดยที่แต่ละเรกคอร์ดในชนิดหนึ่งเกี่ยวข้องกับเรกคอร์ดหนึ่งในอีกชนิดหนึ่ง สิ่งนี้มีประโยชน์เมื่อคุณมีข้อมูลที่เกี่ยวข้องซึ่งอาจอยู่ในตารางเดียวกัน แต่ถูกแยกออกจากกันด้วยเหตุผลด้านองค์กรหรือประสิทธิภาพ ตัวอย่างเช่น a Product อาจเกี่ยวข้องกับหนึ่ง ProductCategory ผ่าน ProductCategoryID ฟิลด์

ขั้นตอนต่อไปนี้แสดงวิธีการสร้างความสัมพันธ์แบบหนึ่งต่อหนึ่ง:

  1. จากบานหน้าต่าง ตัวสํารวจ Schema ให้เลือกจุดไข่ปลาถัดจากชนิด จากนั้นเลือกตัวเลือก จัดการความสัมพันธ์ หน้าจอ จัดการความสัมพันธ์ จะปรากฏขึ้น

    สกรีนช็อตแสดงตําแหน่งที่จะเลือกความสัมพันธ์ใหม่ในบานหน้าต่างจัดการความสัมพันธ์

  2. เลือก ความสัมพันธ์ใหม่ สําหรับตัวอย่างนี้ เราสร้างความสัมพันธ์แบบหนึ่งต่อหนึ่งใหม่ระหว่างชนิด ผลิตภัณฑ์ และชนิด ProductCategory โดยยึดตามเขตข้อมูล ProductCategoryID ที่มีอยู่ในทั้งสองชนิด เราเลือก หนึ่งต่อหนึ่ง สําหรับ คาร์ดินาลลิตี้ เลือก ชนิด จาก และ ถึง จากนั้นเลือกเขตข้อมูล จาก และ ถึง สําหรับความสัมพันธ์นี้

    สกรีนช็อตแสดงตัวอย่างการเลือกสําหรับฟิลด์ที่จําเป็นห้าฟิลด์สําหรับความสัมพันธ์ใหม่

หมายเหตุ

คุณสามารถเลือกหลายฟิลด์ในตัวเลือกฟิลด์ จาก และ ถึง คุณลักษณะนี้ช่วยให้คุณสามารถสร้างความสัมพันธ์ที่มีหลายฟิลด์

  1. เลือกสร้างความสัมพันธ์ ตอนนี้รายการของความสัมพันธ์จะแสดงความสัมพันธ์ที่สร้างขึ้นใหม่

  2. เลือก X ที่มุมขวาบนเพื่อปิดหน้าจอ จัดการความสัมพันธ์

ความสัมพันธ์ (1:N) แบบหนึ่งต่อกลุ่มและแบบกลุ่มต่อกลุ่ม (M:N)

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

ความสัมพันธ์แบบหนึ่งต่อกลุ่ม (1:N)

ความสัมพันธ์แบบหนึ่งต่อกลุ่มจะเชื่อมต่อเรกคอร์ดเดียวในชนิดหนึ่งกับหลายเรกคอร์ดในอีกชนิดหนึ่ง ตัวอย่างเช่น รายการเดียว ProductCategory มีระเบียนจํานวนมาก Product แต่แต่ละ Product ระเบียนจะอยู่ในประเภทเดียวเท่านั้น

เมื่อต้องการสร้างความสัมพันธ์แบบหนึ่งต่อกลุ่มระหว่าง ProductCategory และ Product ให้เลือก หนึ่งต่อกลุ่ม เป็นคาร์ดินาลลิตี้ ทําตามขั้นตอนเดียวกับความสัมพันธ์แบบหนึ่งต่อหนึ่ง แต่การตั้งค่าคาร์ดินาลลิตี้จะบอก GraphQL ว่าประเภทหนึ่งเกี่ยวข้องกับผลิตภัณฑ์จํานวนมาก

ความสัมพันธ์แบบกลุ่มต่อกลุ่ม (M:N)

ความสัมพันธ์แบบกลุ่มต่อกลุ่มจะเชื่อมต่อเรกคอร์ดที่ทั้งสองฝ่ายสามารถมีเรกคอร์ดที่เกี่ยวข้องกันได้หลายเรกคอร์ด ตัวอย่างเช่น a SalesOrderHeader สามารถมี Product หลายเรกคอร์ด และแต่ละ Product เรกคอร์ดสามารถปรากฏในหลายใบสั่ง ความสัมพันธ์เหล่านี้ต้องการชนิดการเชื่อมโยง (ตารางรวม) เพื่อจัดเก็บการเชื่อมต่อระหว่างสองชนิดหลัก

ในการสร้างความสัมพันธ์แบบกลุ่มต่อกลุ่มระหว่าง SalesOrderHeader และ Product คุณต้องมีชนิดการเชื่อมโยง SalesOrderDetail ชนิดการเชื่อมโยงนี้ประกอบด้วยคีย์นอกที่ชี้ไปยังทั้งสองชนิดที่คุณต้องการเชื่อมโยง

เมื่อต้องการสร้างความสัมพันธ์แบบกลุ่มต่อกลุ่ม:

  1. จากบานหน้าต่าง ตัวสํารวจ Schema ให้เลือกจุดไข่ปลาถัดจากชนิด จากนั้นเลือกตัวเลือก จัดการความสัมพันธ์ หน้าจอ จัดการความสัมพันธ์ จะปรากฏขึ้น
  2. เลือก ความสัมพันธ์ใหม่
  3. คาร์ดินาลลิตี้: เลือก กลุ่มต่อกลุ่ม และฟิลด์เพิ่มเติมสําหรับการเชื่อมโยงจะปรากฏขึ้น สกรีนช็อตของกล่องโต้ตอบความสัมพันธ์ใหม่สําหรับความสัมพันธ์แบบกลุ่มต่อกลุ่ม
  4. ชนิดจาก: เลือก SalesOrderHeader (ด้านหนึ่งของความสัมพันธ์)
  5. ชนิดการเชื่อมโยง: เลือก SalesOrderDetail (ตารางรวมที่เชื่อมต่อใบสั่งกับผลิตภัณฑ์)
  6. จากฟิลด์: เลือก SalesOrderID (ฟิลด์ใน SalesOrderHeader ที่เชื่อมโยงไปยังชนิดการเชื่อมโยง)
  7. การเชื่อมโยงจากฟิลด์: เลือก SalesOrderID (ฟิลด์ที่ตรงกันใน SalesOrderDetail ที่เชื่อมต่อกับ SalesOrderHeader)
  8. เมื่อต้องการพิมพ์: เลือก ผลิตภัณฑ์ (อีกด้านหนึ่งของความสัมพันธ์)
  9. เขตข้อมูลไปยัง: เลือก ProductID (เขตข้อมูลในผลิตภัณฑ์ที่เชื่อมโยงไปยังชนิดการเชื่อมโยง)
  10. การเชื่อมโยงไปยังฟิลด์: เลือก ProductID (ฟิลด์ที่ตรงกันใน SalesOrderDetail ที่เชื่อมต่อกับผลิตภัณฑ์)

แนวคิดหลัก: ชนิดการเชื่อมโยง (SalesOrderDetail) มีคีย์นอกสองคีย์ ซึ่งคีย์หนึ่งชี้ไปที่แต่ละชนิดที่คุณต้องการเชื่อมโยง "การเชื่อมโยงจากเขตข้อมูล" และ "การเชื่อมโยงไปยังเขตข้อมูล" เป็นทั้งเขตข้อมูล ในชนิดการเชื่อมโยง ในขณะที่ "เขตข้อมูลจาก" และ "เขตข้อมูลไปยัง" จะอยู่ในชนิดที่เกี่ยวข้อง

ข้อควรพิจารณาสําหรับความสัมพันธ์แบบกลุ่มต่อกลุ่ม

เมื่อคุณสร้างความสัมพันธ์แบบกลุ่มต่อกลุ่ม สิ่งที่ GraphQL สร้างขึ้นโดยอัตโนมัติจะขึ้นอยู่กับว่าชนิดการเชื่อมโยงของคุณมีเขตข้อมูลพิเศษนอกเหนือจากคีย์นอกสองคีย์หรือไม่

กฎทั่วไป:

  • ถ้าชนิดการเชื่อมโยงมี เขตข้อมูลเพิ่มเติม นอกเหนือจากคีย์นอก (ที่พบบ่อยที่สุด) GraphQL จะสร้างความสัมพันธ์แบบหนึ่งต่อกลุ่มสี่รายการที่แสดงชนิดการเชื่อมโยง วิธีนี้ช่วยให้คุณเข้าถึงฟิลด์เพิ่มเติมเหล่านั้นในคิวรีของคุณและนําทางระหว่างประเภทในทั้งสองทิศทาง
  • ถ้าชนิดการเชื่อมโยงมี เพียงสองคีย์นอก (พบได้น้อยกว่า) GraphQL จะสร้างเฉพาะความสัมพันธ์แบบกลุ่มต่อกลุ่มโดยตรง คุณสามารถสืบค้นได้โดยตรงระหว่างสองชนิดหลักโดยไม่ต้องอ้างอิงชนิดการเชื่อมโยง

การเชื่อมโยงชนิดกับเขตข้อมูลเพิ่มเติม (สถานการณ์ทั่วไป)

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

เมื่อคุณสร้างความสัมพันธ์แบบกลุ่มต่อกลุ่ม API จะสร้าง ความสัมพันธ์สี่รายการ ที่ปรากฏในรายการความสัมพันธ์ของคุณ ทําไมต้องสี่? เพราะคุณต้องการการนําทางแบบสองทิศทางระหว่างทั้งสามประเภท

ตัวอย่างเช่น ถ้า SalesOrderDetail มีฟิลด์เพิ่มเติม เช่น OrderQty, UnitPriceหรือ UnitPriceDiscount (นอกเหนือจากแค่ SalesOrderID และ ProductID) คุณจะเห็นความสัมพันธ์ทั้งสี่นี้ในพอร์ทัล:

  • SalesOrderHeaderSalesOrderDetail (หนึ่งต่อกลุ่ม): เริ่มต้นจากใบสั่งและแสดงรายการสินค้าทั้งหมดในบรรทัดเพื่อดูปริมาณและราคา
  • SalesOrderDetailSalesOrderHeader (กลุ่มต่อหนึ่ง): เริ่มต้นจากรายการโฆษณาและนําทางกลับเพื่อดูว่าเป็นของลําดับใด
  • →ผลิตภัณฑ์SalesOrderDetail (หนึ่งต่อกลุ่ม): เริ่มต้นจากผลิตภัณฑ์และดูคําสั่งซื้อทั้งหมดที่ปรากฏพร้อมปริมาณ
  • SalesOrderDetailProduct (กลุ่มต่อหนึ่ง): เริ่มต้นจากรายการโฆษณาและนําทางเพื่อดูว่ามีการสั่งซื้อผลิตภัณฑ์ใด

ความสัมพันธ์ทั้งสี่นี้ให้ความยืดหยุ่นอย่างสมบูรณ์แก่คุณในการเริ่มต้นจากชนิดใดก็ได้ (SalesOrderHeader, Product หรือ SalesOrderDetail) และนําทางไปยังชนิดอื่น ๆ ในขณะที่เข้าถึงฟิลด์เพิ่มเติม เช่น OrderQty และ UnitPrice ที่มีอยู่เฉพาะในชนิดการเชื่อมโยง

ประเภทการเชื่อมโยงด้วยคีย์ต่างประเทศเท่านั้น

ถ้า SalesOrderDetail มี เฉพาะSalesOrderIDProductID ฟิลด์และ (ไม่มีฟิลด์อื่น) API จะสร้าง ความสัมพันธ์แบบหนึ่งต่อกลุ่มสองความสัมพันธ์ ที่คุณจะเห็นในพอร์ทัล:

  • SalesOrderHeaderSalesOrderDetail (หนึ่งต่อกลุ่ม)
  • →ผลิตภัณฑ์SalesOrderDetail (หนึ่งต่อกลุ่ม)

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

ลบความสัมพันธ์

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

วิธีลบความสัมพันธ์:

  1. จากบานหน้าต่าง ตัวสํารวจ Schema ให้เลือกจุดไข่ปลาถัดจากชนิดที่มีความสัมพันธ์ แล้วเลือก จัดการความสัมพันธ์ หน้าจอ จัดการความสัมพันธ์ จะปรากฏขึ้นเพื่อแสดงความสัมพันธ์ทั้งหมดสําหรับชนิดที่เลือก

  2. เลือกช่องทําเครื่องหมายถัดจากความสัมพันธ์แต่ละรายการที่คุณต้องการลบ คุณสามารถเลือกความสัมพันธ์หลายรายการเพื่อลบออกในการดําเนินการเดียว

  3. เลือก ลบ จากแถบเครื่องมือ

  4. ยืนยันการลบเมื่อได้รับแจ้ง ความสัมพันธ์จะถูกลบออกจาก Schema GraphQL ของคุณ

เคล็ดลับ

ถ้าคุณสร้างความสัมพันธ์แบบกลุ่มต่อกลุ่มและต้องการเอาออก โปรดจําไว้ว่าคุณจะต้องลบความสัมพันธ์ทั้งสี่ความสัมพันธ์ (หรือความสัมพันธ์สองความสัมพันธ์ถ้าชนิดการเชื่อมโยงมีเฉพาะคีย์นอก) ที่สร้างขึ้น แต่ละความสัมพันธ์จะปรากฏเป็นรายการแยกต่างหากในรายการความสัมพันธ์