Tags:

อยู่ๆก็นึกไอเดียขึ้นมาได้เลยอยากจะมาถามว่า
ไอเดียนี้มีจริงแล้วหรือไม่ ชื่ออะไร ถูกใช้ที่ไหน น่ะครับ

ก็คือ การเขียน DBMS ด้วยภาษาที่ใช้ Virtual Machine (.NET หรือ JVM) ซึ่งมี JIT
และ สามารถใช้ ภาษา C# หรือ Java เขียน Query ตรงๆ แล้วส่ง Instruction ไป Compile ที่ฐานข้อมูลได้

อย่างสมมุติ มีโปรแกรมฐานข้อมูลตัวนึง เก็บข้อมูล เพลง มี ชื่อเพลง ชื่อนักร้อง อยู่บน Azure
ก็เขียนโค้ดแบบ CallBack function ตัวนึง ที่รับ input เพลง แล้ว return Comparable (null คือ filter ออก)

แล้วพอคอมไพล์ โค้ดของฟังค์ชั่นนี้จะกลายเปน ByteCode หรือ CLR เก็บไว้ในโปรแกรม
พอฟังค์ชั่นนี้ถูกเรียก ก็จะส่ง ByteCode หรือ CLR ตัวนั้น ยิงไปหา DataBase Server ให้ Compile ออกมาเปน Native แล้ว DataBase ก็เอามาใช้แทน Query Language ปกติ

ซึ่งตัวฟังค์ชั่นนี้ก็อาจจะมีการบังคับ ต้องใช้เฉพาะ library ที่จำกัด ไม่งั้นจะ Compile ไม่ผ่าน

ไอเดียมันประมาณนี้อะครับ คล้ายๆ Store Procedure แต่ไม่ใช่เขียนด้วย SQL
กลับกันเปนว่า เขียนภาษาปกติให้กลายเปนฟังค์ชั่นสำหรับ Filter แล้วส่งไปให้ DataBase ใช้ และตัวฟังค์ชั่นนี้ก็ใช้ JIT Compile เปน Native อีกด้วย

ไอเดียนี้มีจริงแล้วหรือไม่ ชื่ออะไร ถูกใช้ที่ไหน
พอจะมีใครทราบใหมครับ

Get latest news from Blognone
By: mibtrex on 2 May 2011 - 12:40 #284359
mibtrex's picture

มันคือ LinQ รึป่าว ???

By: nonth
ContributoriPhoneIn Love
on 2 May 2011 - 13:15 #284374 Reply to:284359
nonth's picture

อ่านครั้งแรกผมก็คิดถึง Linq เหมือนกันครับ

By: Thaina
Windows
on 2 May 2011 - 13:26 #284379 Reply to:284359

เอาจริงๆก็ ไม่ใช่ ครับ

By: qute on 4 May 2011 - 14:49 #285052 Reply to:284379

ความสามารถของ Linq + .NET ทำได้ตามที่คุณเขียนมานะครับ ถ้ามี requirement มากกว่านั้นก็ลองบอกมาดูครับ

By: Thaina
Windows
on 4 May 2011 - 17:32 #285142 Reply to:285052

อย่างแรกคือ มันไม่ใช่ว่าเขียน LINQ แล้วจะได้แบบนั้นเสมอไปน่ะครับ ขึ้นอยู่ที่ปลายทางว่าตัว DB มันทำอะไร

เท่าที่ผมทราบ ตอนนี้ DB มันยังไม่รองรับ ที่มันทำ คือ ทำ CLR Store Procedure แต่สุดท้ายมันก็เอา LINQ มาสร้าง SQL String อยู่ดี

อีกอย่างคือ ผมอยากจะให้มัน ไม่ต้องเขียน LINQ แต่ใช้ logic if else < == > ได้เลย น่ะครับ

ประมาณว่าเขียนคลาส

[SQLProcedure("SomeDBStructTable")]
class A : IQueryObject
{

  • public override int? Filter(SomeDBStruct value)
    {

value.Date < Date.Today && value.Date > Date.LastWeek ? return value.Date.ToInt() : null;

}

}

อะไรแบบนี้น่ะครับ

By: susie888 on 2 May 2011 - 12:42 #284360

ไม่มีจริง และทำไม่ได้

mssql สามารถเขียน .net ฝัง clr ลงไป และ run เป็น function ได้ก็จริง แต่ lib ที่ใช้ได มีจำกัด(มาก) ไม่เหมือน c# ปกติ และการ run ต้องเป็น function ที่build ไปก่อนแล้ว

แต่ ให้ sql สร้าง function ใหม่ได้และ run ได้ คุ้นๆว่า string มันจะอยู่ในรูป base64 ของ clr

แต่คอนเซปนี้ ผิด เพราะการให้ sql ทำงานโดยอิสระจาก code ภายนอก ถือเป็นช่องโหว่

By: Thaina
Windows
on 2 May 2011 - 13:29 #284378 Reply to:284360

ก็คือผมอยากจะให้ มันทำแบบนี้ได้

mssql สามารถเขียน .net ฝัง clr ลงไป และ run เป็น function ได้ก็จริง แต่ lib ที่ใช้ได มีจำกัด(มาก) ไม่เหมือน c# ปกติ และการ run ต้องเป็น function ที่build ไปก่อนแล้ว

ในตอน Compile หรือตอน Deploy น่ะครับ

Lib จำกัดมาก ก็โอเคแล้วครับ ไม่ใช่ปัญหา

แต่คอนเซปต์นี้ผมว่าไม่ผิดครับ
เพราะมีบ่อยไปที่เราจะให้ ผู้ใช้ ส่ง Query string อย่าง SELECT * FROM A WHERE B มาที่ DataBase โดยตรง
ลองนึกว่า คำว่า ผู้ใช้ อาจไม่ได้หมายถึงคนที่ใช้ Client แต่หมายถึง Web Service ที่อยู่คนละ Host หลายๆ เว็บ ต้องการ Access ข้อมูลของ DataBase Server ตัวเดียว

แทนที่จะส่ง "SELECT * FROM A WHERE B" ซึ่งต้อง Parse String ถ้ามีความซับซ้อนสูงก็จะ เปนภาระแก่ Server และ Network

ก็น่าจะส่ง CLR หรือ ByteCode ที่คอมไพล์แล้วชั้นหนึ่ง ไปให้ Server Compile ด้วย JVM หรือ .NET ตอน Runtime
ถ้ามีการใช้ Library ที่นอกเหนือไปจากที่จำกัดไว้ ก็ให้ Error ไป

ซึ่งโค้ดแบบ CLR มันก็ควรจะขนาดเล็กกว่า string แถมยัง Compile ได้โดยไม่ต้อง parse ด้วย
แล้วพอโยนไปคอมไพล์บน Server ครั้งหนึ่ง ก็จะกลายเปนตัวอะไรที่คล้ายๆ Store Procedure ให้เรียกใช้ได้

ซึ่งอันนี้มันก็เหมือนกับการเรียกฟังค์ชั่น แล้วใส่ Predicate ให้มัน return list เฉพาะที่ตรงกับ Predicate
และโดยคอนเซปต์ไม่แตกต่างกับ Query String

ผมแค่เชื่อมั่นในประสิทธิภาพของ CLR และ Native Compile มากกว่า เท่านั้นเอง

โปรแกรมเมอร์ก็ไม่ต้องนั่งเรียนภาษา SQL ด้วย เคยเขียน Predicate ยังไง ก็เขียนไปตามนั้น

By: susie888 on 3 May 2011 - 11:41 #284652 Reply to:284378

"โปรแกรมเมอร์ก็ไม่ต้องนั่งเรียนภาษา SQL" ไปหัดเรียนดีกว่าคับ

CLR ไม่ใช้ query language
และถ้ากลัว string ยาว ทำไมไม่เข้ารหัสแบบ base64 หรือ GZip

ถ้าจะ query ซับซ้อนแค่ไหน ก็ต้องใช้ sql ถ้ากลัวว่าจะเป็น load เนื่องจาก query ซับซ้อน วิธีแก้คือ tune query ไม่ใช่เปลี่ยนไปใช้ clr เพราะ clr ช้ากว่ามากมาย และการทำ clr ก็ยังหนีไม่พ้นการเขียน query ฝังลงไปอยู่ดี

ในกรณีที่มีการเรียกใช้ข้อมูลจากหลายแหล่ง วิธีที่ดีคือการรทำ store procedure หรือถ้ายากไป ก็ทำ view แทน

By: Thaina
Windows
on 3 May 2011 - 13:19 #284667 Reply to:284652

อันนี้ผมคิดกลับด้านนะครับ

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

แทนที่จะเขียน Query String ก็เขียนเปน CLR ส่งไป Server มันก็จะ Compile ออกมาเปนฟังค์ชั่นเหมือนๆกัน

เนื้อแท้มันก็ไม่ต่างกับ Query String ตรงไหน เพียงแต่ SQL มันคือภาษาพิเศษที่มีใช้เฉพาะใน DB
ส่วน CLR กับ JVM มันมีใช้กันทั่วไปในโลกโปรแกรมเมอร์

เอาเข้าจริง ทำระบบนี้แล้ว จะ Compile Query String เปน

SQL ผมก็เขียนเปนครับ ถึงจะไม่ใช่ผู้เชี่ยวชาญก็ตามที

ว่ากันจริงๆไอ้ LINQ ตอนนี้นี่ มัน parse กลับไปเปน SQL String อยู่ดีนะครับ

คุณคิดว่าทำไมมันถึงมี LINQ ? ทำไมถึงมี NoSQL ? แถมมีพวก JDO อะไรพวกนี้อีก
ปกติเวลาเขียนโปรแกรมเขาก็มักจะมี Lib เพื่อสร้าง Parse String อยู่แล้ว

พอเอาเข้าจริง SQL String มันก็ซับซ้อน ไม่ยืดหยุ่น มีฟังค์ชั่นจำกัด

การที่เขียนโค้ด SQL ให้น้อยที่สุด มันคือเรื่องปกติของโปรแกรมสมัยนี้อยู่แล้ว
การไม่ต้องเขียน SQL String อีกเลยน่าจะเปนเป้าหมายในยุคอนาคต

ถ้าคิดแต่ว่า อะไรบางอย่างมันดีแล้ว จะเกิดนวัตกรรมเหรอครับ?

By: susie888 on 4 May 2011 - 23:24 #285266 Reply to:284667

ผมว่ามันเป็นแบบนี้คับ (อาจจะขัดกับคุณ แต่ขอให้คิดว่า เป็นความเห็นนึงละกัน)

C#, Java เป็นถาษาที่อยู่บนฐาน OOP ซึ่ง เน้นการทำงานตามเชิงวัตถุเป็นหลัก class แต่ละ class ก้จะเป็นเชิงวัตถุ

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

NoSQL อันนี้หนักกว่า sql คือ เป็นการทำงานกับข้อมูลปริมาณมหาศาล

การจะเหมาว่า C# ไป query ข้อมูล เป็นนวัตกรรม จิงๆมันก็ทำได้ แนวคิดนี้ผมเคยลองทำ ปรากดว่า ท้ายที่สุดยังไง มันก็สู้ sql ไม่ได้ เปรียบเหมือนการบอกว่า C# ดี เอาไปใช้แทน JavaScript หรือกลับกันคือ JS ดีกว่า C# ต้องบอกว่า มันดีทั้งคู่ ในเชิงการทำงานของตัวมันเอง และ C# ก็สู้ JS ไม่ได้ ถ้าเอาไปใส่กับ html และกลับกัน JS ก็เอามาเขียนแทน C# ไม่ได้

เคยทำมาแล้วคับ กับการสร้าง CLR ฝังลงไป สุดท้าย พบว่า func ต่างๆนั้น สู้เขียน SQL function ลงไปไม่ได้เลย และที่สำคัญ มันไม่มาตรฐาน เพราะจะเป็นการบังคับตัวเองให้ใช้แต่ MSSQL

แต่ถ้าหากอยากจะลองหลักที่คุณว่า ผมมีทางออกเสนอ 2 ทาง
- RavenDB เป็น DB ที่เขียนขึ้นจาก C# น่าจะเป็นอีกทางเลือก หากต้องการ C# ในการ query
- Postgre เป็น DB ที่ดีที่สุดเท่าที่ผมใช้มา ที่สำคัญฟรี ผมชอบมากกว่า mssql อาจจะใช้ยาก แต่ถ้าใช้เป็น จะติดใจ ที่สำคัญคือ มี native language ถึง 3 ภาษา sql, pl และ C (ภาษาซีเก่าๆเลย) performance ดี ลูกเล่นมหาศาล

By: Thaina
Windows
on 5 May 2011 - 00:19 #285293 Reply to:285266

คุณเข้าใจผิดมากครับ

แค่คุณพูดว่า "สร้าง CLR ฝังลงไป" "ใช้ได้แต่ MSSQL" "ไม่มาตรฐาน"

แปลว่าคุณไม่เข้าใจแนวคิดนี้แต่แรกแล้ว เพราะไอ้การฝัง CLR ที่ใช้กันตอนนี้ มันไม่ใช่แนวึิดที่ผมพูดถึง

ลองตัดความคิดที่ตัวเองมั่นใจออกไปก่อนแล้วค่อยๆคิดดีๆอีกทีนะครับ

ตอนนี้ การทำงานของ DB ทั่วไปในโลกนี้ ใช้วิธีการ ให้ส่ง SQL String เข้าไปหา DBMS แล้ว DBMS ก็ต้อง Parse แล้ว Compile String ตัวนั้น ให้เปนฟังค์ชั่น ที่จะเอาไปใช้ Query

ก็ถามง่ายๆว่า Java กับ Python อะไรเร็วกว่ากัน
ตอบได้เลยว่า ไม่ว่ายังไง ก็ต้อง Java เพราะ Python มันต้อง Parse
ส่วน Java มันเปน ByteCode ที่แทบไม่ต้อง Parse อะไรเลย

นี่คือหลักการว่า มันควรจะมี CLR ของ DBMS เพื่อติดต่อกับภาษาโปรแกรมทั่วไป แทนที่จะส่งไปเปน "SELECT * FROM WHERE" ซึ่งทั้งเขียนยาก ไม่ตรงกับภาษาที่โปรแกรมเมอร์ใช้กันปกติ แถมยังต้อง Parse string ไปมา Performance ทั้งนั้น
(CLR ตัวนี้ผมขอแปลมาจาก Common Language Runtime ไม่ได้จำกัดว่าเปน .NET FrameWork นะครับ)

แล้วสุดท้าย ส่วนใหญ่เขาก็ใช้ Query Generator Lib กันหมด ซึ่งเสียประสิทธิภาพหน่อยแต่มัน Maintain ง่ายกว่า

การมี CLR นั่นก็แปลว่า การเขียนโปรแกรม ก็ควรจะใช้ตัวนี้มากกว่า SQL แล้วมีเครื่องมือในการ Compile ให้ส่งไปฝังเปน Stored Procedure แบบ Runtime

ด้วยเทคโนโลยีตอนนี้ .NET กับ JVM มันมีความสามารถ JIT ที่สมบูรณ์กว่าเทคโนโลยีตัวอื่น ผมถึงได้เน้นไปที่ DB ที่เขียนด้วย C# กับ Java แล้วส่ง CLR หรือ bytecode ไป JIT เอา

By: susie888 on 5 May 2011 - 14:31 #285517 Reply to:285293

"ตอนนี้ การทำงานของ DB ทั่วไปในโลกนี้ ใช้วิธีการ ให้ส่ง SQL String เข้าไปหา DBMS แล้ว DBMS ก็ต้อง Parse แล้ว Compile String ตัวนั้น ให้เปนฟังค์ชั่น ที่จะเอาไปใช้ Query"
ไม่ใช่อ่ะคับ ตั้งแต่ทำงานมา ไม่เคยอนุญาติให้ตัวเอง และลูกน้อง ส่ง sql string เข้าไปเลย ทุกอย่าง จะต้องถูกสร้างเป็น store proc หรือ function ก่อน และข้างใน จะไม่มีการทำ dynamic sql โดยเด็ดขาด
อีกอย่างคือ การ compile sql string นั้น ไม่ได้เสีย performance ซักเท่าไหร่เลย เทียบกับการดึงข้อมูลออกมาดู

"selct * from where" ไม่ได้ยาก หรือจะมี join ก็ยังไม่ยากอยู่ดี

var result = from row in myTable select row; อันนี้ กลับยากกว่า
ซึ่งท้ายสุดแล้ว ถ้าใช้ linq มันก็จะถูกแปลงเป้น sql อยู่ดี

ไม่ว่าจะเป็น CLR หรือ byte code เหล่านี้ มันยังต้องการ compile อีกรอบนึง ไม่ต่างจากการเขียน sql

แนวคิดที่ว่า clr ของ dbms ไม่ได้ต่างอะไรจาก sql เพราะสุดท้าย มันก็ต้อง compile ซ้ำอีกรอบ และก็ไม่ต่างจากการเขียน store proc เลย เพราะ proc ก็เป้นเหมือน pre compile

ยกเว้นการเขียน c ลงบน postgre เป็น function(store proc) อันนี้เร็วสุด

และสาเหตุที่บอกว่า ไม่มาตรฐานนั้น เพราะการยัดเอาภาษา.net ลง db มันก็จะใช้ได้แค่ mssql และ java ก็ได้แค่ oracle เมื่อเปลี่ยน db แล้ว สิ่งเหล่านี้จะไม่สามารถใช้ได้เลย

By: Thaina
Windows
on 5 May 2011 - 15:04 #285524 Reply to:285517

ก็ถึงได้ยก Java เทียบกับ Python นี่แหละครับ
ว่า ระหว่าง bytecode กับ python สดๆ ส่งไป JIT ใน JVM อะไรเร็วกว่า

ก็เทียบกับว่า Compile CLR/ByteCode กับ Parse SQL String อะไรเร็วกว่า?

การเขียน C ลงบน postgre เป็น function(store proc)

ผมก็อยากให้มันทำได้แบบนี้ทุกตัวนี่แหละครับ
แต่ C มันก็เก่าแล้ว ถ้าเขียน C# หรือ Java แทนได้ก็คงดี
ในทางกลับกันคือ เราเอา C# หรือ Java มา Convert เปน C ได้

ที่ผมคิดจริงๆคือ ส่งไปเปน CLI แล้วพอมัน Compile ใน DB มันก็กลายเปน Native เท่า C

และถ้ามองอีกมุม DB ตอนนี้ ต่างก็ Optimize ด้วยการ Parse SQL String แล้ว Compile ให้กลายเปน

ก็แทนที่จะแข่งกัน Parse SQL String ก็ สร้างมาตรฐานอีกตัวที่ไม่ใช่ String แต่เปน CLI
เหมือนที่ .NET กับ Mono มันคนละตัวกัน แต่มัน JIT Compile CLI ได้เหมือนๆกัน
ผลออกมาเปน Native คนละตัวกัน ประสิทธิภาพต่างกัน แต่ทำงานได้แบบเดียวกัน

แล้วฝั่งโปรแกรมเมอร์ จะเขียน C# หรือ J# หรือ VB มันก็ได้ CLI เหมือนๆกัน
อันนี้คือแนวคิดผมว่า ถ้า DB มันมี CLI มาตรฐานซักตัว จะเขียน SQL แล้ว Compile เปน CLI ตัวนี้ก็ยังได้ แต่ก็สามารถเขียนภาษาอื่นๆได้เช่นกัน

ส่วนเรื่อง .NET กับ JVM นี่ แยกให้ออกหน่อยครับ ว่าผมแค่เสนอเทคโนโลยีว่าสองตัวนี้มันใช้ดี
Raven ก็เขียนบน .NET นะครับ ไม่ใช่แค่ MSSQL
ผมว่าคุณต้องเข้าใจอะไรผิดซักอย่างแน่ๆ

By: roteee
AndroidBlackberry
on 5 May 2011 - 03:17 #285329 Reply to:284652

"โปรแกรมเมอร์ก็ไม่ต้องนั่งเรียนภาษา SQL"

ผมค่อนข้างเห็นด้วยกับคุณ ซูซี่ (susie888) แต่หากจะขัดกับท่านจขกท. ก็ขออภัยอย่างสูง :)

ท่านที่ได้ชื่อว่า โปรแกรมเมอร์ หากท่านจะไปยุ่งกับ database ท่านควรไปเรียนภาษา sql เพื่อสร้าง table ...​ หรือท่านควรจะเขียน java, python c# หรือ php เพื่อสั่งให้มันสร้าง table ให้ ??

By: Thaina
Windows
on 5 May 2011 - 03:48 #285332 Reply to:285329

แล้วคุณคิดว่า เขาสร้าง JDO ADO หรือ lib จำพวก QueryGenerator , LINQ to SQL กันขึ้นมาทำไมครับ?

นี่ไม่นับนะว่า ไอ้พวก QueryGenerator ส่วนใหญ่เขาจะแถมมาให้ใน API ของ DataBase

ให้พูดตรงๆก็ได้นะครับ

จากที่ผมพูดถึงไปข้างต้น มันค่อนข้างจะพิสูจน์ชัด ว่า โปรแกรมเมอร์ขั้นที่โปรแล้ว (คนที่ใส่ JDO เข้าไปใน Java หรือที่ใส่ ADO เข้าไปใน .NET หรือ เจ้าของ MySQL ที่เขียน official mysql.dll)
ก็ยังคิดว่า โปรแกรมเมอร์ควรจะเขียนภาษาที่ตัวเองถนัดให้มากที่สุด เขียน Library ตัวกลางขึ้นมา เพื่อ Generate SQL String ที่เช็ค Compile ไม่ได้ ให้น้อยที่สุด ให้เรายุ่งกับ SQL String ให้น้อยที่สุด แล้วก็พยายามให้มัน Auto ที่สุด

เพราะการที่ต้องให้โปรแกรมเมอร์ไปนั่งเขียน Cross หลายๆภาษา เขียน Script ในโปรแกรม เช็คคอมไพล์ไม่ได้ มันก็ Error ง่ายขึ้น แถม Debug ยากอีกต่างหาก

คุณคิดว่าทำไม เขาถึงนิยมใช้โปรแกรมจัดการฐานข้อมูลแบบมี GUI อย่าง XAMPP หรือ...อะไรซักโปรแกรมที่เก่าๆหน่อย

เพราะใครๆเขาก็ขี้เกียจใช้ SQL ถ้าไม่จำเปนเขาไม่ไปนั่งเขียน Query String หรอก

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

ถ้าคิดว่า การได้ชื่อว่าเปนโปรแกรมเมอร์ คือคุณต้องไปนั่งเขียน SQL String ทีละบรรทัด แทนที่จะใช้ XAMPP

ผมขอเปนอะไรที่ฉลาดกว่านั้นดีกว่า

By: roteee
AndroidBlackberry
on 5 May 2011 - 10:49 #285383 Reply to:285332

ต้องขออภัยที่ทำให้ท่านจขกท. ไม่พอใจ :)

พอดีโลกกระผมแคบ ไม่โปรเหมือนท่าน ชีวิตผมมันต้องคลุกคลีหลายภาษา หลายอย่าง งามผมมันไม่สามารถจบได้ด้วยเพียงอย่างเดียว เช่น เขียน mobile web อันนึง ผมต้องใช้ php, sql (mysql), xhtml, css-mp, xml, json สิ่งเหล่านี้ผมต้องศึกษาทั้งสิ้น ซึ่งมันก็คือมีหลากหลายภาษามากที่ผมต้องรู้

นอกจากนี้ยังต้องศึกษาภาษาอังกฤษ เอาไว้อ่านเว็บ ภาษาไทยไว้คุยกับนายจ้าง ภาษาอีสาน เอาไว้คุยกับเพื่อนเวลาไปกินส้มตำปู-ปลาร้า :)

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

ส่วนที่ท่านกล่าวถึง sql generator หรือ tools ต่างๆนั้น ผมเห็นด้วยจากใจจริง ว่ามันช่วยให้เราไม่ต้องไปนั่งเขียน sql string ตลอดเวลา (เขียนบ่อยๆ ก็เสียเวลา) แต่ผมไม่ค่อยชอบ code html ที่ dreamweaver มัน generate ให้เลย

"ถ้าคิดว่า การได้ชื่อว่าเปนโปรแกรมเมอร์ คือคุณต้องไปนั่งเขียน SQL String ทีละบรรทัด แทนที่จะใช้ XAMPP"

แน่นอนครับ หากเป็น process หรือ business logic ที่สำคัญ ผมต้องเขียนมันเองทุกตัวอักษร และจะไม่ยอมให้ sql generator ใดๆ มาเขียนให้ผมโดยเด็ดขาด :)

By: Thaina
Windows
on 5 May 2011 - 12:42 #285458 Reply to:285383

แล้วทำไมคุณไม่คิดบ้างว่า ไอ้การที่คุณ "ต้องไปนั่งคลุกคลีหลายภาษา"
มันคือปัญหา มันเสียเวลาชีวิต แทนที่จะศึกษาภาษาเดียวที่จำเปน ใช้ภาษาเดียวทำได้ทุกงาน

คุณคิดว่าคุณเก่ง ที่คุณใช้ได้ทั้งภาษาไทยอังกฤษ
ใช่ครับ คุณเก่ง แต่คุณไม่คิดบ้างว่านั่นคือปัญหา โลกนี้ถึงได้มีคนพยายามทำโปรแกรม Translator ให้สมบูรณ์ อย่าง Google Translate และอื่นๆ ทำไมโดเรม่อนถึงได้มีวุ้นแปลภาษา

ถ้าคุณคิดว่าต้องเรียนทีละภาษา เพื่อสื่อสารกับมนุษย์ทีละคนในโลก คุณต้องศึกษากี่ภาษา ชีวิตคุณยาวพอมั้ย?

คุณไม่คิดบ้างล่ะครับว่าของที่ออกแบบไว้แล้ว มันอาจมีวิธีที่ดีกว่า
แค่เมื่อสมัยก่อนยังไม่มีแนวคิดหรือเทคโนโลยีมารองรับ

ผมถึงได้พูดว่า ถ้าคิดแต่ว่าโน่นนี่ เปนแบบนี้ดีแล้ว โลกนี้มันจะมีนวัตกรรมมั้ย

ส่วน

ที่คุณไม่พอใจ HTML ที่ Gen จาก DreamWeaver ก็เพราะ DreamWeaver มันไม่เก๋าเอง
ทางแก้ไม่ใช่อคติ อาหารแช่แข็งไม่อร่อย แต่คือสร้าง Tools ตัวอื่นที่เก่งกว่านี้

ถ้าเขียน Java เปน (ยังไงคุณก็รู้หลายภาษานี่?) ลองใช้พวก GWT หรืออะไรแนวๆนี้มั้ยล่ะครับ

สุดท้าย

ผมยอมรับว่าตอนนี้มันยังไม่มี Tools ที่เก๋าพอที่จะ Generate Query String ให้ซับซ้อนเท่า Business Logic ร้อยแปดในโลกนี้ได้
แต่ยังไม่มี แปลว่า ซักวันมันก็ต้องมี และมันก็ควรมีให้เร็วที่สุด

และสำหรับผม ผมเห็นปัญหาว่า มันไม่ควรจะมีแม้แต่ SQL String แต่แรกแล้วด้วยซ้ำ
ผมถึงได้คิดไอเดียทางแก้ ด้วย CLR bytecode ใช้ JIT Compiler ทำงานแทน SQL String

การเขียน SQL String ใช่ว่าจะดี มันก็มีข้อจำกัด
ทำไมไม่แก้แต่ฐานราก

ก็ถึงถาม โปรแกรมเมอร์ระดับโลก เขาสร้าง JDO ADO มาใช้กันทำไม ถ้าไม่ใช่เพื่อให้เขียน SQL ให้น้อยลง น้อยที่สุดเท่าที่จะทำได้

ผมสงสัยเหลือเกินว่าถ้าในอนาคต ความคิดของผมถูก คุณต้องไปอยู่ใน DB ที่ไม่มี SQL ให้ใช้ คุณจะทำอย่างไร
ในเมื่อคุณยึดติดว่า "SQL สร้างมาเปนภาษาที่เหมาะที่สุดกับการจัดการ DB"

By: Thaina
Windows
on 5 May 2011 - 12:54 #285468 Reply to:285383

ผมขอถามง่ายๆอีกอย่างว่า

การที่โปรแกรมเมอร์ใช้ C# หรือ Java โปรแกรมเมอร์ต้องอ่าน CLR อ่าน ByteCode ออก หรือเปล่า?

ถ้าหากเรามีตัว Gen Query ที่สมบูรณ์แล้ว เราจะต้องไปสนรึเปล่าว่ามันจะ Gen อะไรออกมา

ก็ไม่ต่างกัน

By: tuckclub on 2 May 2011 - 14:22 #284393 Reply to:284360

ลองดู Creating a Stored Procedure in Managed Code

ผมเคยพยายามจะลองใช้ แต่รู้สึกว่าจะติดปัญหาเรื่อง register library ใน SQL Server ไม่ได้ เลยล้มเลิกไปครับ

ข้อดีที่ทำให้ผมสนใจมันคือ สามารถเอา business logic ที่เขียนด้วย C# ไปรันในฐานข้อมูลได้เลย ช่วยเพิ่ม performance และลด round-trip ครับ

รู้สึกว่า SQL Azure จะไม่รองรับฟีเจอร์นี้ครับ ต้องใช้กับ SQL Server เท่านั้น

By: tuckclub on 2 May 2011 - 14:51 #284399

มี Raven DB เป็น open source ที่เขียนด้วย C#
สร้างโดย Ayende Rahien

ตัวนี้ออกแนว NoSql ที่เราต้องคิดล่วงหน้าว่าเราจะ query ข้อมูลในแบบไหนบ้าง แล้วก็ต้องบอก db ตั้งแต่ต้นให้ทำ index เพื่อรองรับ query เหล่านั้น

สิ่งที่น่าสนใจคือ การ index และ query นั้น จะเขียนในรูปแบบของ Map-Reduce ด้วย LINQ/C# ใน client app ของเรา จากนั้น Raven client API จะแปลง LINQ syntax นั้นให้เป็น LINQ string แล้วก็ส่งผ่าน network ไปให้ db

เมื่อ Raven DB ได้รับ LINQ string นั้น ก็จัดการ parse แล้วก็รันมันในฐานข้อมูล

ลองดู tutorial

ผมไม่เคยลองใช้จริงครับ แต่เห็นวิธีการแล้วดูน่าสนใจดี

By: tuckclub on 2 May 2011 - 15:04 #284405

คุ้นๆ ว่าจะสามารถส่ง Java bytecode ไปรันใน Oracle Database ได้ครับ

Introduction to Java in Oracle Database

แค่เคยเห็นผ่านๆ ตา แต่ไม่เคยลองอีกเช่นกัน

ปล. เกือบจะลืมไปแล้วว่าโลกนี้มีเทคโนโลยีที่ชื่อว่า SQLJ

By: Thaina
Windows
on 2 May 2011 - 21:02 #284480 Reply to:284405

ขอบคุณมากๆเลยครับสำหรับข้อมูลทั้งหมด

รวมๆแล้วรู้สึกว่าจะเหมือนกันน่ะครับ คือ Java Stored Procedure กับ CLR Stored Procedure
คือมันใช้สำหรับเขียน SQL ตามปกติ แต่มันจะไปเก็บไว้ใน Server แทน

ซึ่งก็คล้ายๆ แต่ต่างกันตรงที่ ที่ผมคิดคือ เน้นไปที่การเขียน Predecate ด้วยภาษาที่ไม่ใช่ภาษา SQL
คือประมาณว่าใช้ C# แทน SELECT FROM WHERE ไปเลยน่ะครับ

ยังไม่ได้ดู Raven แต่จากที่ฟังดูน่าสนใจครับ และเหมือนจะใกล้เคียงกับที่คิดด้วย

By: tuckclub on 3 May 2011 - 11:25 #284649 Reply to:284480

ถ้าไม่อยากใช้ภาษา SQL คงต้องลอง Object-DBMS แล้วละครับ
ใน .NET มี db4o
ลองดู tutorial

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

ถ้าลองใช้แล้วได้ผลยังไง ช่วยกลับมาบอกกันมั่งนะครับ