ฉันเพิ่งเริ่มต้นด้วยฐานข้อมูลที่ไม่ใช่เชิงสัมพันธ์และฉันยังคงพยายามห่อหัวของฉันและคิดว่าโมเดลที่ดีที่สุดจะเป็นอย่างไร และฉันพูดได้เฉพาะ CouchDB
ฉันยังมีข้อสรุปเบื้องต้น:
คุณคิดแบบอื่นที่ทำงานได้ดีกว่าในโลกที่ไม่ใช่เชิงสัมพันธ์หรือไม่?
โฟกัสการออกแบบเปลี่ยนไป: การออกแบบโมเดลเอกสาร (ที่สอดคล้องกับตาราง DB) แทบจะไม่เกี่ยวข้องกันเลยในขณะที่ทุกอย่างขึ้นอยู่กับการออกแบบมุมมอง (สอดคล้องกับคิวรี)
การเรียงลำดับ DB ของการแลกเปลี่ยนความซับซ้อน: SQL มีข้อมูลที่ไม่ยืดหยุ่นและแบบสอบถามที่ยืดหยุ่นฐานข้อมูลเอกสารเป็นอีกทางหนึ่ง
โมเดล CouchDB คือชุดของ "เอกสาร JSON" (โดยทั่วไปแล้วตารางแฮชที่ซ้อนกัน) เอกสารแต่ละฉบับมี ID ที่ไม่ซ้ำกันและ ID สามารถเรียกดูได้เล็กน้อย สำหรับข้อความค้นหาอื่น ๆ ให้คุณเขียน "มุมมอง" ซึ่งเป็นชื่อชุดของฟังก์ชันแผนที่ / ลด มุมมองจะส่งคืนผลลัพธ์ที่ตั้งค่าเป็นรายการคู่คีย์ / ค่า
เคล็ดลับคือคุณไม่ต้องสืบค้นฐานข้อมูลในแง่ที่คุณสอบถามฐานข้อมูล SQL: ผลลัพธ์ของการเรียกใช้ฟังก์ชันมุมมองจะถูกเก็บไว้ในดัชนีและสามารถสืบค้นได้เฉพาะดัชนีเท่านั้น (ในฐานะ "รับทุกอย่าง" "รับคีย์" หรือ "รับช่วงคีย์")
การเปรียบเทียบที่ใกล้เคียงที่สุดในโลกของ SQL คือถ้าคุณสามารถสืบค้นฐานข้อมูลโดยใช้กระบวนงานที่จัดเก็บไว้เท่านั้น - ทุกแบบสอบถามที่คุณต้องการสนับสนุนจะต้องถูกกำหนดไว้ล่วงหน้า
การออกแบบเอกสารมีความยืดหยุ่นอย่างมาก ฉันพบเพียงสองข้อ จำกัด :
- เก็บข้อมูลที่เกี่ยวข้องไว้ด้วยกันในเอกสารเดียวกันเนื่องจากไม่มีอะไรเกี่ยวข้องกับการรวม
- อย่าทำให้เอกสารมีขนาดใหญ่จนได้รับการอัปเดตบ่อยเกินไป (เช่นการใส่ยอดขายของ บริษัท ทั้งหมดสำหรับปีในเอกสารเดียวกัน) เนื่องจากการอัปเดตเอกสารทุกครั้งจะทำให้เกิดการจัดทำดัชนีใหม่
แต่ทุกอย่างขึ้นอยู่กับการออกแบบมุมมอง
การออกแบบทางเลือกที่ฉันพบว่าคำสั่งงานที่มีขนาดดีกว่ากับ CouchDB มากกว่าฐานข้อมูล SQL ใด ๆ อยู่ที่ระดับระบบแทนที่จะเป็นระดับการจัดเก็บ หากคุณมีข้อมูลบางส่วนและต้องการแสดงข้อมูลเหล่านี้ในหน้าเว็บความซับซ้อนของระบบทั้งหมดจะลดลงอย่างน้อย 50%:
- ไม่มีการออกแบบตาราง DB (ปัญหาเล็กน้อย)
- ไม่มีชั้นกลาง ODBC / JDBC แบบสอบถามและธุรกรรมทั้งหมดบน http (ปัญหาปานกลาง)
- การแมป DB-to-Object อย่างง่ายจาก JSON ซึ่งแทบจะไม่สำคัญเมื่อเทียบกับ SQL ที่เหมือนกัน(สำคัญ!)
- คุณสามารถข้ามแอปพลิเคชันเซิร์ฟเวอร์ทั้งหมดได้เนื่องจากคุณสามารถออกแบบเอกสารของคุณให้เรียกค้นได้โดยตรงจากเบราว์เซอร์โดยใช้ AJAX และเพิ่มการขัด JavaScript เล็กน้อยก่อนที่จะแสดงเป็น HTML (ขนาดใหญ่ !!)
สำหรับเว็บแอปทั่วไปฐานข้อมูลที่ใช้เอกสาร / JSON เป็นชัยชนะครั้งใหญ่และข้อเสียของการสืบค้นที่ยืดหยุ่นน้อยกว่าและรหัสพิเศษบางอย่างสำหรับการตรวจสอบข้อมูลดูเหมือนจะเป็นราคาที่ต้องจ่ายเล็กน้อย
คุณเคยตีหัวกับสิ่งที่ดูเหมือนเป็นไปไม่ได้หรือเปล่า?
ยัง. แผนที่ / ลดเป็นวิธีการสืบค้นฐานข้อมูลนั้นไม่คุ้นเคยและต้องใช้ความคิดมากกว่าการเขียน SQL มีจำนวนมากพอสมควรดังนั้นการได้รับผลลัพธ์ที่คุณต้องการจึงเป็นคำถามหลักในการสร้างสรรค์เมื่อคุณระบุคีย์
มีข้อ จำกัด ในการที่แบบสอบถามไม่สามารถดูเอกสารสองฉบับขึ้นไปในเวลาเดียวกัน - ไม่มีการรวมหรือความสัมพันธ์แบบหลายเอกสารประเภทอื่น ๆ แต่ยังไม่มีสิ่งใดที่ผ่านไม่ได้
ตามตัวอย่างข้อ จำกัด จำนวนและผลรวมเป็นเรื่องง่าย แต่ไม่สามารถคำนวณค่าเฉลี่ยโดยมุมมอง / แบบสอบถาม CouchDB แก้ไข: ส่งคืนผลรวมและนับแยกกันและคำนวณค่าเฉลี่ยบนไคลเอนต์
คุณได้เชื่อมช่องว่างกับรูปแบบการออกแบบเช่นการแปลจากรูปแบบหนึ่งไปเป็นอีกรูปแบบหนึ่งหรือไม่?
ฉันไม่แน่ใจว่าเป็นไปได้ เป็นการออกแบบใหม่ทั้งหมดมากกว่าเช่นการแปลโปรแกรมรูปแบบการทำงานเป็นสไตล์เชิงวัตถุ โดยทั่วไปมีประเภทเอกสารน้อยกว่าตาราง SQL และข้อมูลมากกว่าในแต่ละเอกสาร
วิธีหนึ่งในการคิดคือดู SQL ของคุณเพื่อหาส่วนแทรกและคำค้นหาทั่วไป: ตารางและคอลัมน์ใดบ้างที่ได้รับการอัปเดตเมื่อลูกค้าสั่งซื้อตัวอย่างเช่น และแบบไหนสำหรับรายงานการขายประจำเดือน? ข้อมูลนั้นน่าจะอยู่ในเอกสารเดียวกัน
นั่นคือ: เอกสารหนึ่งชุดสำหรับคำสั่งซื้อซึ่งประกอบด้วยรหัสลูกค้าและรหัสผลิตภัณฑ์พร้อมช่องที่จำลองตามความจำเป็นเพื่อลดความซับซ้อนของการสืบค้น สิ่งใด ๆ ในเอกสารสามารถสืบค้นได้อย่างง่ายดายทุกสิ่งที่ต้องใช้การอ้างอิงข้ามระหว่างคำสั่งซื้อและลูกค้าจะต้องดำเนินการโดยลูกค้า ดังนั้นหากคุณต้องการรายงานการขายตามภูมิภาคคุณควรใส่รหัสภูมิภาคลงในคำสั่งซื้อ
ตอนนี้คุณทำแบบจำลองข้อมูลที่ชัดเจนหรือยัง (เช่นใน UML)
ขออภัยไม่เคยทำ UML มากก่อนฐานข้อมูลเอกสาร :)
แต่คุณต้องมีแบบจำลองบางอย่างที่บอกว่าช่องใดอยู่ในเอกสารและประเภทของค่าเหล่านั้น ทั้งสำหรับการอ้างอิงของคุณเองในภายหลังและเพื่อให้แน่ใจว่า everybod ที่ใช้ DB รู้ข้อตกลง เนื่องจากคุณจะไม่ได้รับข้อผิดพลาดอีกต่อไปหากคุณจัดเก็บวันที่ในช่องข้อความเป็นต้นและใคร ๆ ก็สามารถเพิ่มหรือลบช่องใดก็ได้ที่ต้องการคุณจึงต้องมีทั้งรหัสตรวจสอบความถูกต้องและข้อตกลงในการรับค่าหย่อน โดยเฉพาะอย่างยิ่งถ้าคุณทำงานกับแหล่งข้อมูลภายนอก
คุณพลาดบริการพิเศษหลัก ๆ ที่ RDBMSes มีให้หรือไม่?
Nope แต่พื้นเพของฉันคือนักพัฒนาแอปพลิเคชันบนเว็บเราจัดการกับฐานข้อมูลในขอบเขตที่เราต้องการเท่านั้น :)
บริษัท ที่ฉันเคยทำงานเพื่อสร้างผลิตภัณฑ์ (เว็บแอป) ที่ออกแบบมาให้ทำงานข้ามฐานข้อมูล SQL จากผู้ขายหลายรายและ "บริการพิเศษ" นั้นแตกต่างจาก DB ถึง DB มากจนต้องใช้แยกกันสำหรับแต่ละ DB ดังนั้นการย้ายฟังก์ชันออกจาก RDBMS จึงมีน้อยลง สิ่งนี้ยังขยายไปสู่การค้นหาแบบเต็มข้อความ
ดังนั้นสิ่งที่ฉันยอมแพ้คือสิ่งที่ฉันไม่เคยมีมาตั้งแต่แรก เห็นได้ชัดว่าประสบการณ์ของคุณอาจแตกต่างกัน
ข้อแม้: สิ่งที่ฉันกำลังทำอยู่ตอนนี้คือเว็บแอปสำหรับข้อมูลทางการเงินราคาหุ้นและอื่น ๆ นี่เป็นการจับคู่ที่ดีมากสำหรับฐานข้อมูลเอกสารจากมุมมองของฉันฉันได้รับประโยชน์ทั้งหมดของฐานข้อมูล (การคงอยู่และการสืบค้น) โดยไม่ต้องยุ่งยาก
แต่ข้อมูลเหล่านี้ค่อนข้างเป็นอิสระจากกันไม่มีแบบสอบถามเชิงสัมพันธ์ที่ซับซ้อน รับราคาล่าสุดโดยทิกเกอร์รับราคาตามทิกเกอร์และช่วงวันที่รับข้อมูลเมตาของ บริษัท นั่นเป็นข้อมูลทั้งหมด อีกตัวอย่างหนึ่งที่ฉันเห็นคือแอปพลิเคชันบล็อกและบล็อกก็ไม่ได้โดดเด่นด้วยสคีมาฐานข้อมูลที่ซับซ้อนมากเช่นกัน
สิ่งที่ฉันพยายามจะบอกคือแอปพลิเคชันฐานข้อมูลเอกสารที่ประสบความสำเร็จทั้งหมดที่ฉันรู้จักนั้นมาจากข้อมูลที่ไม่มีความสัมพันธ์กันมากนักตั้งแต่แรก: เอกสาร (เช่นเดียวกับในการค้นหาของ Google) โพสต์บล็อกบทความข่าวข้อมูลทางการเงิน .
ฉันคาดหวังว่าจะมีชุดข้อมูลที่แมปกับ SQL ได้ดีกว่าโมเดลเอกสารดังนั้นฉันจึงคิดว่า SQL จะอยู่รอดได้
แต่สำหรับพวกเราที่ต้องการวิธีง่ายๆในการจัดเก็บและดึงข้อมูล - และฉันสงสัยว่ามีพวกเราหลายคน - ฐานข้อมูลเอกสาร (เช่นเดียวกับ CouchDB) เป็นสิ่งที่มาจากสวรรค์