นักพัฒนาทุกคนควรรู้อะไรเกี่ยวกับฐานข้อมูล [ปิด]


206

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



แนวคิดที่สำคัญที่นักพัฒนาซอฟต์แวร์และผู้เชี่ยวชาญด้านซอฟต์แวร์อื่น ๆ ควรทราบเกี่ยวกับฐานข้อมูลคืออะไร


แนวทางการตอบสนอง:


ทำให้รายการของคุณสั้น
หนึ่งแนวคิดต่อคำตอบนั้นดีที่สุด

เฉพาะเจาะจง
"การสร้างแบบจำลองข้อมูล" อาจเป็นทักษะที่สำคัญแต่นั่นหมายความว่าอย่างไร

อธิบายเหตุผลของคุณ
เหตุใดแนวคิดของคุณจึงสำคัญ อย่าพูดว่า "ใช้ดัชนี" อย่าตกเป็น "แนวปฏิบัติที่ดีที่สุด" โน้มน้าวใจผู้ฟังของคุณให้เรียนรู้เพิ่มเติม

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

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


15
โหวตให้ปิดทำไม? เป็นชุมชน Wikia และเหมาะสม
David

5
ฉันจะลงคะแนนจะเปิดถ้ามันได้รับปิด ... ฉันยังต้องการที่จะเห็นรายชื่อของสิ่งเหล่านั้นที่ DBAs ควร ( แต่ไม่) รู้เกี่ยวกับ OOP และการประยุกต์ใช้ / ระบบซอฟแวร์การออกแบบ ..
ชาร์ลส์ Bretana

7
@gnovice: คำว่า "อัตนัย" ในบริบทนั้นหมายถึงคำถามที่เป็นเรื่องของความคิดเห็นทั้งหมด "คุณคิดอย่างไรกับหนังสือของ Joe Celko?" - นั่นเป็นคำถามแบบอัตนัย คำถามนี้เป็นการเรี่ยไรข้อมูลวัตถุประสงค์มันเกิดขึ้นเมื่อไม่มีคำตอบเดียวที่ถูกต้อง ฉันคิดว่าเป็นเรื่องสำคัญที่คุณจะต้องถอยห่างออกไปและถามว่า "นี่เป็นเพียงเรื่องไร้สาระหรือเป็นประโยชน์สำหรับนักพัฒนาซอฟต์แวร์บางคน" อย่างไรก็ตามสองเซนต์ของฉัน - มันไม่ใช่ว่าฉันได้รับคะแนนตัวแทนสำหรับเรื่องนี้ :-)
Aaronaught

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

4
ฉันพบสิ่งนี้ค่อนข้างน่าสนใจ: "เป็น Wiki ชุมชนและเหมาะสม" CW บนโลกจะเหมาะสมได้อย่างไร? อาจเป็นคำถามที่เหมาะสมหรือไม่และฉันคิดว่าคำถามนี้เป็นวิธีที่จะทำให้เกิดประโยชน์ได้หากมีใครบางคนกำลังมองหาคำตอบ มันอาจจะน่าสนใจ แต่นั่นไม่ใช่ลักษณะเฉพาะคำถามที่ต้องมี
Georg Schölly

คำตอบ:


106

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

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

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

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

สิ่งที่สามที่นักพัฒนาจำเป็นต้องเรียนรู้อย่างน้อยก็ในภาพรวมคือการสร้างแบบจำลองข้อมูลรวมถึงการสร้างแบบจำลองข้อมูลแนวคิดการสร้างแบบจำลองข้อมูลเชิงตรรกะและการสร้างแบบจำลองข้อมูลทางกายภาพ

การสร้างแบบจำลองข้อมูลแนวคิดเป็นการวิเคราะห์ความต้องการจากมุมมองข้อมูลเป็นศูนย์กลาง

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

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

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

ในที่สุดใครก็ตามที่ยุ่งกับฐานข้อมูลต้องเข้าใจว่าค่าของข้อมูลมักจะอยู่ได้นานกว่าระบบที่ถูกดักจับ

ต๊าย!


เขียนได้ดีมาก! และมุมมองทางประวัติศาสตร์นั้นยอดเยี่ยมสำหรับผู้ที่ไม่ได้ทำงานฐานข้อมูลในเวลานั้น (เช่นฉัน)
Aaronaught

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

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

1
หากคุณพบว่าการอ่านมอนสเตอร์ตัวนี้น่ากลัวลองจินตนาการว่ามันรู้สึกอย่างไรกับการเขียนมัน! ฉันไม่ได้ตั้งใจเขียนเรียงความ เมื่อฉันเริ่มต้นมันก็ดูเหมือนจะไหล ใครก็ตามที่เพิ่มสิ่งที่เป็นประโยชน์จริงๆช่วยให้ผู้อ่าน IMO
Walter Mitty

3
@Walter คุณให้คำอธิบายสำหรับทุกจุดยกเว้นเรื่องนี้: "สิ่งที่สองที่นักพัฒนาจำเป็นต้องเรียนรู้เกี่ยวกับฐานข้อมูลคือมุมมองของศูนย์กลางข้อมูลทั้งหมดของโลกมุมมองข้อมูลศูนย์กลางของโลกนั้นแตกต่างจากมุมมองโลกศูนย์กลางของกระบวนการมากกว่า สิ่งที่นักพัฒนาส่วนใหญ่เคยเรียนรู้มาเปรียบเทียบกับช่องว่างนี้ช่องว่างระหว่างการเขียนโปรแกรมเชิงโครงสร้างและการเขียนโปรแกรมเชิงวัตถุนั้นค่อนข้างเล็ก " คุณช่วยอธิบายเรื่องนี้ได้ไหม? คุณระบุว่าช่องว่างมีขนาดใหญ่ แต่ฉันคิดว่าฉันต้องการเข้าใจมุมมองที่เน้นข้อมูลเป็นหลักและวิธีแยกออกจากมุมมองกระบวนการ
jedd.ahyoung

73

คำถามที่ดี. ต่อไปนี้เป็นความคิดบางอย่างที่ไม่มีลำดับเฉพาะ:

  1. การทำให้เป็นมาตรฐานอย่างน้อยรูปแบบปกติที่สองนั้นเป็นสิ่งจำเป็น

  2. ความสมบูรณ์ของการอ้างอิงก็เป็นสิ่งจำเป็นเช่นกันด้วยการพิจารณาลบและปรับปรุงอย่างเหมาะสม

  3. การใช้ข้อ จำกัด การตรวจสอบที่ดีและเหมาะสม ให้ฐานข้อมูลทำงานได้มากที่สุด

  4. อย่ากระจายตรรกะทางธุรกิจทั้งในฐานข้อมูลและรหัสชั้นกลาง เลือกอย่างใดอย่างหนึ่งโดยเฉพาะอย่างยิ่งในรหัสชั้นกลาง

  5. ตัดสินใจเลือกวิธีการที่สอดคล้องกันสำหรับคีย์หลักและคีย์แบบคลัสเตอร์

  6. ไม่ทำดัชนีมากกว่า เลือกดัชนีของคุณอย่างชาญฉลาด

  7. การตั้งชื่อตารางและคอลัมน์ที่สอดคล้องกัน เลือกมาตรฐานและติดมัน

  8. จำกัด จำนวนคอลัมน์ในฐานข้อมูลที่จะยอมรับค่า Null

  9. อย่านำตัวไปด้วย พวกเขามีการใช้งาน แต่สามารถทำให้สิ่งต่าง ๆ อย่างเร่งด่วน

  10. ระวังด้วย UDF สิ่งเหล่านี้ยอดเยี่ยม แต่อาจทำให้เกิดปัญหาประสิทธิภาพเมื่อคุณไม่ทราบว่าจะมีการเรียกใช้แบบสอบถามบ่อยแค่ไหน

  11. รับหนังสือของ Celko เกี่ยวกับการออกแบบฐานข้อมูล ผู้ชายคนนี้หยิ่ง แต่รู้เรื่องของเขา


1
สนใจที่จะอธิบายอย่างละเอียดในหัวข้อที่ 4 หัวข้อนี้ทำให้ฉันสนใจ
แบรด

9
@ David: ฉันมักจะชอบที่จะวางไว้ในทั้งสองแห่ง ด้วยวิธีนี้คุณจะได้รับการปกป้องจากข้อบกพร่องเช่นเดียวกับข้อผิดพลาดของผู้ใช้ ไม่มีเหตุผลที่จะทำให้ทุกคอลัมน์เป็นโมฆะหรืออนุญาตให้ค่าที่อยู่นอกช่วง 1-12 ถูกแทรกลงในMonthคอลัมน์ แน่นอนว่ากฎเกณฑ์ทางธุรกิจที่ซับซ้อนนั้นเป็นอีกเรื่องหนึ่ง
Aaronaught

1
@Brad - แอปพลิเคชันส่วนใหญ่ในที่ทำงานทำได้ดีก่อนที่จะวางกระบวนการเขียนโปรแกรมที่เป็นของแข็ง ดังนั้นเราจึงมีตรรกะทางธุรกิจกระจัดกระจายไปทุกที่ บางส่วนอยู่ใน UI บางตัวอยู่ในระดับกลางและบางส่วนในฐานข้อมูล มันเป็นระเบียบ IMO ตรรกะทางธุรกิจอยู่ในระดับกลาง
Randy Minder

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

1
จุดที่ 8 สำคัญจริงๆ วิธีการทำให้คอลัมน์ประเภททั่วไปเป็นสิ่งสำคัญที่ต้องรู้
คริส Vest

22

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

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

ประการที่สามนักพัฒนาจำเป็นต้องเข้าใจ SQL พื้นฐานรวมถึงการรวม

ที่ผ่านมานี้ขึ้นอยู่กับว่านักพัฒนามีส่วนร่วมอย่างไร ฉันได้ทำงานในตำแหน่งที่ฉันเป็นนักพัฒนาและพฤตินัย DBA ที่ DBAs เพิ่งเดินไปตามทางเดินและที่ DBA ถูกปิดในพื้นที่ของตัวเอง (ฉันไม่ชอบอันดับที่สาม) สมมติว่านักพัฒนามีส่วนร่วมในการออกแบบฐานข้อมูล:

พวกเขาจำเป็นต้องเข้าใจการฟื้นฟูพื้นฐานอย่างน้อยสามรูปแบบปกติแรก อะไรก็ได้นอกจากนั้นรับ DBA สำหรับผู้ที่มีประสบการณ์เกี่ยวกับห้องพิจารณาคดีของสหรัฐฯ (และรายการโทรทัศน์แบบสุ่มนับที่นี่) มีตัวช่วยจำ "ขึ้นอยู่กับคีย์ทั้งคีย์และไม่มีอะไรนอกจากกุญแจดังนั้นช่วยให้คุณ Codd"

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

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

พวกเขาควรมีความรู้พื้นฐานเกี่ยวกับวิธีการวางแผนและวิธีการอ่านโดยทั่วไป (อย่างน้อยก็เพียงพอที่จะบอกได้ว่าอัลกอริทึมนั้นมีประสิทธิภาพหรือไม่)

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

แน่นอนว่าพวกเขาควรรู้ที่จะไม่เข้าไปยุ่งกับข้อมูลการผลิตหรือรหัสการผลิตหรืออะไรทำนองนั้นและพวกเขาควรรู้ว่าซอร์สโค้ดทั้งหมดจะเข้าสู่ VCS

ฉันลืมอะไรไปอย่างไม่ต้องสงสัย แต่ผู้พัฒนาโดยเฉลี่ยไม่จำเป็นต้องเป็น DBA หากมี DBA จริงอยู่ในมือ


19

การจัดทำดัชนีพื้นฐาน

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

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

ผู้ออกแบบควรตระหนักถึงรูปแบบการต่อต้านดัชนีทั่วไปเช่น:

  • Access anti-pattern (การทำดัชนีทุกคอลัมน์หนึ่งต่อหนึ่ง)
  • Anti-All-pattern-anti (ดัชนีขนาดใหญ่หนึ่งรายการในคอลัมน์ทั้งหมดหรือส่วนใหญ่ถูกสร้างขึ้นภายใต้การแสดงผลที่เข้าใจผิดว่าจะเพิ่มความเร็วในการค้นหาที่เป็นไปได้ทั้งหมดที่เกี่ยวข้องกับคอลัมน์ใด ๆ เหล่านั้น)

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


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

1
@Edmund: ดัชนีครอบคลุมแบบสอบถามหากฟิลด์เอาต์พุตทั้งหมดเป็นส่วนหนึ่งของดัชนี (ไม่ว่าจะเป็นคอลัมน์หรือคอลัมน์ที่จัดทำดัชนีINCLUDEใน SQL Server) หากดัชนีที่พร้อมใช้งานสำหรับแบบสอบถามที่ระบุไม่ครอบคลุมดังนั้นแถวทั้งหมดจะต้องถูกดึงคืนหนึ่งต่อหนึ่งซึ่งเป็นการดำเนินการที่ช้ามากและเวลาส่วนใหญ่ของเครื่องมือเพิ่มประสิทธิภาพแบบสอบถามจะตัดสินว่าไม่ใช่ ไม่คุ้มค่าและทำการสแกนดัชนี / ตารางแบบเต็มแทน นั่นเป็นเหตุผลที่คุณไม่ได้เขียนSELECT *- รับประกันได้เลยว่าไม่มีดัชนีใดที่จะครอบคลุมแบบสอบถาม
Aaronaught

ขอบคุณ! แม้ว่าในฐานะผู้ใช้ PostgreSQL ฉันไม่จำเป็นต้องกังวลเกี่ยวกับสิ่งต่าง ๆ (ยัง?): ดัชนีไม่มีข้อมูลการมองเห็นดังนั้น tuples ของตารางจะต้องถูกสแกนด้วยเช่นกัน โดยทั่วไปแล้วดูเหมือนว่าจะเป็นปัจจัยสำคัญ
Edmund

@Edmund: PostgreSQL อาจไม่มีINCLUDEคอลัมน์ (ฉันไม่สามารถพูดได้อย่างแน่นอน) แต่นั่นไม่ได้หมายความว่าคุณไม่สามารถใส่คอลัมน์ที่คุณต้องการครอบคลุมในข้อมูลดัชนีจริง นั่นคือสิ่งที่เราต้องทำใน SQL Server 2000 วัน ความคุ้มครองยังคงสำคัญไม่ว่าคุณจะใช้ DBMS ใดอยู่
Aaronaught

16

normalization

มันกดดันให้ฉันเห็นใครบางคนที่พยายามเขียนคำถามที่ซับซ้อนมากจนเกินไปซึ่งตรงไปตรงมากับการออกแบบปกติ ("แสดงยอดขายทั้งหมดต่อภูมิภาค")

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

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


14

ดัชนีทำงานอย่างไร

อาจไม่ใช่หัวข้อที่สำคัญที่สุด แต่แน่นอนว่าหัวข้อที่ถูกประเมินต่ำที่สุด

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

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

นั่นเป็นเพราะฐานข้อมูล SQL ทำงานได้ดีมากในฐานะแบล็กบ็อกซ์:

บอกสิ่งที่คุณต้องการ (gimme SQL) ฉันจะดูแลมัน

และทำงานได้อย่างสมบูรณ์แบบเพื่อดึงผลลัพธ์ที่ถูกต้อง ผู้เขียน SQL ไม่จำเป็นต้องรู้ว่าระบบกำลังทำอะไรอยู่เบื้องหลัง - จนกระทั่งทุกอย่างกลายเป็นเรื่องเหลวไหล .....

นั่นคือเมื่อการจัดทำดัชนีกลายเป็นหัวข้อ แต่โดยปกติแล้วจะช้ามากและบางคน (บาง บริษัท ?) กำลังประสบปัญหาที่แท้จริงอยู่แล้ว

นั่นเป็นเหตุผลที่ผมเชื่อว่าการจัดทำดัชนีเป็นหัวข้อฉบับที่ 1 จะไม่ลืมเมื่อทำงานกับฐานข้อมูล น่าเสียดายที่ลืมง่ายมาก

คำปฏิเสธ

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


12

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

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

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


คุณหมายถึงชอบในการทำแผนภาพความสัมพันธ์เอนทิตี้หรือไม่?
crosenblum

ใช่ ... ฉันลืมพูดถึง ERDs หรือไม่ :-)
FernandoZ

+1 ... แต่คุณต้องตระหนักว่าคุณอยู่บน SO: บ้านช่างประปาใช้เวลาในการแก้ไขความต้านทาน ORM ไม่ตรงกันดังนั้นสิ่งที่พวกเขารู้กินและคิดว่าไม่ใช่แค่ความสัมพันธ์ แต่ "SQL" :)
SyntaxT3rr0r


9

นักพัฒนาทุกคนควรรู้ว่าสิ่งนี้เป็นเท็จ: "การรวบรวมโปรไฟล์การดำเนินการฐานข้อมูลแตกต่างจากรหัสการทำโปรไฟล์"

มี Big-O ที่ชัดเจนในความหมายดั้งเดิม เมื่อคุณทำEXPLAIN PLAN(หรือเทียบเท่า) คุณจะเห็นอัลกอริทึม อัลกอริทึมบางตัวเกี่ยวข้องกับลูปซ้อนกันและเป็นO ( n ^ 2) อัลกอริทึมอื่น ๆ เกี่ยวข้องกับการค้นหา B-tree และเป็นO ( n log n )

นี่มันร้ายแรงมากจริงๆ เป็นศูนย์กลางของการทำความเข้าใจว่าทำไมดัชนีจึงมีความสำคัญ เป็นศูนย์กลางของการทำความเข้าใจกับการแลกเปลี่ยนความเร็ว - การทำให้เป็นมาตรฐาน เป็นศูนย์กลางในการทำความเข้าใจว่าทำไมคลังข้อมูลใช้สตาร์ - สคีมาซึ่งไม่ได้ทำให้เป็นมาตรฐานสำหรับการปรับปรุงธุรกรรม

หากคุณไม่ชัดเจนเกี่ยวกับอัลกอริทึมที่ใช้ให้ทำดังต่อไปนี้ หยุด. อธิบายแผนการดำเนินการแบบสอบถาม ปรับดัชนีตาม

นอกจากนี้ยังมีข้อสรุป: ดัชนีเพิ่มเติมไม่ดีขึ้น

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


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

@Aaron: คุณทำมีการควบคุมขั้นตอนวิธี นั่นคือสิ่งที่ดัชนีมีไว้สำหรับ
S.Lott

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

@Aaron: การควบคุมที่น้อยลงไม่ได้ลบข้อผูกมัดที่จะเข้าใจหากว่าแบบสอบถามเป็น* O ** (* n ^ 2) หรือ* O ** (* n log n ) หรือเพียงแค่ ** O ** (n) การควบคุมที่น้อยลงไม่ได้เป็นการลบพันธกรณีที่จะเข้าใจสิ่งที่เกิดขึ้นจริงและเพื่อค้นหาวิธีการควบคุม
S.Lott

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

8

ผมคิดว่านักพัฒนาทุกคนควรเข้าใจว่าฐานข้อมูลที่จำเป็นต้องมีกระบวนทัศน์ที่แตกต่างกัน

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


โปรดอธิบายความหมายของวิธีการ "ตั้งค่า"
วิเวียนริเวอร์

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

8

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

อีกสิ่งที่นักพัฒนาควรเข้าใจคือมีสามสิ่งที่คุณควรคำนึงถึงเมื่อออกแบบฐานข้อมูล:

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

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

  3. ความปลอดภัย - ข้อมูลนี้เป็นเลือดชีวิตของ บริษัท ของคุณมันยังมีข้อมูลส่วนบุคคลที่ถูกขโมยบ่อยๆ เรียนรู้วิธีปกป้องข้อมูลของคุณจากการโจมตีการฉีด SQL และการฉ้อโกงและการขโมยข้อมูลประจำตัว

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

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

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

อย่าพัฒนาในฐานข้อมูลเวอร์ชันที่ใหม่กว่าเวอร์ชันการผลิต ไม่เคยไม่เคยไม่เคยพัฒนาโดยตรงกับฐานข้อมูลการผลิต

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

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


6

การออกแบบฐานข้อมูลเชิงวิวัฒนาการ http://martinfowler.com/articles/evodb.html

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

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

กระบวนการออกแบบฐานข้อมูลวิวัฒนาการมีแง่มุมของการบริหารจัดการตัวอย่างเช่นคอลัมน์จะถูกดร็อปหลังจากช่วงเวลาชีวิตในฐานข้อมูลทั้งหมดของโค๊ดฐานนี้

อย่างน้อยก็ทราบว่ามีแนวคิดและวิธีการในการสร้างฐานข้อมูลขึ้นใหม่ http://www.agiledata.org/essays/databaseRefactoringCatalog.html

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


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

ดูเพิ่มเติมที่ฐานข้อมูล Refactoring ฐานข้อมูลของ Ambler ( amazon.com/Refactoring-Database-Evolutionary-Database-Design/… )
Jonathan Leffler

5

จากประสบการณ์ของฉันกับฐานข้อมูลเชิงสัมพันธ์ผู้พัฒนาทุกคนควรรู้:

- ประเภทข้อมูลที่แตกต่าง :

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

- เรียนรู้เกี่ยวกับ 1xM และ MxM :

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

- หลักการ " KISS " นำไปใช้กับ DB เช่นกัน :

ความเรียบง่ายใช้งานได้ดีที่สุดเสมอ หากคุณได้ศึกษาว่า DB ทำงานอย่างไรคุณจะหลีกเลี่ยงความซับซ้อนที่ไม่จำเป็นซึ่งจะนำไปสู่ปัญหาการบำรุงรักษาและความเร็ว

- ดัชนี :

มันไม่เพียงพอถ้าคุณรู้ว่าพวกเขาคืออะไร คุณต้องเข้าใจว่าจะใช้เมื่อใดและเมื่อใด


เพิ่มเติม:

  • พีชคณิตแบบบูลคือเพื่อนของคุณ
  • รูปภาพ: อย่าเก็บไว้ในฐานข้อมูล อย่าถามว่าทำไม
  • ทดสอบ DELETE ด้วย SELECT

+1 สำหรับรูปภาพ ฉันจะแทนที่ 'Images' ด้วย 'BLOBs'
Agnel Kurian

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

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

5

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


5

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


5

เกี่ยวกับความคิดเห็นต่อคำตอบของ Walter M. :

"เขียนได้ดีมาก! และมุมมองทางประวัติศาสตร์นั้นยอดเยี่ยมสำหรับผู้ที่ไม่ได้ทำงานฐานข้อมูลในเวลานั้น (เช่นฉัน)"

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

สำหรับคำถามตัวเอง:

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

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


1
ฉันยอมรับว่าผู้พัฒนาต้องการทราบว่า SQL และ RDM แตกต่างกันที่ไหน ต้องบอกว่าการใช้ RDM อย่างรอบคอบสามารถช่วยผู้ออกแบบฐานข้อมูลได้แม้ว่าการใช้งานจะเป็น SQL ก็ตาม
Walter Mitty

1
ในกรณีที่คุณลืม George Santayana เขียนข้อความอ้างอิงแบบคลาสสิกนั้น
crosenblum

5

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

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

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


คำตอบที่ดี. เราแต่ละคนมีพื้นที่ของเราเองเรามีส่วนร่วมในทุกปัญหาหรือวิธีการแก้ไข
crosenblum

5

เคารพง่าย

  • มันไม่ใช่แค่พื้นที่เก็บข้อมูล
  • คุณอาจไม่รู้จักดีกว่าผู้จำหน่ายหรือ DBA
  • คุณจะไม่สนับสนุนในเวลาตีสามด้วยผู้จัดการอาวุโสตะโกนใส่หน้าคุณ

3

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

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


3

อย่าแทรกข้อมูลด้วยการเข้ารหัสข้อความที่ผิด

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


2
"การเข้ารหัสข้อความที่ผิด" คืออะไรและจะเกิดขึ้นได้อย่างไร
Gennady Vanin ГеннадийВанин

1
@ vgv8 มันเกิดขึ้นเมื่อลูกค้าของคุณอนุญาตให้ผู้ใช้ส่งข้อความในการเข้ารหัสใด ๆ ที่คุณต้องการคุณสุ่มสี่สุ่มห้าเก็บไว้ จากนั้นเมื่อคุณต้องการทำการแปลงหรือวิเคราะห์บางประเภทการแบ่งรหัสของคุณเนื่องจากแอปพลิเคชันของคุณสันนิษฐานว่าเป็น utf-8 แต่คนโง่บางคนเพิ่มข้อมูล utf-16 และข้อผิดพลาดของโปรแกรมของคุณ
mikerobi

3

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

รู้ว่าเอ็นจินของคุณกำลังดำเนินการกับเคียวรีที่คุณเขียนด้วยความจำเพาะเจาะจงอย่างไร

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

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

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

รู้ขั้นตอนการประมวลผลเอ็นจินฐานข้อมูลของคุณและวางแผน


3

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

C ++ geek ทุกคนเขียนคลาสสตริงในวิทยาลัย กราฟิกทุกคนเกินบรรยายเขียน raytracer ในวิทยาลัย เว็บ geek ทุกคนเขียนเว็บไซต์อินเทอร์แอคทีฟ (ปกติก่อนที่เราจะมี "web frameworks") ในวิทยาลัย ฮาร์ดแวร์ทุกอัน (และแม้แต่ซอฟท์แวร์ผู้ใช้) สร้างซีพียูในวิทยาลัย แพทย์ทุกคนผ่าศพทั้งหมดในวิทยาลัยแม้ว่าเธอจะรับความดันโลหิตของฉันและบอกว่าคอเลสเตอรอลของฉันสูงเกินไปในวันนี้ ทำไมฐานข้อมูลจะแตกต่างกันอย่างไร

โชคไม่ดีที่วันนี้พวกเขาดูแตกต่างไป ผู้คนต้องการโปรแกรมเมอร์ NET เพื่อทราบวิธีการทำงานในสาย Cแต่ internals ของ RDBMS ของคุณไม่ควรกังวลคุณมากเกินไป

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

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


จากบทความ Joel ที่เชื่อมโยงเกี่ยวกับสตริง C ไม่นำตัวอย่างข้อมูลต่อไปนี้ไปสู่พฤติกรรมที่ไม่ได้กำหนด: char * str = "* Hello!"; str [0] = strlen (str) - 1; str เป็นสตริงตัวอักษรและทั่วไปในหน่วยความจำแบบอ่านอย่างเดียว คุณไม่สามารถเขียนมัน:?
HeretoLearn

ผู้เชี่ยวชาญฐานข้อมูลมืออาชีพดี แต่นักพัฒนาทุกคน ?
เบ็นแอสตัน

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

2

ลำดับของคอลัมน์ในดัชนีที่ไม่ซ้ำมีความสำคัญ

คอลัมน์แรกควรเป็นคอลัมน์ที่มีความแปรปรวนมากที่สุดในเนื้อหา (เช่นความเป็นหัวใจ)

นี่คือเพื่อช่วยความสามารถของ SQL Server ในการสร้างสถิติที่เป็นประโยชน์ในการใช้ดัชนีตอนรันไทม์


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

ขอบคุณ แต่หากดัชนีถูกสร้างขึ้นใน 3 เขตข้อมูลบนพื้นฐานที่แบบสอบถาม SQL เฉพาะจะใช้เขตข้อมูลเหล่านั้น 3 ในที่ของมันแล้วคำสั่งจะมีความสำคัญและเขตที่มีความสำคัญสูงสุดปรากฏขึ้นก่อนหน้านี้ \ นำไปสู่การปรับปรุงประสิทธิภาพ .... หรืออย่างน้อยนั่นคือสิ่งที่ฉันอ่านในหนังสือปรับแต่งประสิทธิภาพของ Microsoft SQL Server ฉันลองแล้วมันก็ดูเหมือนจะดีขึ้น (ปีที่แล้ว)
Mike D

2

ทำความเข้าใจกับเครื่องมือที่คุณใช้ในการเขียนโปรแกรมฐานข้อมูล !!!

ฉันเสียเวลามากมายในการพยายามทำความเข้าใจว่าทำไมรหัสของฉันจึงล้มเหลวอย่างลึกลับ

ตัวอย่างเช่นถ้าคุณใช้. NET คุณจำเป็นต้องรู้วิธีใช้วัตถุในSystem.Data.SqlClientเนมสเปซอย่างเหมาะสม คุณจำเป็นต้องรู้วิธีการจัดการSqlConnectionวัตถุของคุณเพื่อให้แน่ใจว่าพวกเขาจะเปิดปิดและเมื่อจำเป็นกำจัดอย่างถูกต้อง

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


2
  • ทักษะพื้นฐาน SQL
  • การจัดทำดัชนี
  • จัดการกับสาขาที่แตกต่างของ DATE / TIME / TIMESTAMP
  • เอกสารคู่มือไดรเวอร์ JDBCสำหรับแพลตฟอร์มที่คุณใช้
  • จัดการกับประเภทข้อมูลไบนารี ( CLOB , BLOBฯลฯ )



1

ความเข้ากันได้ RDBMS

ดูว่าจำเป็นต้องใช้แอปพลิเคชันใน RDBMS มากกว่าหนึ่งหรือไม่ ถ้าใช่อาจจำเป็นต้อง:

  • หลีกเลี่ยงส่วนขยาย RDBMS SQL
  • กำจัดทริกเกอร์และขั้นตอนการจัดเก็บ
  • ปฏิบัติตามมาตรฐาน SQL ที่เข้มงวด
  • แปลงชนิดข้อมูลภาคสนาม
  • เปลี่ยนระดับการแยกธุรกรรม

มิฉะนั้นคำถามเหล่านี้ควรได้รับการปฏิบัติแยกต่างหากและจะมีการพัฒนาเวอร์ชันต่าง ๆ (หรือการกำหนดค่า) ของแอปพลิเคชัน


1

ไม่ต้องพึ่งพาลำดับของแถวที่ส่งคืนโดยแบบสอบถาม SQL


3
... เว้นแต่จะมีORDER BYประโยคอยู่ในนั้น?
Aaronaught

และอย่าใช้ORDER BYโดยไม่จำเป็นเพราะจะเป็นการเพิ่มภาระให้กับเซิร์ฟเวอร์ SQL
Vivian River

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