รูปแบบการออกแบบฐานข้อมูลเชิงสัมพันธ์? [ปิด]


283

รูปแบบการออกแบบมักจะเกี่ยวข้องกับการออกแบบเชิงวัตถุ
มีรูปแบบการออกแบบสำหรับการสร้างและการเขียนโปรแกรมฐานข้อมูลเชิงสัมพันธ์หรือไม่?
ปัญหามากมายแน่นอนต้องมีวิธีแก้ไขปัญหาที่นำมาใช้ใหม่

ตัวอย่างจะรวมถึงรูปแบบสำหรับการออกแบบตารางขั้นตอนการจัดเก็บทริกเกอร์ ฯลฯ ...

มีพื้นที่เก็บข้อมูลออนไลน์ของรูปแบบดังกล่าวคล้ายกับmartinfowler.comหรือไม่


ตัวอย่างของปัญหาที่รูปแบบสามารถแก้ไขได้:

  • การจัดเก็บข้อมูลแบบลำดับขั้น (เช่นตารางเดี่ยวที่มีประเภท vs หลายตารางพร้อมกับรหัส 1: 1 และความแตกต่าง ... )
  • การจัดเก็บข้อมูลด้วยโครงสร้างตัวแปร (เช่นคอลัมน์ทั่วไปเทียบกับ xml เทียบกับคอลัมน์ที่คั่นด้วย ... )
  • ล้างข้อมูลให้เป็นปกติ (จะทำอย่างไรกับผลกระทบน้อยที่สุด ฯลฯ ... )

ฉันจะอ้างสิทธิ์ในคำถามและคำตอบที่ดีที่สุดสำหรับการจัดเก็บข้อมูลแบบลำดับชั้น: stackoverflow.com/questions/4048151/ …
orangepips

1
ตามคำแนะนำในหัวข้อของเรา" คำถามบางคำถามยังคงปิดหัวข้อแม้ว่าจะอยู่ในหมวดหมู่ที่ระบุข้างต้น: ... คำถามที่ขอให้เราแนะนำหรือค้นหาหนังสือเครื่องมือห้องสมุดซอฟต์แวร์กวดวิชาหรืออื่น ๆ ทรัพยากรนอกไซต์อยู่นอกหัวข้อ ... "
Robert Columbia

@RobertColumbia คำถามคือในหัวข้อในปี 2008 เมื่อถาม ...
Sklivvz

ลองดูรายการทรัพยากรรูปแบบการออกแบบนี้ได้จากฐานข้อมูลเชิงสัมพันธ์และหลายพื้นที่ของวิศวกรรมซอฟต์แวร์github.com/DovAmir/awesome-design-patterns
dov.amir

คำตอบ:


150

มีหนังสือมาร์ตินฟาวเลอร์ลายเซ็นต์ของซีรีส์ที่เรียกว่าเป็นRefactoring ฐานข้อมูล ที่ให้รายการของเทคนิคสำหรับการ refactoring ฐานข้อมูล ฉันไม่สามารถพูดได้ว่าฉันได้ยินรายการรูปแบบฐานข้อมูลมาก

ฉันขอแนะนำรูปแบบข้อมูลของดาวิดซีเฮย์และแผนที่เมตาดาต้าที่ติดตามซึ่งสร้างขึ้นเป็นครั้งแรกและมีความทะเยอทะยานและน่าสนใจมากกว่า คำนำเพียงอย่างเดียวคือความกระจ่าง

นอกจากนี้สถานที่ที่ยอดเยี่ยมในการมองหาโมเดลฐานข้อมูลที่บรรจุกระป๋องไว้ล่วงหน้าคือชุดข้อมูลทรัพยากรหนังสือรุ่น1ของ Len Silverston ที่ประกอบด้วยโมเดลข้อมูลที่สามารถใช้งานได้ในระดับสากล (พนักงานบัญชีการขนส่งการจัดซื้อ ฯลฯ ) เล่ม 2ประกอบด้วยโมเดลข้อมูลเฉพาะอุตสาหกรรม การดูแลสุขภาพ ฯลฯ ) เล่ม 3จัดทำรูปแบบข้อมูล

ในที่สุดในขณะที่หนังสือเล่มนี้เกี่ยวกับ UML และการสร้างแบบจำลองวัตถุอย่างเห็นได้ชัดการสร้างแบบจำลองสีของ Peter Coad ด้วย UMLให้กระบวนการ "ต้นแบบ" ขับเคลื่อนของการสร้างแบบจำลองเอนทิตีเริ่มต้นจากสมมติฐานว่ามี 4 แกนหลักของโมเดลวัตถุ / ข้อมูล


1
หนังสือเล่มนี้มีชื่อว่า [Refactoring Databases: Evolutionary Database Design] [1] โดย Scott W. Ambler และ Pramod J. Sadalage และเป็นเรื่องที่ดีมาก [1]: ambysoft.com/books/refactoringDatabases.html
Panos

3
เกี่ยวกับหนังสือ Ambler: ไม่คุณไม่สามารถแสดงรายการ "การแทรกคอลัมน์" หรือ "การสร้างข้อ จำกัด FK" เป็นรูปแบบด้วยเหตุผลเดียวกันหนังสือ Gang of 4 ไม่ได้แสดงการวนซ้ำ "for" เป็นรูปแบบ
Tegiri Nenashi

มันไม่ใช่รูปแบบ แต่เป็นการปรับโครงสร้าง เช่นเดียวกับวิธีการแยกหรือเปลี่ยนชื่อพารามิเตอร์ การปรับโครงสร้างและรูปแบบไปจับมือกัน
Michael Brown

หนึ่งที่จะเพิ่ม: "รูปแบบการวิเคราะห์" โดย Fowler คล้ายกับสิ่งของของ Hay
Neil McGuigan

2
หนังสือเล่มที่ 3 ของ Len Silverston เป็นเล่มเดียวที่ฉันจะพิจารณาว่าเป็น "รูปแบบการออกแบบ" 2 ตัวอย่างแรกแสดงตัวอย่างข้อมูลซึ่งเป็นเรื่องปกติในกรอบเวลาที่หนังสือถูกเขียน เล่ม 3 แม้ว่าจริง ๆ แล้วมีรูปแบบการออกแบบหลายอย่างสำหรับสถานการณ์ปัญหา ตัวอย่างบทที่ 4 ครอบคลุมลำดับชั้น / การรวม / สถานการณ์แบบเพียร์ทูเพียร์จากนั้นนำเสนอการออกแบบที่หลากหลายที่จัดการกับข้อดีและข้อเสียของแต่ละสถานการณ์
DarrellNorton

46

รูปแบบการออกแบบไม่ใช่โซลูชันที่สามารถใช้ซ้ำได้

รูปแบบการออกแบบสามารถนำกลับมาใช้ใหม่ได้ตามคำจำกัดความ เป็นรูปแบบที่คุณตรวจพบในโซลูชันที่ดีอื่น ๆ

รูปแบบไม่สามารถใช้ซ้ำได้ คุณสามารถใช้การออกแบบลงของคุณตามรูปแบบ

patters การออกแบบเชิงสัมพันธ์รวมถึงสิ่งต่าง ๆ เช่น:

  1. ความสัมพันธ์แบบหนึ่ง - ต่อ - หลายกลุ่ม (รายละเอียดหลักความสัมพันธ์แม่ - ลูก) โดยใช้คีย์ต่างประเทศ

  2. ความสัมพันธ์แบบหลายต่อกลุ่มกับตารางบริดจ์

  3. ตัวเลือกความสัมพันธ์แบบหนึ่งต่อหนึ่งถูกจัดการด้วย NULL ในคอลัมน์ FK

  4. Star-Schema: Dimensions and Fact, การออกแบบ OLAP

  5. การออกแบบ OLTP ที่ได้มาตรฐานอย่างสมบูรณ์

  6. คอลัมน์ค้นหาหลายดัชนีในมิติข้อมูล

  7. "ตารางการค้นหา" ที่มี PK คำอธิบายและค่ารหัสที่ใช้โดยแอปพลิเคชันอย่างน้อยหนึ่งรายการ ทำไมต้องมีรหัส ฉันไม่รู้ แต่เมื่อต้องใช้งานนี่เป็นวิธีจัดการรหัส

  8. Uni-ตาราง [บางคนเรียกสิ่งนี้ว่า มันเป็นรูปแบบบางครั้งก็ไม่ดีบางครั้งก็ดี] นี่คือตารางที่มีสิ่งที่รวมไว้ล่วงหน้าจำนวนมากซึ่งละเมิดรูปแบบปกติที่สองและสาม

  9. ตารางอาเรย์ นี่คือตารางที่ละเมิดรูปแบบปกติแรกโดยมีอาร์เรย์หรือลำดับของค่าในคอลัมน์

  10. ฐานข้อมูลผสมใช้งาน นี่คือฐานข้อมูลที่ทำให้เป็นมาตรฐานสำหรับการประมวลผลธุรกรรม แต่มีดัชนีพิเศษมากมายสำหรับการรายงานและการวิเคราะห์ มันเป็นรูปแบบการต่อต้าน - อย่าทำอย่างนี้ คนทำมันต่อไปดังนั้นมันยังคงเป็นรูปแบบ

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

และสิ่งนี้ไม่รวมถึงรูปแบบการจัดการและการดำเนินงานของการใช้งานและการจัดการ


รูปแบบอื่น ๆ ที่ฉันเห็นคือตารางลูกหลายผู้ปกครอง (เช่นบันทึกย่อทั่วโลกที่มี objecttype และ objectid ที่สามารถเชื่อมโยงไปยังตารางอื่น ๆ ) หรือ FK อ้างอิงตนเอง (เช่น employee.manager -> พนักงาน ID) ฉันยังใช้ตารางการกำหนดค่าแบบซิงเกิลที่มีหลายคอลัมน์
r00fus

1
ทำไมฐานข้อมูลแบบผสมใช้เป็นรูปแบบการต่อต้าน ฉันต้องทำอย่างไรหากฉันต้องการดึงรายงานจากฐานข้อมูล
โอลีฟ

3
@lhnz: คุณไม่สามารถดึงจำนวนมากของขนาดใหญ่รายงานจากการออกแบบฐานข้อมูลการทำธุรกรรม - ล็อคสำหรับการรายงานจะชะลอตัวลงการทำธุรกรรม การรวมที่ซับซ้อน (ดำเนินการซ้ำแล้วซ้ำอีก) เป็นอีกการเปรียบเทียบประสิทธิภาพของธุรกรรม คุณไม่สามารถทำทั้งสองอย่างในฐานข้อมูลเดียว ในการทำรายงานขนาดใหญ่จำนวนมากคุณต้องย้ายข้อมูลไปไว้ในรูปแบบสตาร์ รูปแบบสคีมาของดาวนั้นได้รับการปรับให้เหมาะสมสำหรับการรายงาน และการย้ายข้อมูลจะเป็นการขจัดข้อขัดแย้งในการล็อค
S.Lott

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

6

AskTomน่าจะเป็นทรัพยากรที่มีประโยชน์ที่สุดเพียงหนึ่งเดียวในแนวทางปฏิบัติที่ดีที่สุดใน Oracle DB (ฉันมักจะพิมพ์ "asktom" เป็นคำแรกของข้อความค้นหา google ในหัวข้อเฉพาะ)

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

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


4

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

คำถาม:

  • คุณต้องการใช้ DBMS อื่นในอนาคตหรือไม่ ถ้าใช่ไม่ใช้กับสิ่งพิเศษ SQL ของ DBMS ปัจจุบัน ลบตรรกะในแอปพลิเคชันของคุณ

ไม่ได้ใช้:

  • ช่องว่างสีขาวในชื่อตารางและชื่อคอลัมน์
  • อักขระที่ไม่ใช่ ASCII ในชื่อตารางและคอลัมน์
  • ผูกพันกับตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่เฉพาะ และห้ามใช้ 2 ตารางหรือคอลัมน์ที่แตกต่างกันเฉพาะกับตัวเล็กและตัวใหญ่
  • ไม่ใช้คำสำคัญ SQL สำหรับชื่อตารางหรือคอลัมน์เช่น "FROM", "BETWEEN", "DELETE" เป็นต้น

recomendations:

  • ใช้ NVARCHAR หรือสิ่งที่เทียบเท่าสำหรับการสนับสนุน Unicode คุณจะไม่มีปัญหากับเพจรหัส
  • ตั้งชื่อที่ไม่ซ้ำกันทุกคอลัมน์ ทำให้ง่ายต่อการเข้าร่วมเพื่อเลือกคอลัมน์ มันยากมากหากทุกตารางมีคอลัมน์ "ID" หรือ "ชื่อ" หรือ "คำอธิบาย" ใช้ XyzID และ AbcID
  • ใช้บันเดิลของทรัพยากรหรือเท่ากับสำหรับนิพจน์ SQL ที่ซับซ้อน ทำให้ง่ายต่อการเปลี่ยนไปใช้ DBMS อื่น
  • ไม่ส่งสัญญาณข้อมูลอย่างหนัก DBMS อื่นไม่สามารถมีชนิดข้อมูลนี้ สำหรับตัวอย่าง Oracle daes ไม่มี SMALLINT เพียงตัวเลข

ฉันหวังว่านี่เป็นจุดเริ่มต้นที่ดี


7
แม้ว่าความคิดเห็นของคุณจะค่อนข้างให้คำแนะนำและมีประโยชน์ แต่พวกเขาไม่ใช่รูปแบบการออกแบบ พวกเขาเป็นแนวปฏิบัติที่ดีที่สุด ขอบคุณ
Sklivvz

7
ฉันไม่เห็นด้วยกับคำแนะนำสำหรับชื่อคอลัมน์ที่ไม่ซ้ำ ฉันควรจะบอกลูกค้าว่าจะแก้ความกำกวมมากกว่าที่จะบอกว่าลูกค้าแม้ในที่ที่ไม่มีอะไรจะทำให้เข้าใจผิด
พอลทอมบลิน

1

คำถามของคุณค่อนข้างคลุมเครือ แต่ฉันคิดว่าUPSERTอาจเป็นรูปแบบการออกแบบ สำหรับภาษาที่ไม่ใช้MERGE, จำนวนของทางเลือกในการแก้ปัญหา (ถ้าแถวที่เหมาะสมอยู่แล้วUPDATE; อื่นINSERT) ที่มีอยู่


UPSERT เป็นคำสั่งและเป็นส่วนหนึ่งของภาษา SQL มันไม่ใช่รูปแบบ
ทอดด์อาร์

UPSERT เป็นคำสั่งในภาษา SQL บางรุ่น - บางแพลตฟอร์มไม่มีหรือเพิ่งได้รับเมื่อเร็ว ๆ นี้
Steve Homer

@ToddR - ฉันเคยได้ยินคำว่า "รูปแบบ" เล็กน้อยว่า "รูปแบบ" นั้นไม่มีอะไรมากไปกว่าข้อบกพร่องในภาษาหรือรูปแบบที่ผู้ใช้ต้องสร้างวิธีแก้ไข ฉันไม่ทราบว่า UPSERT ทำอะไร แต่ในขณะที่เพิ่มไปยังSQL บางตัวแต่ไม่ใช่แบบอื่นมันเป็นรูปแบบ
Martin F

1

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

หากคุณกำลังคิดที่จะเป็นโรงงานซิงเกิลตัน ... ไม่เลยคุณไม่ต้องการสิ่งเหล่านี้เพราะระดับการเขียนโปรแกรม DB ต่ำเกินไป

หากคุณคิดว่าการตั้งชื่อออบเจ็กต์ฐานข้อมูลอยู่ภายใต้หมวดหมู่ของอนุสัญญาไม่ใช่การออกแบบ

BTW, S.Lott ความสัมพันธ์แบบหนึ่งต่อหลายและหลายต่อหลายคนไม่ใช่ "รูปแบบ" พวกมันเป็นหน่วยการสร้างพื้นฐานของโมเดลเชิงสัมพันธ์


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