ตัวอย่างเช่นฉันต้องการดึงข้อมูลผู้ใช้และหมายเลขโทรศัพท์และที่อยู่อีเมลทั้งหมดของเขา หมายเลขโทรศัพท์และอีเมลจะถูกเก็บไว้ในตารางแยกต่างหากผู้ใช้หนึ่งรายไปยังโทรศัพท์ / อีเมลจำนวนมาก ฉันสามารถทำได้ค่อนข้างง่าย:
SELECT * FROM users user
LEFT JOIN emails email ON email.user_id=user.id
LEFT JOIN phones phone ON phone.user_id=user.id
ปัญหานี้คือการส่งคืนชื่อผู้ใช้ DOB สีที่ชื่นชอบและข้อมูลอื่น ๆ ทั้งหมดที่จัดเก็บในตารางผู้ใช้ซ้ำแล้วซ้ำอีกสำหรับแต่ละระเบียน (ผู้ใช้บันทึกอีเมลโทรศัพท์) สันนิษฐานว่ากินแบนด์วิดท์ ลงผลลัพธ์
จะดีกว่าไหมถ้ามันส่งคืนแถวเดียวสำหรับผู้ใช้แต่ละคนและภายในบันทึกนั้นมีรายการอีเมลและรายการโทรศัพท์หรือไม่ มันจะทำให้ข้อมูลทำงานได้ง่ายขึ้นด้วยเช่นกัน
ฉันรู้ว่าคุณสามารถรับผลลัพธ์เช่นนี้โดยใช้ LINQ หรือกรอบงานอื่น ๆ แต่ดูเหมือนว่ามันจะเป็นจุดอ่อนในการออกแบบฐานข้อมูลเชิงสัมพันธ์
เราสามารถแก้ไขได้โดยใช้ NoSQL แต่ไม่ควรมีพื้นกลางบ้าง
ฉันพลาดอะไรไปรึเปล่า? ทำไมจึงไม่มีสิ่งนี้
* ใช่มันถูกออกแบบด้วยวิธีนี้ ฉันเข้าใจแล้ว ฉันสงสัยว่าทำไมไม่มีทางเลือกอื่นให้ทำงานด้วยได้ง่ายขึ้น SQL สามารถทำสิ่งที่มันทำอยู่ต่อไป แต่จากนั้นพวกเขาสามารถเพิ่มคำสำคัญหรือสองคำเพื่อทำ post-processing เล็กน้อยที่ส่งคืนข้อมูลในรูปแบบซ้อนกันแทนที่จะเป็นผลิตภัณฑ์คาร์ทีเซียน
ฉันรู้ว่านี้สามารถทำได้ในภาษาสคริปต์ที่คุณเลือก แต่ต้องว่าเซิร์ฟเวอร์ SQL ทั้งส่งข้อมูลซ้ำซ้อน (ตัวอย่างด้านล่าง) SELECT email FROM emails WHERE user_id IN (/* result of first query */)
หรือว่าคุณจะออกคำสั่งหลายตัวเช่น
แทนที่จะให้ MySQL คืนสิ่งที่คล้ายกับนี้:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "johnsmith45@gmail.com",
},
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "john@smithsunite.com",
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"email": "originaljane@deerclan.com",
}
]
แล้วต้องจัดกลุ่มตัวระบุที่ไม่ซ้ำกัน (ซึ่งหมายความว่าฉันต้องดึงข้อมูลนั้นด้วย!) ฝั่งไคลเอ็นต์เพื่อจัดรูปแบบผลลัพธ์ใหม่ตามที่คุณต้องการเพียงคืนค่านี้:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"emails": ["johnsmith45@gmail.com", "john@smithsunite.com"]
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"emails": ["originaljane@deerclan.com"],
}
]
อีกวิธีหนึ่งฉันสามารถออก 3 ข้อความค้นหา: 1 สำหรับผู้ใช้, 1 สำหรับอีเมลและ 1 สำหรับหมายเลขโทรศัพท์ แต่จากนั้นชุดผลลัพธ์อีเมลและหมายเลขโทรศัพท์จำเป็นต้องมี user_id เพื่อให้ฉันสามารถจับคู่สำรองกับผู้ใช้ได้ ฉันดึงข้อมูลมาก่อนหน้านี้ ข้อมูลซ้ำซ้อนและการประมวลผลภายหลังที่ไม่จำเป็นอีกครั้ง