ฉันเพิ่งสะดุดกับคำถามนี้และแม้ว่ามันจะเป็นคำถามเก่า แต่ฉันคิดว่ามันจะมีประโยชน์ในการเพิ่มความเป็นไปได้สองสามอย่างที่ไม่ได้กล่าวถึงในคำตอบที่ได้รับ นอกจากนี้ยังมีสิ่งต่าง ๆ ที่เคลื่อนไหวอยู่เล็กน้อยในช่วงไม่กี่ปีที่ผ่านมาดังนั้นจึงควรเน้นว่า SQL และ NoSQL จะเข้าใกล้กันมากขึ้น
หนึ่งในผู้แสดงความคิดเห็นได้นำทัศนคติเตือนอย่างชาญฉลาดว่า“ หากข้อมูลมีความสัมพันธ์ให้ใช้ความสัมพันธ์” อย่างไรก็ตามความคิดเห็นนั้นมีความหมายเฉพาะในโลกสัมพันธ์ที่ซึ่ง schema มาก่อนแอปพลิเคชันเสมอ
โลกแห่งความสัมพันธ์: ข้อมูลโครงสร้าง> เขียนแอปพลิเคชันเพื่อรับ
NOSQL WORLD: แอปพลิเคชันการออกแบบ> ข้อมูลโครงสร้างตามลำดับ
แม้ว่าข้อมูลจะสัมพันธ์กัน NoSQL ก็ยังเป็นตัวเลือก ตัวอย่างเช่นความสัมพันธ์แบบหนึ่งต่อหลายคนไม่มีปัญหาและครอบคลุมในMongoDB เอกสารอย่างกว้างขวาง
แนวทางแก้ไขปัญหาของปีพ. ศ
เนื่องจากคำถามนี้ถูกโพสต์มีความพยายามอย่างจริงจังที่จะทำให้ noSQL ใกล้เคียงกับ SQL มากขึ้น ทีมนำโดย Yannis Papakonstantinou ที่มหาวิทยาลัยแคลิฟอร์เนีย (ซานดิเอโก) ได้ทำงานต่อไปการดำเนินการของ SQL ++ ซึ่งเร็ว ๆ นี้อาจเป็นวิธีการแก้ปัญหาถาวรเช่นเดียวกับที่โพสต์ที่นี่
ในระดับที่ปฏิบัติได้มากขึ้นการเปิดตัว Couchbase 4.0 นั้นหมายความว่าเป็นครั้งแรกที่คุณสามารถเข้าร่วมพื้นเมืองใน NoSQL ได้ พวกเขาใช้ N1QL ของตัวเอง นี่คือตัวอย่างของการสอนJOIN
จาก:
SELECT usr.personal_details, orders
FROM users_with_orders usr
USE KEYS "Elinor_33313792"
JOIN orders_with_users orders
ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END
N1QL อนุญาตการดำเนินงาน SQL ส่วนใหญ่ถ้าไม่ใช่ทั้งหมดรวมถึง aggregration การกรองและอื่น ๆ
โซลูชันไฮบริดที่ไม่แปลกใหม่
หาก MongoDB ยังคงเป็นตัวเลือกเดียวฉันต้องการกลับไปยังจุดของฉันว่าแอปพลิเคชันควรมีความสำคัญเหนือกว่าโครงสร้างของข้อมูล ไม่มีคำตอบใด ๆ ที่กล่าวถึงการฝังแบบไฮบริดโดยข้อมูลที่ถูกสอบถามส่วนใหญ่จะถูกฝังอยู่ในเอกสาร / วัตถุและการอ้างอิงจะถูกเก็บไว้สำหรับกรณีส่วนน้อย
ตัวอย่าง: ข้อมูล (นอกเหนือจากชื่อบทบาท) สามารถรอได้หรือไม่ สามารถบูตแอปพลิเคชันได้เร็วขึ้นโดยไม่ได้ร้องขออะไรที่ผู้ใช้ไม่ต้องการหรือยัง
อาจเป็นกรณีนี้หากผู้ใช้ลงชื่อเข้าใช้และเขา / เธอต้องการที่จะเห็นตัวเลือกทั้งหมดสำหรับบทบาททั้งหมดที่เขา / เธอเป็น อย่างไรก็ตามผู้ใช้เป็น“ วิศวกร” และตัวเลือกสำหรับบทบาทนี้ไม่ค่อยได้ใช้ ซึ่งหมายความว่าแอปพลิเคชันจะต้องแสดงตัวเลือกสำหรับวิศวกรในกรณีที่เขา / เธอต้องการที่จะคลิกที่พวกเขา
สามารถทำได้ด้วยเอกสารที่บอกแอปพลิเคชันในตอนเริ่มต้น (1) ว่าบทบาทใดที่ผู้ใช้เป็นเจ้าของและ (2) สถานที่ที่จะรับข้อมูลเกี่ยวกับเหตุการณ์ที่เชื่อมโยงกับบทบาทเฉพาะ
{_id: ObjectID(),
roles: [[“Engineer”, “ObjectId()”],
[“Administrator”, “ObjectId()”]]
}
หรือดียิ่งขึ้นทำดัชนีฟิลด์ role.name ในการรวบรวมบทบาทและคุณอาจไม่จำเป็นต้องฝัง ObjectID () เช่นกัน
อีกตัวอย่างหนึ่งคือข้อมูลเกี่ยวกับบทบาททั้งหมดที่ร้องขอตลอดเวลาหรือไม่
อาจเป็นกรณีที่ผู้ใช้เข้าสู่แดชบอร์ดและ 90% ของเวลาดำเนินงานที่เชื่อมโยงกับบทบาท“ วิศวกร” การฝังแบบไฮบริดสามารถทำได้สำหรับบทบาทนั้นโดยเฉพาะและเก็บการอ้างอิงสำหรับส่วนที่เหลือเท่านั้น
{_id: ObjectID(),
roles: [{name: “Engineer”,
property1: value1,
property2: value2
},
[“Administrator”, “ObjectId()”]
]
}
การเป็น schemaless ไม่ได้เป็นเพียงคุณสมบัติของ NoSQL แต่มันอาจเป็นข้อได้เปรียบในกรณีนี้ สามารถใช้ได้อย่างสมบูรณ์แบบในการซ้อนวัตถุประเภทต่างๆในคุณสมบัติ“ บทบาท” ของวัตถุผู้ใช้