การเขียนโปรแกรมเชิงสัมพันธ์กับการโปรแกรมเชิงซ้อน


24

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

ตัวอย่างเช่นสมมติว่าคุณมีแถบความสัมพันธ์ (bandName, bandCountry), สถานที่ (enueName ,enueCountry), การเล่น (bandName ,enueName) และฉันต้องการเขียนข้อความค้นหาที่ระบุว่า: ชื่อสถานที่ทั้งหมดเช่นสำหรับทุก bandCountry มีวงดนตรีจาก ประเทศนั้นที่เล่นแทนชื่อนั้น

ตัวอย่าง:ฉันต้องการสถานที่ทั้งหมดชื่อที่วงจากทุกประเทศ (bandCountry) เล่น นอกจากนี้โดย "ความสัมพันธ์" ฉันหมายถึงตาราง SQL

ในใจของฉันฉันจะไป "สำหรับแต่ละสถานที่ตั้งซ้ำทุก bandCountries และสำหรับแต่ละ bandCountry ได้รับรายชื่อของวงดนตรีที่มาจากมันถ้าไม่มีพวกเขาเล่นในenueNameไปที่หน้าสถานที่ถัดไปอื่น ๆ ในตอนท้ายของ bandCountries วนซ้ำเพิ่มชื่อสถานที่ไปยังชุดสถานที่ที่ดีชื่อ "

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

ป.ล. ฉันไม่ได้มองหาวิธีแก้ปัญหาสำหรับการค้นหาข้างต้นฉันไม่ได้แก้มัน


1
นี่เป็นคำถามที่ดีเพราะคุณกำลังพูดถึงจุดอ่อนที่หลายคน (รวมถึงตัวฉันเอง) ด้วย
David Weiser

อาจเป็นประโยชน์ในการกำหนดสิ่งที่คุณหมายถึงโดย "ความสัมพันธ์" ในคำถามของคุณ ในโมเดลเชิงสัมพันธ์ (คณิตศาสตร์ที่อยู่หลัง SQL) "ความสัมพันธ์" นั้นคล้ายคลึงกับตาราง SQL ผู้คนจำนวนมากจะพูดว่า "ความสัมพันธ์" เมื่อพวกเขาหมายถึงการพูดว่า "ความสัมพันธ์"
Jason Baker

เรียนรู้ทฤษฎีเซตและคณิตศาสตร์ไม่ต่อเนื่อง

1
@ Jase21 ฉันเองคุ้นเคยกับทั้งสองอย่างมาก แต่สิ่งที่ไม่สำคัญใน SQL ยังคงตลก ไม่มีตัวอย่างทางคณิตศาสตร์ที่สะอาดใด ๆ ที่เกี่ยวข้องกับสิ่งต่าง ๆ ที่แปลกประหลาด นอกจากนี้หนึ่งสามารถใช้ LINQ และทำให้ไม่ต้องใส่ใจกับ SQL ในที่สุดผู้ถาม: คุณจะชินกับเวลา
งาน

คำตอบ:


12

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

สำหรับฉันดูเหมือนว่าคุณกำลังทำอยู่ ปัญหาไม่ใช่ว่าคุณกำลังคิดเกี่ยวกับสิ่งต่าง ๆ ในทางที่ผิด คุณกำลังไปไกลเกินไป ลองดูสิ่งที่คุณกำลังพยายามทำ:

ตัวอย่างเช่นสมมติว่าคุณมีแถบความสัมพันธ์ (bandName, bandCountry), สถานที่ (enueName ,enueCountry), การเล่น (bandName ,enueName) และฉันต้องการเขียนข้อความค้นหาที่ระบุว่า: ชื่อสถานที่ทั้งหมดเช่นสำหรับทุก bandCountry มีวงดนตรีจาก ประเทศนั้นที่เล่นแทนชื่อนั้น

จนถึงตอนนี้มันเยี่ยมมาก แต่คุณทำสิ่งนี้:

ในใจของฉันฉันจะไป "สำหรับแต่ละสถานที่ตั้งซ้ำทุก bandCountries และสำหรับแต่ละ bandCountry ได้รับรายชื่อของวงดนตรีที่มาจากมันถ้าไม่มีพวกเขาเล่นในenueNameไปที่หน้าสถานที่ถัดไปอื่น ๆ ในตอนท้ายของ bandCountries วนซ้ำเพิ่มชื่อสถานที่ไปยังชุดสถานที่ที่ดีชื่อ "

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

ถ้าฉันเป็นคุณฉันจะลองทำตามนิสัยต่อไปนี้:

  1. กำหนดสิ่งที่คุณต้องการ
  2. หยุดตัวเองอย่างตั้งใจจากการกำหนดวิธีการรับมัน
  3. กำหนดวิธีแสดงสิ่งที่คุณต้องการใน SQL

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

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


ฉันไม่เข้าใจว่าการหาวิธีการรับบางสิ่งนั้นเป็นวิธีการที่ผิด ไม่ว่าคุณจะใช้ภาษาประเภทใดคุณต้องหาวิธีบอกให้ทำสิ่งที่คุณต้องการ
davidk01

9

คิดในแง่ของเซตไม่ใช่ตัววนซ้ำ คำสั่ง sql กำหนดคุณสมบัติของชุดผลลัพธ์ที่ต้องการ (aka ตาราง / ความสัมพันธ์)

สถานที่จัดงานทั้งหมดชื่อเช่นนั้นสำหรับทุก ๆ วงประเทศจะมีวงดนตรีจากประเทศนั้น ๆ ที่เล่นในสถานที่ของชื่อนั้น

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

ดังนั้นใน SQL สิ่งนี้จะเป็น:

select 
    distinct venueName
from PLAYS

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

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

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

declare @BandCountryCount int
select
    @BandCountryCount = COUNT(distinct bandCountry)
from BAND

เราสามารถนับประเทศของวงดนตรีสำหรับแต่ละสถานที่ได้

select
    P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
    inner join BAND B on B.bandName = P.bandName

และเราสามารถแยกชิ้นส่วนทั้งสองเข้าด้วยกันโดยใช้แบบสอบถามย่อย

select
    venueName
from (
    select
        P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
    from PLAYS P
        inner join BAND B on B.bandName = P.bandName
) X
where X.VenueBandCountryCount = @BandCountryCount

ตอนนี้นั่นไม่ใช่แบบสอบถามที่สวยที่สุดเท่าที่จะเป็นไปได้ (GROUP BY และ HAVING อาจได้รับการพิจารณาว่าเป็นวิธีที่ 'สวยงาม' มากกว่าตัวแปร temp และแบบสอบถามย่อย) แต่ก็ชัดเจนว่าเราอยู่ข้างหลังอะไร .

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

สำหรับแต่ละสถานที่ชื่อซ้ำกับ bandCount ทั้งหมดและสำหรับแต่ละ bandCountry จะได้รับรายชื่อของวงดนตรีที่มาจากมัน หากไม่มีคนใดในสถานที่ให้ไปที่ชื่อสถานที่ต่อไป อื่น ๆ ในตอนท้ายของการทำซ้ำ bandCountries เพิ่ม venueName ไปยังชุดของสถานที่ที่ดีชื่อ

เกณฑ์การพิจารณาในข้างต้นคืออะไร? ฉันคิดว่ามันคือ:

... หากไม่มีพวกเขา [กลุ่มของวงดนตรีจากประเทศใดประเทศหนึ่ง] เล่นในสถานที่จัดงาน ...

นี้เป็นเกณฑ์สิทธ์ กระบวนการคิดที่จำเป็นจะเริ่มต้นด้วยที่ฝากข้อมูลเต็มรูปแบบและทิ้งสิ่งที่ไม่ตรงกับเกณฑ์ เรากำลังกรองข้อมูล

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

  • ผู้ถูกตัดสิทธิ์: หากไม่มีวงดนตรีจากวงประเทศที่เล่นในสถานที่แสดงสถานที่นั้นจะถูกตัดสิทธิ์
  • รอบคัดเลือก (บางส่วน): หากมีอย่างน้อยหนึ่งวงจาก bandCountry เล่นในสถานที่แสดงว่าสถานที่นั้นอาจใช้ได้ ตรวจสอบส่วนที่เหลือของ bandCount ต่อไป
  • (เต็ม) รอบคัดเลือก: หากมีวงดนตรีอย่างน้อยหนึ่งวงจากแต่ละวงประเทศเล่นในสถานที่แสดงว่าสถานที่นั้นผ่านการรับรองแล้ว

รอบคัดเลือกสุดท้ายสามารถทำให้ง่ายขึ้นโดยใช้การนับ: bandCountry คือ 'พอใจ' ถ้ามีวงดนตรีอย่างน้อยหนึ่งวงจากที่นั่นเล่นในสถานที่จัดงาน จำนวนประเทศในแถบ 'พอใจ' สำหรับสถานที่จัดงานจะต้องเท่ากับจำนวนประเทศในแถบของสถานที่ที่จะมีคุณสมบัติ

ตอนนี้เราสามารถให้เหตุผลกับความสัมพันธ์โดยการนำทาง:

  • เริ่มต้นด้วยความสัมพันธ์แบบ VENUE [เราไม่ต้องการคำตอบ แต่เป็นจุดเริ่มต้นของแนวคิดสำหรับการนำทางเชิงสัมพันธ์]
  • เข้าร่วม PLAYS ในหน้าชื่อ
  • เข้าร่วมกับ BAND ใน bandName เพื่อรับ bandCountry
  • เราไม่สนใจชื่อวง เลือกเฉพาะชื่อสถานที่และ bandCountry
  • เราไม่สนใจเกี่ยวกับ bandCount ซ้ำซ้อน; กำจัดรายการที่ซ้ำกันโดยใช้ DISTRICT หรือ GROUP BY
  • เราใส่ใจเฉพาะการนับจำนวน bandCountries ที่แตกต่างกันไม่ใช่ชื่อ
  • เราต้องการเฉพาะสถานที่ที่นับ bandCountries แตกต่างกันเท่ากับจำนวน bandCountries ทั้งหมด

ซึ่งนำกลับไปแก้ปัญหาข้างต้น (หรือโทรสารที่เหมาะสมของมัน)

สรุป

  • ทฤษฎีเซต
  • เส้นทางการนำทางเชิงสัมพันธ์
  • รวมกับเกณฑ์พิเศษเฉพาะ (มีคุณสมบัติเทียบกับตัดสิทธิ์)

มันคือ "ชุดของสถานที่ที่มีวงดนตรีจากทุกประเทศ (bandCountry> =enueCountry) เล่นในพวกเขา"
EpsilonVector

@EpsilonVector: ดูการแก้ไข
Steven A. Lowe

4

วิธีหนึ่งในการเรียนรู้วิธีคิดและโปรแกรมในรูปแบบที่เปิดเผยคือการเรียนรู้ภาษาอาเรย์ที่มีวัตถุประสงค์ทั่วไปเช่น APL หรือ J SQL อาจไม่ใช่ยานพาหนะที่ดีที่สุดสำหรับการเรียนรู้วิธีการเขียนโปรแกรมอย่างชัดเจน ใน APL หรือ J คุณเรียนรู้การใช้งานอาร์เรย์ทั้งหมด (เวกเตอร์, เมทริกซ์, หรืออาร์เรย์ที่มีอันดับสูงกว่า) โดยไม่มีการวนซ้ำหรือการวนซ้ำอย่างชัดเจน ทำให้เข้าใจ SQL และพีชคณิตเชิงสัมพันธ์ได้ง่ายกว่ามาก เป็นตัวอย่างง่ายๆในการเลือกรายการจากเวกเตอร์ V ที่มีค่ามากกว่า 100 ใน APL เราเขียน:

(V>100)/V

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

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

อาจมีภาษาทำงานอื่น ๆ ที่ช่วยในการคิดเช่นนี้ด้วย แต่ภาษาอาเรย์นั้นใกล้เคียงกับ SQL มาก


+1 สำหรับ "[คุณไม่สามารถ] จับได้ดี ... โดยไม่ต้องทำอะไรมากมาย" ไม่มีใครเรียนรู้การเขียนโปรแกรมที่จำเป็น (ด้วยการสร้างที่ต่อต้านได้ง่ายเช่นa = a + 1) ข้ามคืน ต้องใช้เวลาในการเรียนรู้รูปแบบการประกาศเช่นตรรกะการทำงานและอื่น ๆ เช่นเดียวกับที่ต้องใช้เวลาในการเรียนรู้การเขียนโปรแกรมที่จำเป็น
เพียงแค่ความคิดเห็นที่ถูกต้องของฉัน

1

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


1

คุณเรียนรู้ที่จะคิดอย่างชัดเจนเหมือนกับที่คุณเรียนรู้ที่จะคิดอย่างไร้เหตุผล: โดยการฝึกฝนโดยเริ่มจากปัญหาที่ง่ายขึ้นและทำงานต่อไปเมื่อคุณ "รับ"

ประสบการณ์ครั้งแรกของคุณในการเขียนโปรแกรมที่จำเป็นรวมถึงคำสั่งที่ใช้งานง่าย (และในความเป็นจริงไร้สาระอย่างเต็มที่) เช่น "a = a + 1 " คุณใช้ความคิดไปจนถึงจุดที่ตอนนี้คุณอาจไม่จำการเรียกคืนจากความไม่จริงที่ชัดเจนของข้อความ ปัญหาของคุณเกี่ยวกับสไตล์การประกาศก็คือคุณจะกลับมาที่เดิมเมื่อคุณเริ่มต้นด้วยสไตล์ที่จำเป็น: "clueless newb" ยิ่งแย่ไปกว่านั้นคุณได้ฝึกฝนมานานหลายปีด้วยสไตล์เดียวที่ขัดแย้งกับสไตล์ใหม่นี้และมีนิสัยที่ต้องเลิกทำหลายปีเช่นนิสัยที่จะ "ควบคุมค่าใช้จ่ายทั้งหมด"

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

การเลือก SQL เป็นการโจมตีครั้งแรกของคุณในการเขียนโปรแกรมเชิงประกาศอาจเป็นข้อผิดพลาดหากคุณต้องการเรียนรู้แนวความคิดจริงๆ แน่นอนว่าแคลคูลัส tuple ที่อยู่บนพื้นฐานนั้นได้รับการประกาศตามที่ได้รับจริง ๆ แต่น่าเสียดายที่ความบริสุทธิ์ของแคลคูลัส tuple ได้รับการประนีประนอมอย่างไม่ดีโดยความเป็นจริงของการนำไปใช้งานและภาษามีผล คุณอาจต้องการที่จะดูประโยชน์อื่น ๆ โดยตรง (ในแง่ที่คุณคุ้นเคยกับ) ภาษาที่ประกาศเช่นLisps (esp. Scheme ), HaskellและMLsสำหรับการเขียนโปรแกรมที่ใช้งานได้ (หรือส่วนใหญ่) หรือPrologและMercuryสำหรับ (ส่วนใหญ่) การเขียนโปรแกรมเชิงตรรกะ

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

  1. มันมีประโยชน์สำหรับการเขียนโปรแกรม "cradle to grave" เนื่องจากคุณสามารถเขียนโปรแกรมเต็มรูปแบบในภาษาเหล่านี้ได้ตั้งแต่ต้นจนจบ มันมีประโยชน์ในการยืนอยู่คนเดียวซึ่งแตกต่างจาก SQL ซึ่งค่อนข้างไร้ประโยชน์จริง ๆ สำหรับคนส่วนใหญ่เป็นภาษาแบบสแตนด์อโลน

  2. พวกเขาแต่ละคนให้คุณเอียงที่แตกต่างกันในการเขียนโปรแกรมการประกาศที่สามารถให้คุณถนนที่แตกต่างกันในที่สุด "รับมัน"

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

  4. บทเรียนที่คุณเรียนรู้จากพวกเขาจะช่วยคุณด้วย SQL ของคุณเช่นกัน - โดยเฉพาะอย่างยิ่งถ้าคุณแปรงแคลคูลัส tuple หลังฐานข้อมูลเชิงสัมพันธ์สำหรับรูปแบบการคิดที่บริสุทธิ์เกี่ยวกับข้อมูล

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


1

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

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

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


1

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

นั่นคือวิธีที่ดีที่สุดในการเรียนรู้ภาษาต่างประเทศคืออะไร? แน่นอนคุณต้องเรียนรู้ไวยากรณ์และคำศัพท์ซึ่งคุณจะได้รับจากเอกสาร SQL ของคุณ สิ่งที่สำคัญที่สุดคือการฝึกฝน คุณควรอ่านและเขียน SQL ให้มากที่สุดเท่าที่จะทำได้และอย่ารู้สึกว่าต้องรู้ไวยากรณ์ก่อน คุณสามารถและควรค้นหาสิ่งต่าง ๆ ตามที่คุณไป คุณจะรู้ว่าคุณได้รับมันเมื่อคุณพบว่าง่ายต่อการอธิบายข้อมูลที่คุณต้องการใน SQL มากกว่าภาษาอังกฤษ


1

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

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

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

วิธีอื่น ๆ ในการเพิ่มการรับรู้ของคุณเกี่ยวกับพื้นที่การประกาศและการทำงานคือการเรียนรู้ทฤษฎีเซตและภาษาการเขียนโปรแกรมที่เหมาะสมกับกระบวนทัศน์เฉพาะ ฉันกำลังอยู่ในกระบวนการเรียนรู้บางอย่างของ Haskell เพื่อรักษาและพัฒนาความสามารถทางคณิตศาสตร์ของฉัน


0

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

ฉันพยายามจะบอกว่ามันเกิดขึ้นได้อย่างไร

คุณอาจคุ้นเคยกับโปรแกรมแบบเรียกซ้ำแล้วซ้ำอีกในโปรแกรมแบบเรียกซ้ำคุณกำหนดปัญหาแทนที่จะบอกว่ามันแก้ได้อย่างไร คุณกำหนดฐานและกำหนดnขึ้นอยู่กับn-1 (ตัวอย่างfactorial(n) = n * factorial(n-1)) แต่คุณอาจทราบแล้วว่าคอมพิวเตอร์แก้ปัญหาได้ มันเริ่มจากฟังก์ชั่นและเรียกใช้ฟังก์ชั่นซ้ำจนกว่าจะถึงคำจำกัดความฐานแล้วประเมินฟังก์ชั่นอื่น ๆ ทั้งหมดขึ้นอยู่กับค่าฐาน

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

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

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