ฐานข้อมูลนามธรรม - มันมากเกินไปหรือไม่


18

หลังจากได้สัมผัสกับเลเยอร์สิ่งที่เป็นนามธรรมหลายชั้นฉันเริ่มสงสัยว่าประเด็นใดที่ห้องสมุดทุกแห่งคิดค้นกระบวนทัศน์ที่แตกต่างกันของพวกเขาเองในการเข้าถึงข้อมูล การรับ DAL ใหม่รู้สึกเหมือนได้เรียนรู้ภาษาใหม่อีกครั้งเมื่อสิ่งที่ฉันต้องการทำคือการโน้มน้าวให้เลเยอร์ส่งออกแบบสอบถาม SQL ที่ฉันได้เขียนไปแล้วในหัวของฉัน

และนั่นคือโดยไม่ต้องสัมผัสกับการอ่านหลังจากข้อเท็จจริง:

# Exhibit A:  A typical DAL
rows = db(db.ips_x_users.ip_addr == '127.0.0.1')
    .inner_join(db.ips_x_users.user_id == db.users.id)
    .select(order=(db.ips_x_users.last_seen, 'desc'), limit=10)

# Exhibit B:  Another typical DAL
rows = db.ips_x_users
    .join(db.users, on=db.ips_x_users.user_id == db.users.id)
    .filter(db.ips_x_users.ip_addr == '127.0.0.1')
    .select(sort=~db.ips_x_users, limit=10)

# Exhibit C:  A hypothetical DAL based on standard SQL syntax
rows = db('''SELECT * FROM ips_x_users
             INNER JOIN users ON
                 (ips_x_users.user_id = users.id)
             WHERE ips_x_users.ip_addr = ip
             ORDER BY last_seen DESC LIMIT 10''', ip='127.0.0.1')

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

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


2
ปัญหาที่ใหญ่ที่สุดกับ SQL มาตรฐานคือมีจำนวนการสืบค้นที่เฉพาะฐานข้อมูล ไวยากรณ์การรวมภายนอกจะแตกต่างกันไปอย่างมากเช่นเดียวกับขั้นตอนการสืบค้น "หน้าต่าง" นั่นเป็นความจำเป็นที่ DALs ต้องเริ่มต้นด้วย ตอนนี้ถ้ามีตัวแปรมาตรฐานของ SQL ที่ใช้โดย DAL ซึ่งรู้วิธีจัดการกับความแปลกประหลาดของผู้จำหน่าย SQL ต่าง ๆ ฉันยินดีต้อนรับ
Berin Loritsch

คำตอบ:


10

ปัญหาพื้นฐานที่สุดของการใช้งาน SQL ทั่วไปคือแบบสอบถาม SQL นั้นเป็นสตริงที่ประกอบขึ้นจากภาษาอื่น นี่คือจุดที่ SQL injections และช่องโหว่อื่น ๆ และ WTF มาจาก (ตัวอย่างของคุณค่อนข้างได้รับการคัดเลือกเนื่องจากแบบสอบถามของคุณไม่มีพารามิเตอร์ใด ๆ )

ปัญหาต่อไปคือความจริง: ถ้าคุณเขียน SQL ลงไปในโค้ดของคุณคอมไพเลอร์ก็ไม่สามารถทำอะไรได้เลย ข้อผิดพลาดเช่นการพิมพ์ผิดในชื่อคอลัมน์จะเกิดขึ้นตอนรันไทม์เท่านั้น นี่คือเหตุผลที่คุณไม่ต้องการเพียงแค่การแสดงสตริงของแบบสอบถามในซอร์สโค้ด แต่สิ่งที่คอมไพเลอร์สามารถวิเคราะห์แบบสแตติกเพื่อป้องกัน 95% ของข้อผิดพลาด facepalm ทั้งหมด

และปัญหาล่าสุดเกิดขึ้นเมื่อคุณพยายามแมปฐานข้อมูลเชิงสัมพันธ์กับซีแมนทิกส์ภาษาและรูปแบบการเขียนโปรแกรมของคุณ: RDBMSs ทำงานร่วมกันไม่ได้กับ OOP (หรือการดึงข้อมูลการนำทาง) จริงๆแล้วมันเป็นความคิดที่แย่มากที่รวมสองสิ่งนี้เข้าด้วยกัน แต่มันเป็นสิ่งที่ DAL เชิงวัตถุทั้งหมดสำหรับฐานข้อมูล SQL (เช่น ORM) นั้นเกี่ยวกับ แต่สิ่งที่เป็นนามธรรมชั้นเหล่านี้จะถูกประณามการรั่วไหล ฉันคิดว่านี่เป็นสาเหตุที่ทำให้มีพวกเขามากมาย: เนื่องจากคุณทำงานกับพวกเขาคุณจะเห็นว่าพวกเขามีข้อบกพร่องคุณจึงตั้งใจเขียน DAL ที่ทำถูกต้องและล้มเหลวในที่สุด

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


3
"RDBMS ไม่สอดคล้องกับ OOP" - ทุกอย่างในซอฟต์แวร์ต้องเป็น OO หรือไม่
quant_dev

@quant_dev: ไม่ แต่ 'abstraction'-layer นั้นอย่างน้อยก็เป็น 'abstraction oriented' นอกจากนี้ยังมีตัวอย่างรหัสที่ให้ไว้ซึ่งเรากำลังพูดถึง OO-code
back2dos

ฉันมักจะคิดว่าการฝัง SQL ไว้ใน C หรืออะไรก็ตามที่เป็นสิ่งที่โง่ที่สุดเท่าที่จะจินตนาการได้ เมื่อฉันต้องทำอะไรแบบนั้นฉันได้สร้างวิธีการกำหนดความสัมพันธ์ระหว่างตารางและเก็บไว้ในฐานข้อมูลจากนั้นใช้ความสัมพันธ์ที่นั่นเพื่อสร้าง SQL ณ รันไทม์เพื่อพูดคุยกับฐานข้อมูล รหัส C ของฉันคือ: "ค้นหาเอนทิตีนี้โดยใช้คีย์นี้", "บันทึกการเปลี่ยนแปลงที่ทำกับมัน"

9

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


3
@ หมายเหตุ - แต่จากนั้น DAL จะต้องมีตัวแยกวิเคราะห์ SQL แบบเต็มและมันจะต้องมีภาษาที่รองรับของตัวเองซึ่งจะแตกต่างจากฐานข้อมูลใด ๆ แล้วมันจะมีความซับซ้อนทั้งหมดที่มันมีอยู่ในการสร้างคำสั่ง SQL เฉพาะฐานข้อมูลที่เหมาะสม ตัวอย่างเช่นคำสำคัญ LIMIT ในตัวอย่างของคุณใช้ได้ใน MySQL แต่ไม่ใช่ใน Oracle หรือ SQL Server
Justin Cave

2
ทีนี้เรามาถึงเนื้อของคำถาม อะไรทำให้ชุดเมธอดชื่อและโอเปอเรเตอร์โอเวอร์โหลดที่เหนือกว่าภาษาถิ่นของ SQL ที่ไม่ได้มาตรฐาน การใช้ SQL อย่างน้อยจะทำให้ coder เป็นพื้นฐานที่คุ้นเคยเพื่อเริ่มเรียนรู้กรอบจาก
หมายเหตุถึงตัวเอง - คิดชื่อ

3
@ หมายเหตุตนเอง: อาจเป็นเพราะการเขียน API สไตล์คล่องแคล่วง่ายกว่าการเขียนโปรแกรมวิเคราะห์คำ SQL ในภาษาของ SQL แล้วแปลไปเป็นภาษาอื่นของ SQL
Dean Harding

1
สำหรับบันทึกฉันยังต้องการใช้ "native" SQL โครงการส่วนใหญ่ของฉันไม่เคยต้องการสนับสนุนมากกว่าหนึ่งฐานข้อมูลดังนั้นมันจึงไม่เป็นปัญหาสำหรับฉัน
Dean Harding

3
"คุณกำลังมองเห็นความจริงที่ชัดเจนว่าแพลตฟอร์มฐานข้อมูลบางแห่งไม่ยอมรับไวยากรณ์ SQL เดียวกัน" - ใช่ แต่คุณเขียนโค้ดเพื่อเรียกใช้กับฐานข้อมูลใด ๆบ่อยครั้งเพียงใด โดยปกติแล้วแพลตฟอร์ม DB เป็นการลงทุนที่สำคัญและไม่ได้เปลี่ยนบ่อยนัก นอกจากนี้ยังมีการเพิ่มประสิทธิภาพอย่างมีนัยสำคัญจากการปรับการค้นหาของคุณให้เหมาะสมกับฐานข้อมูลประเภทที่รู้จัก
quant_dev

5

ฉันรู้สึกว่า SQL กำลังประสบกับการเปลี่ยนแปลงครั้งใหญ่เช่นเดียวกับตัวชี้เมื่อ 10 ปีที่แล้ว มีความพยายามอย่างต่อเนื่องในการกำจัดงานด้วยตนเองด้วย SQL และนำไปสู่ระดับที่สูงขึ้น สิ่งเดียวกันนี้เกิดขึ้นกับพอยน์เตอร์และการจัดการหน่วยความจำด้วยตนเองเมื่อหลายปีก่อน

เนื่องจากงานอยู่ในระหว่างดำเนินการคุณสนุกกับการเห็นวิธีการที่แตกต่างกันมากมายที่แนะนำพยายามทิ้งและบูรณาการ ฉันแน่ใจว่าเราจะเห็นมันมากกว่านี้ก่อนที่จะมีวิธีการทั่วไปหรือมาตรฐานอุตสาหกรรมหากคุณต้องการแสดงออก

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

พูดง่ายๆคือความคล่องแคล่วว่องไวความรวดเร็วนี่คือเป้าหมาย


4

โจเอลเขียนบทความดีๆเมื่อ 10 ปีที่แล้ว: อย่าปล่อยให้สถาปัตยกรรม

ฉันคิดว่ามันเป็นอย่างนั้น ฉันกำลังใช้เลเยอร์นามธรรมในแอปพลิเคชันของฉันเองตั้งแต่ฉันพบรูปแบบและมันง่ายสำหรับฉันที่จะทำเช่นนี้ แต่มันเป็น DAL ของฉันฉันรู้ว่าทุกบรรทัดในซอร์สโค้ด => การควบคุมเต็มรูปแบบ แต่ฉันจะไม่แนะนำให้ใช้กรอบงานนี้กับใครก็ตามที่อยู่นอกทีม / โครงการของฉัน

เมื่อคุณใช้บางอย่างเช่นสิ่งสำคัญที่ต้องรู้ว่ามีการนำไปใช้อย่างไรนั่นหมายความว่าคุณควรใช้เวลาส่วนใหญ่ในการเรียนรู้ห้องสมุด / เครื่องมือ หากคุณไม่มีเวลาเรียนรู้ - อย่าใช้ แม้ว่ามันจะดูง่ายมากตั้งแต่ต้น


ใช่ บริษัท ที่ฉันเคยทำในอดีตเริ่มใช้ไฮเบอร์เนตอย่างกระตือรือร้น จากนั้นพวกเขาค้นพบวิธีที่น่าแปลกใจ (ในวิธีแปลก) แบบสอบถามที่สร้างขึ้นโดยกรอบอาจ
quant_dev

@quant_dev ใช่นั่นคือกับดัก - มันง่ายที่จะเริ่มต้นทำสิ่งต่าง ๆ ด้วย Hibernate หรือ JPA
m5ba
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.