เมื่อใช้ ORM สิ่งที่ต้องระวังในการออกแบบฐานข้อมูลของคุณคืออะไร


19

Gotchas ออกแบบฐานข้อมูลอะไรบ้างที่ต้องระวังเมื่อคุณรู้ว่าฐานข้อมูลจะถูกเข้าถึงโดยใช้Wikipedia Object Relational Mapper (ORM) ? ดูที่ Entity Framework NHibernate หรือ LLBLGenPro

ตัวอย่างเช่นฉันจะบันทึกข้อ จำกัด พารามิเตอร์ 2100 ในการเรียก RPC ของ SqlServer ปัญหานี้เป็นปัญหาเมื่อใช้ LLBLGen และเข้าร่วมเมื่อตารางคีย์หลักสารประกอบถูกนำมาใช้ดูบทความ MSDN สำหรับคีย์สารประกอบ


4
ไม่มีความผิด แต่ "เข้าร่วมตารางที่มีคีย์หลักมากกว่า 1" .. นี่นิยามใหม่หนึ่งในกฎพื้นฐานของตารางคือหนึ่ง PK ต่อตาราง คุณหมายถึงอะไรกันแน่?
Marian

สิ่งนี้ถึงขีด จำกัด พารามิเตอร์ 2100 อย่างไร คุณมีตารางที่มีหลายคอลัมน์หรือไม่ นอกจากนี้ฉันคิดว่าคุณหมายถึง "การทำแผนที่วัตถุสัมพันธ์" และไม่ใช่"การจำลองแบบวัตถุ - บทบาท"
จอห์นแซนเดอร์

การ จำกัด พารามิเตอร์ 2100 บางครั้งอาจมีปัญหาหากคุณส่งรายการค่าจำนวนมากไปยัง SQL 'IN' (LINQ array.Contains (สมาชิก)) อย่างไรก็ตามนั่นไม่ได้มีอะไรที่จะออกแบบฐานข้อมูล นั่นเป็นปัญหารูปแบบแบบสอบถามมากกว่า วิธีแก้ปัญหาที่ง่ายที่สุดสำหรับ ORM ที่ 'ประสบ' จากนั้นคือการแทรกรายการลงในตารางชั่วคราว [ถาวร] และเข้าร่วมกับและ / หรือใช้แบบสอบถามย่อยที่เลือกรายการที่จะสอบถามจากที่ใดก็ตามที่พวกเขามา (การส่งรายการนับพันไปยัง SQL 'IN' นั้นไม่ดีอยู่ดีไม่ว่าคุณจะใช้ OR หรือผู้ทำแผนที่หรือไม่ก็ตาม)
KristoferA

@ จอห์นใช่การทำแผนที่วัตถุสัมพันธ์
BozoJoe

4
@BozoJoe: ตารางสามารถ - ตามคำจำกัดความ - มีคีย์หลักเพียงคีย์เดียวเท่านั้น ไม่มี DBMS ที่จะอนุญาตให้คุณกำหนดคีย์หลักมากกว่าหนึ่งคีย์สำหรับตารางเดียว
a_horse_with_no_name

คำตอบ:


17

ผ่านเทคนิคการทำให้เป็นมาตรฐานมาตรฐานส่วนใหญ่เป็นรูปแบบปกติที่ 3 ORM บางตัวสามารถรับความสัมพันธ์ที่กำหนดในระดับฐานข้อมูลได้ดังนั้นคุณจะไม่ต้องทำเอง

ฉันจะไปทางอื่นและถามว่าฉันควรรู้เรื่อง ORM อย่างไร ตรวจสอบให้แน่ใจว่าคุณรู้: - ฉันจะโพสต์คำถามได้อย่างไร - ฉันจะแทนที่ ORM และเขียนแบบสอบถามของฉันเองได้อย่างไร - ฉันสามารถใช้ procs ที่เก็บไว้แทนได้หรือไม่

ฐานข้อมูลควรเป็นผู้ไม่เชื่อเรื่อง ORM เนื่องจากมีโอกาสสูงที่แอพจะอยู่ได้นานกว่า


+1: "ฐานข้อมูลควรเป็นผู้ไม่เชื่อเรื่องพระเจ้า ORM" ยึดตามมาตรฐานสำหรับการออกแบบฐานข้อมูลและ ORM ที่ดีก็จะมีความสุข
MicSim

12
  1. อย่าปล่อยให้ ORM สร้างหรืออัปเดตสคีมา ใช้ SQL ที่สร้างขึ้นเป็นเทมเพลตเสมอ แต่ต้องผ่านมันก่อนที่จะทำการเปลี่ยนแปลง (ฉันเคยเห็น ORM ของเราทำดัชนีซ้ำซ้อนใช้ชนิดข้อมูลที่ไม่ดี ... สิ่งที่ไม่ดีทั้งหมด)

  2. ระวังสิ่งที่ออมของคุณไม่สามารถทำได้ Django อยู่พักหนึ่งไม่สนับสนุนกลุ่มโดยผ่าน ORM ซึ่งเป็นความเจ็บปวด (ยังคงเป็นระบบดั้งเดิมที่สนุก!) ดังนั้นการตระหนักถึงข้อ จำกัด ของ ORM จึงเป็นสิ่งจำเป็นสำหรับ DBA แม้ว่าพวกเขาจะไม่ใช่คนที่เขียนโค้ดสำหรับ ORM

  3. คว้าบันทึกช้าของคุณเป็นระยะ ๆ รวมไว้ใน mysqlslowlog และดูที่ 10 อันดับแรกหรือมากกว่านั้น โดยทั่วไปจะแสดงข้อความค้นหาที่ใช้เวลารวมโดยรวมมากที่สุด แบบสอบถามที่ใช้เวลาเพียง 1 วินาทีโดยเฉลี่ย แต่วิ่ง 50K ครั้งในเดือนที่ผ่านมาจะปรากฏในรายงานรวมที่เหมือนนิ้วหัวแม่มือเจ็บ;)

ฉันจะไม่พูดว่าไปสุดขีดเป็นการทิ้ง ORM อย่างสมบูรณ์ หากนักพัฒนาของคุณที่ใช้ ORM ไม่ใช่ DBA พวกเขามีแนวโน้มที่จะเขียน SQL ที่ไม่ดีหรือแย่กว่า ORM ดังนั้นในที่สุดมันจะตกที่ DBA เพื่อดูว่าเกิดอะไรขึ้น


1
และพิจารณาวางตรรกะที่ซับซ้อนมากใน proc ที่เก็บไว้ ORMs สามารถเรียก procs ที่จัดเก็บไว้ได้และสำหรับตรรกะที่ซับซ้อนมากมันง่ายต่อการปรับแต่ง proc
HLGEM

7

มีบางสิ่งที่ฉันสังเกตได้ทันทีเกี่ยวกับฐานข้อมูลดั้งเดิมที่แตกต่างจากฐานข้อมูลที่สร้างโดย ORMs เช่นSequelและActiveRecordสำหรับ Ruby

  1. 'id'การใช้คีย์หลักในตารางทั้งหมดที่เรียกว่า ใช่ว่าสามารถแทนที่ได้ แต่idเป็นค่าเริ่มต้น
  2. การใช้ชื่อพหูพจน์สำหรับตาราง
  3. การใช้เครื่องหมายขีดล่าง ("snakecase") เพื่อแยกคำที่สร้างชื่อที่อธิบายของตารางและฟิลด์
  4. การใช้_idคีย์ที่ผนวกเข้ากับต่างประเทศ: โดยทั่วไปแล้วโครงร่างจะเป็นเช่นreferenced_table_idนั้น

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

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


1
FYI: มีเครื่องมือในการจัดการกับความแตกต่างของแบบแผนการตั้งชื่อสำหรับตัวทำแผนที่ OR จำนวนมาก ฉันมี Add-in สำหรับ Visual Studio ที่ดูแล Entity Framework และ Linq-to-SQL ด้วยการตั้งชื่อตามกฎ ดูhuagati.com/dbmltoolsสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนั้น
KristoferA

1
Id คือ SQL antipattern สำหรับการตั้งชื่อฟิลด์ id และไม่ควรใช้
HLGEM

สนใจที่จะอธิบายว่าทำไม เราจะจัดการความสัมพันธ์ระหว่างตารางได้อย่างไรเมื่อเราต้องทำการค้นหาเช่นแบบตัวต่อตัวและตัวต่อตัว ใน ORMs ฉันใช้ไม่ได้ใช้ ID แน่นอนว่าขัดต่อโฟลว์
Tin Man

2

มันขึ้นอยู่กับ (:)) เล็กน้อยเกี่ยวกับสิ่งที่คุณใช้หรือผู้ทำแผนที่ดังนั้นให้ใช้เวลาค้นคว้าสิ่งที่ db มีคุณสมบัติตัวทำแผนที่ OR ในการสนับสนุนคำถาม / ไม่สนับสนุน

เช่นโปรแกรมแมป OR ของ Microsoft ไม่สนับสนุนประเภทข้อมูลในตัวของ SQL Server ทั้งหมดไม่รองรับคุณสมบัติ TSQL ขั้นสูง / ขั้นสูงบางอย่าง (แบบสอบถามแบบเรียกซ้ำ

ในทางทฤษฎีผู้ทำแผนที่ OR ที่ดีควรยืดหยุ่นพอที่จะเอาชนะ (และอนุญาตให้คุณทำแผนที่) สคีมาฐานข้อมูลเชิงสัมพันธ์ที่ออกแบบมาอย่างดีกับโมเดลวัตถุที่ดี ในความเป็นจริงเรายังมีอีกนิดหน่อยก่อนที่ปริศนาทุกชิ้นจะเข้าที่ แม้ว่าผู้ทำแผนที่ OR จำนวนมากจะสนับสนุนการทำแผนที่ขั้นสูง แต่มักจะมีค่าใช้จ่ายในการค้นหาที่ซับซ้อนและปัญหาด้านประสิทธิภาพ

สำหรับประสิทธิภาพของฐานข้อมูลที่ดี (และเพื่อรักษาสติของ dba :)) คุณควรปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเมื่อมันมาถึงการออกแบบ db schema; ทำให้เป็นมาตรฐานก่อนและทำให้เป็นปกติในกรณีที่ [/ ถ้า] จำเป็น รหัสฝั่งไม่ไปลงน้ำที่มีรูปแบบวัตถุของคุณ ; แม้ว่าหรือสนับสนุนการที่ซับซ้อน mapper รุ่นมรดกและหน่วยงานที่ผสานการหลายตารางด้วยกันเหล่านี้ยังมีพื้นที่ที่คุณมีความเสี่ยงการทำงานเป็นปัญหากับคำสั่งที่ซับซ้อนมากเกินไปตีฐานข้อมูล ฯลฯรายละเอียดรายละเอียดรายละเอียดและไม่เพียงแค่ใช้เวลาออม สร้างแบบสอบถามเพื่อรับ โปรดทราบว่า OR แบบสอบถามที่สร้างโดยผู้สร้างแมปมักจะสามารถปรับแต่งเช่นเดียวกับแบบสอบถาม SQL ปกติและแบบสอบถามสองรายการที่เทียบเท่ากับการใช้งานทางด้านวัตถุ (เช่นคิวรี linq) อาจทำให้แบบสอบถาม SQL แตกต่างกันอย่างมากมาย

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