ความแตกต่างระหว่างอัลกอริธึมที่ใช้โครงสร้างข้อมูลและอัลกอริธึมที่ใช้ฐานข้อมูลคืออะไร


10

คำถามทั่วไป

ความแตกต่างระหว่างอัลกอริธึมที่ใช้โครงสร้างข้อมูลและอัลกอริธึมที่ใช้ฐานข้อมูลคืออะไร

บริบทบางอย่าง

นี่เป็นคำถามที่ดักฟังฉันมาระยะหนึ่งแล้วและฉันไม่สามารถหาคำตอบที่น่าเชื่อถือได้

ขณะนี้ฉันกำลังทำงานเพื่อเสริมสร้างความเข้าใจเกี่ยวกับอัลกอริทึมที่แน่นอนว่าเกี่ยวข้องกับโครงสร้างข้อมูลอย่างหนัก สิ่งเหล่านี้เป็นโครงสร้างพื้นฐานเช่นกระเป๋าคิวคิวกองซ้อนลำดับความสำคัญคิวและกอง

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

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

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

ดังนั้นนี่คือคำถาม ...

คำถาม

  1. โครงสร้างข้อมูลและฐานข้อมูลแตกต่างกันอย่างไร
  2. เมื่อไหร่ที่เราจะใช้อัลกอริทึมที่ใช้โครงสร้างข้อมูลที่กำหนดไว้เฉพาะภายในตรรกะของคุณเองและไม่ใช่ของฐานข้อมูล
  3. @ ฮาร์วีย์โพสต์:เมื่อใดที่วิธีการในฐานข้อมูลมีประสิทธิภาพน้อยกว่าการใช้วิธีการในตรรกะของคุณเอง?
    • @mirculixx โพสต์:วิธีใดที่ทำให้มีประสิทธิภาพ
  4. @ ฮาร์วีย์โพสต์:การประมวลผลข้อมูลด้วยโครงสร้างข้อมูลเร็วกว่าทำในฐานข้อมูลอย่างไร

ชี้แจง

  1. @Grant โพสต์:ฐานข้อมูลที่ฉันทำงานตามปกตินั้นสัมพันธ์กันและคำถามเหล่านี้ไม่ได้ทำงานกับพวกเขา อย่างไรก็ตามฉันคิดว่าคำถามเหล่านี้ใช้กับกรอบการคงอยู่ใด ๆ (เมื่อฉันพูดกรอบฉันหมายถึงในความหมายทั่วไปมากที่สุด)

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


datomic.comฐานข้อมูลเป็นผู้ใกล้ชิดกับผู้ใช้กว่าคนที่เชิงสัมพันธ์แบบดั้งเดิม คุณกำลังดูฐานข้อมูลดั้งเดิมอยู่หรือไม่?
งาน

@ งานไม่มีฐานข้อมูลเชิงสัมพันธ์ไม่ใช่สิ่งเดียวที่ฉันกำลังพิจารณาที่นี่ มันเกี่ยวกับการทำความเข้าใจความแตกต่างระหว่างโครงสร้างข้อมูลในตรรกะกับโครงสร้างข้อมูลในหน่วยฐานข้อมูล / การคงอยู่
hulkmeister

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

ส่งข้อมูลไปยังฐานข้อมูลเพื่อจัดเรียงหรือไม่ ชอบขับรถรอบบล็อกเพื่อเปลี่ยนความคิดของคุณ?

คำตอบ:


18

โครงสร้างข้อมูลเป็นส่วนใหญ่:

  1. หน่วยความจำถิ่น
  2. ชั่วคราว,
  3. ขนาด จำกัด
  4. ไม่เข้าใหม่โดยไม่ต้องเพิ่มกลไกการทำงานพร้อมกันเช่นล็อคหรือเปลี่ยนแปลงไม่ได้
  5. ไม่ACIDตาม
  6. เร็วถ้าเลือกอย่างระมัดระวัง

ฐานข้อมูลเป็นส่วนใหญ่:

  1. ดิสก์ที่ถูกผูกไว้
  2. หมั่น,
  3. ใหญ่,
  4. เกิดขึ้นพร้อมกันอย่างปลอดภัย
  5. สอดคล้องกับกรดด้วยความสามารถในการทำธุรกรรม
  6. ช้ากว่าโครงสร้างข้อมูล

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

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


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

1
นั่นคือขนมปังและเนยของ DAL ใช่มั้ย มีอยู่ DAL เพื่อความสะดวกในการเปลี่ยนระหว่างวัตถุและบันทึกฐานข้อมูล DAL นั้นดีสำหรับประมาณ 80 ถึง 90 เปอร์เซ็นต์ของสิ่งที่คุณต้องการทำกับฐานข้อมูล แต่สำหรับ 10 ถึง 20 เปอร์เซ็นต์ที่เหลือคุณอาจต้องการย้อนกลับไปใช้ SQL ดิบหรือกระบวนงานที่เก็บไว้เนื่องจากมีประสิทธิภาพมากกว่า
Robert Harvey

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

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

1
ฐานข้อมูลช้าลงด้วยเหตุผลหลายประการ การแคชแม้ว่าคุณจะต้องอ่านข้อมูลจากดิสก์โดยใช้คำสั่ง SQL ที่จะต้องถูกคอมไพล์โดยมีแผนการดำเนินการที่เกี่ยวข้องกับหลายตารางบ่อยๆ กระบวนการนี้ซับซ้อนกว่ามาก นอกจากนี้โดยทั่วไปคุณยังต้องโอนผลลัพธ์ผ่านสายซึ่งคุณแปลข้อมูลลงในโครงสร้างข้อมูลเพื่อให้คุณสามารถทำงานกับมันได้
Robert Harvey

6

โครงสร้างข้อมูลและฐานข้อมูลแตกต่างกันอย่างไร

ในระดับนามธรรมไม่มีเลย - ฐานข้อมูลเป็นโครงสร้างข้อมูล

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

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

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

ในแนวโน้มฉันจะโต้แย้ง

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

b) ใช้โครงสร้างข้อมูลของคุณเอง (ในหน่วยความจำ) หากความเร็วของรันไทม์มีความสำคัญหรือไม่จำเป็นต้องมีอยู่

เช่นหากอัลกอริทึมของคุณประมวลผลบันทึกลูกค้าคุณอาจต้องการจัดเก็บบันทึกลูกค้าเหล่านั้น (พูดเพื่อค้นหาลูกค้าทั้งหมดในพื้นที่เฉพาะ) เพื่อใช้ในภายหลังโดยโปรแกรม / อัลกอริทึมอื่น ๆ และเพื่อจุดประสงค์ที่แตกต่างกันโดยสิ้นเชิง ) ในกรณีนี้การใช้ฐานข้อมูลเพื่อยืนยันข้อมูลอาจเป็นความคิดที่ดี

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

เมื่อใดที่วิธีการในฐานข้อมูลมีประสิทธิภาพน้อยกว่าการใช้วิธีการในตรรกะของคุณเอง?

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

การประมวลผลข้อมูลด้วยโครงสร้างข้อมูลนั้นเร็วกว่าการทำในฐานข้อมูลอย่างไร

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


1

การเข้าถึงดิสก์เป็นหลักสิ่งที่แพงที่สุดในการดำเนินการนี้บ่อยกว่าการเข้าถึงเครือข่าย (http://serverfault.com/questions/238417/are-networks-now-faster-than-disks) ถ้าฐานข้อมูลของคุณไม่ได้อยู่ในเครือข่ายอย่างน้อย 1 Gbps และเครือข่ายเดียวกับ web \ application server ของคุณประสิทธิภาพของเครือข่ายจะไม่สำคัญเท่ากับประสิทธิภาพของดิสก์สำหรับชุดข้อมูลขนาดใหญ่ หรือหากข้อมูลของคุณเกิดขึ้นบนดิสก์โซลิดสเตตที่รวดเร็วซึ่งจะเร็วกว่าการเข้าถึงเครือข่ายทั่วไป นอกจากนี้ฐานข้อมูลมักจะให้กลไก IPC เช่นไปป์ที่มีชื่อแทนการใช้ TCP / IP หากฐานข้อมูลอยู่บนเซิร์ฟเวอร์เดียวกันกับเซิร์ฟเวอร์แอปพลิเคชันของคุณ

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

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


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

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

0

คุณหมายถึงอะไรโดยฐานข้อมูล คุณหมายถึงฐานข้อมูลเชิงสัมพันธ์เช่น MySQL หรือ SQL Server หรือไม่ ฐานข้อมูลเชิงสัมพันธ์เป็นโครงสร้างข้อมูล meta ที่สนับสนุนชุดย่อยของการดำเนินงานบางส่วนที่กำหนดโดยแบบเชิงสัมพันธ์ ทฤษฎีของโมเดลเชิงสัมพันธ์ซึ่งส่วนใหญ่ทำงานโดย Edgar Codd ในยุค 60

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

ฉันเรียกว่าฐานข้อมูลเชิงสัมพันธ์เป็นโครงสร้างเมตาดาต้าเพราะโดยทั่วไปแล้วเป็นซอฟต์แวร์ขนาดใหญ่ที่ใช้โครงสร้างข้อมูลจำนวนมากเช่นสแต็คคิวต้นไม้และรายการเพื่อสร้างโครงสร้างข้อมูลนามธรรมของตารางเชิงสัมพันธ์


ขออภัยคุณต้องการคำชี้แจงเกี่ยวกับความหมายของคำว่า "ย่อหน้าเล็กน้อย" ในส่วนที่เกี่ยวข้องกับย่อหน้าสุดท้ายหรือไม่
hulkmeister

@hulkmeister ขออภัยที่ควรจะเป็น 'ใหญ่' ไม่ใช่ 'บิต' ตัวแบบเชิงสัมพันธ์มีความเป็นนามธรรมและซับซ้อนค่อนข้างมาก โดยเฉพาะอย่างยิ่งสิ่งที่ให้กรด ((Atomicity, Consistency, Isolation, Durability) ใช้โค้ดที่ซับซ้อนจำนวนมากที่ทำงานอยู่เบื้องหลัง
Charles E. Grant
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.