ทำไมการประชุมบอกว่าชื่อตาราง DB ควรเป็นเอกเทศ แต่เป็นพหูพจน์ของทรัพยากร


27

มันเป็นแบบแผนที่ค่อนข้างกำหนดไว้ว่าอย่างน้อยชื่อตารางฐานข้อมูลใน SQL ควรเป็นแบบเอกพจน์ SELECT * FROM user;ดูคำถามและการอภิปรายนี้

นอกจากนี้ยังมีการประชุมที่ค่อนข้างดีที่ชื่อทรัพยากร RESTful API ควรเป็นพหูพจน์ GET /users/123และPOST /usersดูคนนี้

ใน API ที่ได้รับการสนับสนุนฐานข้อมูลที่ง่ายที่สุดชื่อของทรัพยากรใน URL จะเป็นตารางและองค์ประกอบข้อมูลใน URL และหน่วยงานร้องขอ / ตอบสนองจะจับคู่กับคอลัมน์ในฐานข้อมูลโดยตรง ตามแนวคิดแล้วฉันไม่เห็นความแตกต่างระหว่างการทำงานกับข้อมูลผ่าน API เชิงทฤษฎีนี้กับการทำงานบน SQL โดยตรง และด้วยเหตุนี้ความแตกต่างในการตั้งชื่อข้อตกลงระหว่างuserและusersไม่สมเหตุสมผลกับฉัน

ความแตกต่างในการทำให้เป็นพหูพจน์เป็นอย่างไรเมื่อแนวคิด REST API และ SQL กำลังทำสิ่งเดียวกัน


3
ไม่มีแบบแผนเดียวในการตั้งชื่อตาราง DB หรือการตั้งชื่อทรัพยากรสงบที่ทุกคนติดตาม ในทางตรงกันข้ามอาจมีการประชุมหลายครั้ง ไม่น่าแปลกใจที่บางคนอาจปะทะกัน
Eric King

13
ไม่มีการประชุมที่จัดตั้งขึ้นเช่นนี้ ฉันเคยใช้ชื่อตารางพหูพจน์เสมอ ผู้ใช้ , บัญชีฯลฯ เนื่องจากพวกเขาจะถือครองมากกว่าหนึ่งของสิ่งที่
GrandmasterB

2
@GrandmasterB การประชุมมีอยู่และมีต้นกำเนิดในรูปแบบเชิงสัมพันธ์ของ Codd ที่ "ความสัมพันธ์" (ที่กลายเป็นตารางเพื่อไม่ให้พูดคุยกับความสัมพันธ์) มีชื่อเอกพจน์เพราะความสัมพันธ์เป็นรายการของสิ่งต่าง ๆ ไม่รายการหลายรายการ ความสัมพันธ์แต่ละรายการเป็นหนึ่งรายการ เอนทิตีแบบโดเมนความสัมพันธ์ ชื่อเอนทิตีเป็นเอกพจน์ในแบบจำลองเชิงสัมพันธ์ของ Codd มีวรรณกรรมมากมายเกี่ยวกับที่จะบอกว่ามันไม่มีอยู่จริง แต่มันก็โอเคสำหรับคุณที่จะใช้ชื่อพหูพจน์ถ้าคุณต้องการ
Tulains Córdova

4
@ user61852 มีคนที่สามารถใช้งานได้ตามแบบแผน แต่มันก็ไม่ได้เป็นไปตามอนุสัญญาอุตสาหกรรมตามที่ปรากฏในคำถามนี้ในทางพูด camelCase หรือ MarkDown ที่เป็น
GrandmasterB

4
โปรดทราบว่า REST ไม่ใช่โปรโตคอลการเข้าถึงฐานข้อมูล ไม่มีเหตุผลที่ข้อตกลงการตั้งชื่อฐานข้อมูล (ซึ่งคุณเคยไปด้วย) และข้อตกลงการตั้งชื่อ URL (ซึ่งคุณเคยไปด้วย) ควรเป็นอะไรที่เหมือนกันพวกเขาไม่มีส่วนเกี่ยวข้องกัน สองโดเมนที่ต่างกันมาก มันไม่สมเหตุสมผลที่จะไตร่ตรองว่าทำไมฐานข้อมูลใช้เอกพจน์และ URL ใช้พหูพจน์มากกว่าไตร่ตรองว่าทำไมฐานข้อมูลจึงใช้เพียงครั้งเดียว แต่ผู้ดูแลระบบของฉันตั้งชื่อไดเรกทอรีระบบไฟล์ของเขาหลาย ๆ เฟรมเวิร์กเว็บที่ออกแบบมาไม่ดีมีคนที่คิดว่า REST เป็นสิ่งที่ต้องทำในการเข้าถึงฐานข้อมูล แต่ไม่ใช่
Cormac Mulhall

คำตอบ:


12

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

ดังนั้นปัญหาในการแกะที่นี่คือความเข้าใจในแนวคิดที่ API แมปกับฐานข้อมูลโดยตรง เราสามารถหานี้อธิบายว่าเป็นรูปแบบการป้องกันอย่างน้อยไกลกลับถึง 2009

เหตุผลหลักที่ว่านี้ไม่ดี? รหัสอธิบายว่า "การดำเนินการนี้มีผลต่อข้อมูลของฉันอย่างไร" กลายเป็นรหัสลูกค้า

สิ่งนี้มีผลกระทบที่แย่มากต่อ API (ไม่ใช่รายการที่ครบถ้วนสมบูรณ์)

มันทำให้การรวมกับ API เป็นเรื่องยาก

ฉันจินตนาการถึงขั้นตอนในการสร้างผู้ใช้ใหม่ที่มีเอกสารดังนี้:

  1. POST /users { .. }
  2. POST /usersettings { .. } ด้วยค่าเริ่มต้นบางอย่าง
  3. POST /confirmemails { .. }

แต่คุณจะจัดการกับความล้มเหลวของขั้นตอน # 2 ได้อย่างไร สำเนาพาสต้าแบบลอจิกการจัดการตรรกะนี้มีจำนวนเท่ากันสำหรับลูกค้ารายอื่นของ API ของคุณหรือไม่

การดำเนินการข้อมูลเหล่านี้มักจะง่ายต่อการจัดลำดับในฝั่งเซิร์ฟเวอร์ในขณะที่การเริ่มต้นจากลูกค้าเป็นการดำเนินการเดียว เช่นPOST /newusersetupเช่นDBAs อาจรับรู้ว่านี่เป็นขั้นตอนการจัดเก็บไว้ แต่การทำงานของ API อาจมีผลกระทบมากกว่าแค่ฐานข้อมูล

การรักษาความปลอดภัยของ API จะกลายเป็นหลุมดำแห่งความสิ้นหวัง

สมมติว่าคุณต้องรวมสองบัญชีผู้ใช้

  1. GET /users/1
  2. PUT /users/2 { .. }
  3. DELETE /users/1

คุณจะตั้งค่าการอนุญาตของผู้ใช้เพื่ออนุญาตคุณลักษณะการผสานในขณะที่ไม่อนุญาตให้ลบผู้ใช้อย่างไร กำลังลบผู้ใช้แม้จะแสดงอย่างเป็นธรรมโดยDELETE /users/1เมื่อ/usersettingsมีอยู่ด้วยหรือไม่?

การทำงานของ API ควรถูกมองว่าเป็นการดำเนินงานระดับสูงกว่าฐานข้อมูลซึ่งอาจทำให้เกิดการเปลี่ยนแปลงหลายอย่างในระบบ

การบำรุงรักษายากขึ้น

... เนื่องจากลูกค้าของคุณขึ้นอยู่กับโครงสร้างฐานข้อมูลของคุณ

จากประสบการณ์ของฉันกับสถานการณ์นี้:

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

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

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


1
ตอบคำถามอื่น OP ไม่ได้บอกเป็นนัยถึงการเชื่อมโยงของ API และหน่วยงานฐานข้อมูลเพียงมีหน่วยงานบางอย่างในบริบททั้งสอง
Basilevs

2
อย่าลังเลที่จะโพสต์คำตอบสำหรับคำถามที่คุณคิดว่ากำลังถูกถาม
Kasey Speakman

4
@ Basilevs จริงๆแล้วฉันคิดว่านี่จะตอบคำถาม บางครั้งคำตอบอาจปรากฏทางอ้อมเมื่อคำถามถูกล้อมรอบด้วยสมมติฐานที่ไม่ถูกต้อง "การปรากฏตัวของหน่วยงานบางส่วนทั้งในบริบท"หมายถึงพวกเขาเป็นหน่วยงานเดียวกันซึ่งหมายถึง 1-1 การติดต่อระหว่างบางอย่างและไม่ได้คนอื่น ๆ การโต้ตอบของ API ผ่านโมเดลข้อมูลที่ซับซ้อนแสดงถึงการออกแบบที่มีข้อบกพร่อง
Aluan Haddad

เหตุผลหลายประการที่ฉันหยุดใช้ Spring Data Rest
Sebastiaan van den Broek

4

REST API และ SQL ไม่ใช่ "ทำสิ่งเดียวกัน"

OP ถาม:

ความแตกต่างในการทำให้เป็นพหูพจน์เป็นอย่างไรเมื่อแนวคิด REST API และ SQL กำลังทำสิ่งเดียวกัน

มันอาจจะปรากฏขึ้นมาว่าอินเตอร์เฟส RESTful และตาราง SQL "กำลังทำสิ่งเดียวกัน" แต่สุขอนามัยการเขียนโปรแกรมที่ดีบอกเราว่ามีเลเยอร์กลางที่เป็นสื่อกลางระหว่าง REST API และฐานข้อมูลเสมอ การละเว้นจุดนี้คือการหลงทางจากเส้นทางสู่การตรัสรู้ของซอฟต์แวร์! :)

ดังนั้น RESTful APIs และตาราง SQL สามารถทำตามระเบียบการตั้งชื่อของพวกเขาได้อย่างมีความสุข

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