# ภาพรวม เพื่อให้ฐานข้อมูลเป็นระเบียบ มีมาตรฐาน และเข้าใจง่าย เราได้ออกแบบ **โครงสร้างของข้อมูล (Schema)** เพื่อกำหนดว่า Node กี่ประเภท ในแต่ละประเภทมี Property อะไร และ Node เหล่านั้นสามารถเชื่อมต่อกันเพื่อสร้างความสัมพันธ์อย่างไรได้บ้าง เราออกแบบ Schema ของ Politigraph จาก [Popolo - International Open Government Data Specifications](https://www.popoloproject.com/) พร้อมกับการปรับปรุงให้เข้ากับ Context ของประเทศไทย ซึ่ง **Schema** จะประกอบด้วย 1. **Object**: ประเภทของ Node ข้อมูลจริง พร้อมระบุ Property ที่มีใน Node ประเภทนั้นๆ 2. **Interface**: ประเภทที่เป็นข้อกำหนดพื้นฐานให้ประเภทอื่นๆ นำไปใช้ต่อ 3. **Union**: เซ็ตของประเภทที่เป็นไปได้ 4. **Relationship**: ความสัมพันธ์ที่เป็นไปได้ระหว่าง Node ประเภทต่างๆ ลองเลือก Entity ต่างๆ เพื่ออ่านคำอธิบาย _The interactive schema diagram is not available in plain text. The complete GraphQL schema is at https://politigraph.wevis.info/schema.graphql_ ## Node ยกตัวอย่างเช่น เรามีข้อมูลของคนที่มีชื่อขึ้นต้นด้วยคำว่า "ณัฐ" เป็น Node ประเภท **`Person`** ดังนั้นทั้งสามคน จะมี Property และ Relationship มากกว่าตามที่กำหนดไว้ใน **`Person`** **Schema** ไม่ได้ (แต่ไม่มี Property ที่ไม่ได้บังคับได้ ในกรณีนี้ Property นั้นๆ จะมีค่าเป็น _null_) ```graphql query People($where: PersonWhere) { people(where: $where) { id prefix name image birth_date educations previous_occupations } } ``` Variables: ```json { "where": { "firstname": { "startsWith": "ณัฐ" } } } ``` [Run this query in the playground](https://politigraph.wevis.info/graphql?explorerURLState=N4IgJg9gxgrgtgUwHYBcQC4QEcYIE4CeABAAoIQAOANggBQAkA7gBb4Lqn4DOESA6qzwIAlEWAAdJESIVy1OizYcmgkWMnTpASzAbNFIQDMtADz3SkAQ0TmiWuJYDmCWwCMteFMwD6YSyhcpTQQwGCh-LV4uWwMEADdImC5vaFgKCKi9AF9JLJAAGhA4yzwtS1caLgwQCSDxEEUheo5azSJ64zwuFCsbDHUgtvrukpQuPi0vZvaQQGQ4QEY4QAQ4etscoLW8rKA) ## Relationship Relationship ใน **Schema** จะมีชื่อเรียกพร้อมกับทิศทางตามหัวลูกศรเพื่อให้เราเข้าใจความสัมพันธ์ เช่น `Post--IN--> Organization` ทำให้เราเข้าใจว่า **`Post`** "อยู่ใน" **`Organization`** แต่ในกระบวนการ Query ข้อมูล เราสามารถเข้าถึง Relationship ได้ทั้งสองฝั่งของลูกศร ยกตัวอย่างเช่น **`Post`** มี Property `organizations` และ **`Organization`** มี Property `posts` ที่อ้างอิง Node ซึ่งอยู่อีกฝั่งของ Relationship นี้ ```graphql query Organizations($where: OrganizationWhere, $postsWhere2: PostWhere) { organizations(where: $where) { id name posts(where: $postsWhere2) { id label role organizations { id name } } } } ``` Variables: ```json { "where": { "id": { "eq": "คณะรัฐมนตรี-64" } }, "postsWhere2": { "role": { "eq": "นายกรัฐมนตรี" } } } ``` [Run this query in the playground](https://politigraph.wevis.info/graphql?explorerURLState=N4IgJg9gxgrgtgUwHYBcQC4QEcYIE4CeABAPJ4DmAhkgJYBelKNESAzgBQAkA7gBb4J0pCtXqNmSAOr88CADRFOABwisUraQIBMQgAqqUm2QEoiwADpIiRCCNoMmLDnwFCeMhKYtXrRGmEtfIiRKREDfFTVnDzdI9SMELS9woP8U3wAbSgAjBAz06zwIDIQCmzsxRzYzMus0nyDrELCG3wBfdI6fLraQORAAN0o8GhyS1gwQb2tzEBdZWaFp31m0jBrWmZAELEWiWcAQOEBkOEAGOEBiOEBGOEAEOEBCOEBMOEBUODPAVjgAWgA2ABZZzvC2uXCsziGg8Wj2yy2RRK4LKsx2e1md0ATHCAIjhAIBwl1ujxeP1aXWsPRAbSAA)