NoSQL ภายใน SQL Server


28

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

เราได้เริ่มโครงการใหม่ตั้งแต่เริ่มต้นโดยใช้ MVC5, Entity Framework 6 code ก่อนและ SQL Server 2008 เมื่อสถาปนิกตรวจสอบ schema ฐานข้อมูลมีการระบุว่าคีย์ต่างประเทศทั้งหมดและข้อ จำกัด อื่น ๆ ควรถูกลบออกเพราะนี่คือ "ตรรกะทางธุรกิจ" และ ควรใช้ภายในเลเยอร์ธุรกิจของรหัสแอปพลิเคชัน

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

อาร์กิวเมนต์ที่สองคือเป้าหมายคือการใช้วิธี NoSQL กับข้อมูล ฉันพบสิ่งผิดปกติและผิดพลาดจริง ๆ นี้: พิจารณาการใช้ SQL-Server 2008, ความจำเป็นในการรายงาน, ข้อมูลที่ไม่ได้ปรับให้เทราไบต์และขาดการพิจารณาเทคโนโลยีเช่น Mongo, Raven เป็นต้น

มีใครเคยเจอสถานการณ์แบบนี้มาก่อนหรือไม่? ทำไมทุกคนจะใช้แนวทาง NoSQL ใน SQL Server ที่ออกแบบมาสำหรับข้อมูลอ้างอิงและไม่ต้องการคีย์ต่างประเทศ


21
พูดคุยกับสถาปนิกระบบของคุณเกี่ยวกับเหตุผลของคำแนะนำของเขา ไม่ว่าเขาจะมีเหตุผลที่ดีมากซึ่งใช้กับกรณีเฉพาะของคุณ (เหตุผลที่เราไม่สามารถคาดเดาได้โดยไม่ทราบว่าแอปของคุณประกอบไปด้วยอะไร) หรือเขาไร้ความสามารถ
Arseni Mourzenko

23
ฉันเคยเห็นฐานข้อมูลจำนวนมากถูกนำไปใช้ในทำนองเดียวกัน: ไม่มี FKs, ไม่มีข้อ จำกัด ในการตรวจสอบ - ทุกครั้งที่เป็นฐานข้อมูลที่ออกแบบโดยโคเดอร์ที่ไม่มีประสบการณ์ซึ่งไม่รู้อะไรเลยเกี่ยวกับสถาปัตยกรรมฐานข้อมูล, ความสมบูรณ์ของการอ้างอิงเป็นต้น เพื่อนร่วมงานของคุณแทนที่จะคิดว่าเขาไร้ความสามารถ
Arseni Mourzenko

5
ฉันสับสนเล็กน้อย คุณพูดถึงการใช้ Entity framework (code first) ... ไม่ได้หมายความว่าคุณสร้าง Objects (ในภาษา C #) แล้วให้ Entity framework จัดการการสร้างฐานข้อมูลเทียบเท่าในกรณีที่พยายามเพิ่ม / ลบ FK เป็นต้น แบบฝึกหัดในการพยายามชิงไหวชิงพริบ Entity Framework (คำพูดแบบไหนของมาร์กทเวนเกี่ยวกับการพยายามสอนให้หมูร้องเพลง?)
Foon

2
มีคนจำนวนมากเกินไปที่อ้างว่าตัวเองเป็น "สถาปนิก" แต่จริงๆแล้วไม่มีประสบการณ์ในการเขียนโปรแกรมหรือการบำรุงรักษาระบบที่ใหญ่กว่า
Doc Brown

2
ที่เกี่ยวข้อง: thedailywtf.com/articles/The-Mythical-Business-Layer "ถ้าคุณคิดถึงมันแทบทุกบรรทัดของโค้ดในแอพพลิเคชั่นซอฟต์แวร์คือตรรกะทางธุรกิจ" สิ่งนี้ขยายไปถึงฐานข้อมูล "แต่มันก็สำคัญไม่น้อยไปกว่านั้น - โปรดจำไว้ว่าเกือบทุกรหัสของแอปพลิเคชันจะเป็นตรรกะทางธุรกิจมีเครื่องมือมากมายพออยู่แล้วในแอปพลิเคชั่นของคุณไม่จำเป็นต้องใช้เลเยอร์ทั่วไป " บุคคลที่แนะนำสิ่งนี้อาจพยายามเปลี่ยนฐานข้อมูลเป็นเลเยอร์ทั่วไปดังกล่าว ในระยะสั้นพวกเขามีแนวโน้มที่จะนำ buzzwords เหนือความเป็นจริง
jpmc26

คำตอบ:


74

เมื่อเขาตรวจสอบคีมาฐานข้อมูลเขาระบุว่าควรลบคีย์ต่างประเทศและข้อ จำกัด อื่น ๆ ทั้งหมดเนื่องจากเป็นตรรกะทางธุรกิจและควรใช้ภายในเลเยอร์ธุรกิจ

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

ลองอธิบายให้เขาฟังว่าข้อ จำกัด ของ Referential Integrity ไม่ใช่ "ตรรกะทางธุรกิจ" พวกเขากำลังมีมาตรฐานความถูกต้องด้วยตัวของตัวเองในการตรวจสอบ ตรรกะทางธุรกิจเป็นเรื่องเกี่ยวกับสิ่งที่คุณทำกับข้อมูล ความถูกต้องสมบูรณ์เกี่ยวกับการทำให้มั่นใจว่าข้อมูลนั้นไม่เสียหาย และถ้านั่นไม่ได้ผล ... ดีเขามีหน้าที่ คุณสามารถไปกับแผนการของเขาและพยายามลดความเสียหายบ้างหรือเริ่มมองหาที่ที่ดีกว่าในการทำงาน (หรือทั้งคู่.)


17
ฉันมีคำตอบทางการทูตที่มากกว่าเล็กน้อยที่พยายามหาเหตุผล (เหตุผล) ว่าทำไมสถาปนิกถึงทำเช่นนี้ เมื่อไตร่ตรองอย่างเงียบสงบฉันก็ตอบคำถามนี้แทน
Blrfl

7
ถ้าอย่างนั้นความพยายามในเชิงสถาปัตยกรรมที่ไม่ดีเป็นเหตุผลให้ไปทำงานที่อื่นได้หรือไม่ ประณามฉันจะไม่สามารถทำงานต่อที่ใดก็ได้ถ้าฉันเอามุมมองนั้น
Kzqai

5
@Kzqai นอกจากนี้ยังมีสถาปนิกเข้าใจสถาปัตยกรรมโดยพื้นฐาน สิ่งนี้เริ่มฟังดูเป็นคำสั่ง 595และใช่ถ้ามีคนต้องการบังคับให้ฉันใช้ค้อนเพื่อใส่สกรูเข้าไปในท่อนไม้ฉันจะพบคนที่ไม่บังคับให้ฉันใช้เครื่องมือในการสร้างบางอย่างผิด ๆ

4
Referential Integrityเป็นหัวข้อหลักในทฤษฎีฐานข้อมูลไม่ต้องพูดถึงฐานข้อมูลทั้งหมดที่สนับสนุนในโลกแห่งความเป็นจริง เห็นได้ชัดว่าผู้ร่วมงานของ Andy ถูกต้องในการวิเคราะห์ของเขาส่วนที่เหลือของโลกด้านวิชาการและวิชาชีพนั้นผิด 100% คะแนนโบนัสสำหรับการกล่าวขวัญเดอะเดลี่ WTF

2
@AndyClark คุณควรเลิกกับสิ่งนี้ เหตุผลก็คือมันเป็นระเบิดนิวเคลียร์ในแกนกลางของ บริษัท คุณ มันเป็นเพียงเรื่องของเวลาเมื่อเรื่องอุจจาระที่ติดอยู่กับเครื่องช่วยหายใจ เมื่อสิ่งนั้นเกิดขึ้นคุณจะโชคดีที่ได้ทำงานเป็นกะ 72 ชั่วโมงกรณีที่เลวร้ายที่สุดที่คุณกำลังมองหางาน ... ดีกว่าที่จะหางานเมื่อคุณมีรายได้
ArTs

2

ฉันยังไม่มีเหตุผลที่จะสร้างคีย์ต่างประเทศ

- Joel Spolsky

งบครอบคลุมกันเป็นมูลค่าการยอมรับว่ามีเหตุผลที่ถูกต้องและแข็งแรงในการเลือกที่จะไม่ใช้ข้อ จำกัด ที่ไม่ซ้ำกันหรือกุญแจต่างประเทศ ส่วนใหญ่ไปบางสิ่งเช่นนี้:

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

ดูเพิ่มเติมมีอะไรผิดปกติกับกุญแจต่างประเทศ?


แต่สิ่งเหล่านั้นไม่ตรงกับเหตุผลในคำถามของคุณ

นี่คือตรรกะทางธุรกิจและควรใช้ภายในเลเยอร์ธุรกิจ

เหตุผลนี้แปลกเล็กน้อย เอกลักษณ์และข้อ จำกัด ด้านความสมบูรณ์อื่น ๆ เป็นโดเมนของฐานข้อมูล ACID เป็นอย่างมาก รหัสแอปพลิเคชันของคุณไม่สามารถเข้าถึงการรับประกันแบบ atomicity และ integrity ของ SQLServer หากคุณต้องการความสมบูรณ์ของข้อมูลที่แข็งแกร่งคุณจะโง่ที่จะเพิกเฉยต่อฐานข้อมูล

อาร์กิวเมนต์ที่สองคือพวกเขาต้องการที่จะใช้แนวทาง NoSQL กับการจัดเก็บข้อมูลของพวกเขาและไม่ต้องการข้อ จำกัด ดังกล่าว

เหตุผลที่สองไม่ใช่เหตุผลจริงๆ มันเป็นข้อสรุป แม้ว่ามันจะเป็นความจริงที่ว่าข้อ จำกัด เป็นการแลกเปลี่ยนระหว่างความถูกต้องและประสิทธิภาพและฐานข้อมูล NoSQL นั้นมีอคติในช่วงหลัง


บางทีสถาปนิกระบบของคุณมีเหตุผลที่ถูกต้องในใจและคุณก็ผิดพลาด หรือบางทีเขาอาจเป็นคนงี่เง่า

ไม่ว่าในกรณีใดมีเหตุผลที่ถูกต้อง (แม้ว่าไม่ใช่สากล) ที่จะละเว้นจากการใช้ข้อ จำกัด ที่เป็นเอกลักษณ์และต่างประเทศ

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


12
ฉันกล้าพูดว่า Joel ไม่ใช่คนงี่เง่า แต่คำตอบที่เฉียบแหลมในพอดคาสต์โดยไม่มีคำอธิบายใด ๆ คือ IMHO ซึ่งมีค่าน้อยกว่าคำแถลงของคนบ้า
Martin Ba

11
โจเอลเป็นคนสเปรดชีตไม่ใช่คนฐานข้อมูลดังนั้นเขาจึงไม่รู้ถึงการปฏิบัติฐานข้อมูลเชิงสัมพันธ์แบบมาตรฐานฉันเดาว่าไม่น่าแปลกใจ ... ไม่มีความผิดโจเอล :-)
Eric King

3
คำพูดที่แท้จริงในบริบทของ Joel คือเทคโนโลยีเช่น LINQ เป็นเหตุผลที่รบกวนการตั้งค่าคีย์ต่างประเทศ โจเอลไม่ได้เป็นผู้ดูแลฐานข้อมูลและจากการค้นหาบล็อกของเขาและเป็นผู้อ่านเป็นเวลานานฉันไม่สามารถหาอะไรจากเขาที่พูดถึงเรื่องหรือพยายามให้คำแนะนำในการเพิ่มประสิทธิภาพฐานข้อมูลการออกแบบแบบจำลองข้อมูลเป็นต้น แต่ตอนนี้เขาไม่ได้เป็นหรือเคยเป็นหรืออ้างว่าเป็น! - ผู้เชี่ยวชาญในด้านฐานข้อมูลหรือการสร้างแบบจำลองข้อมูล มันเหมือนกับการอ้างถึง Einstein เกี่ยวกับดอกเบี้ยทบต้น - หรือสำหรับเรื่องนั้นแซนด์วิช (การอ้างอิง XKCD คุณจะยินดี) :)
BrianH


2
@BlueRaja: อืมม ... ฐานข้อมูล XML เป็นช้าโดยเฉพาะอย่างยิ่งเมื่อเทียบกับฐานข้อมูลเชิงสัมพันธ์ ตั้งแต่เมื่อใดที่มีการโต้เถียงหรือความเห็น?
Mason Wheeler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.