[php] Join Table มันดีตรงไหนหรือครับ

เริ่มโดย GillBate, 16 เมษายน 2010, 15:59:30

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

GillBate

 :P จอยกันไปทำไม ดึงจากตารางนั้นโดยตรง หรือจอยมันแตกต่างกันอย่างไรหรือครับ

icez

มันเป็นการลด query ต่อเนื่องกันครับ

ลองนึกภาพ มี 2 ตาราง (สมมติ forums กับ topics)

query แรก select จากตาราง forums ให้ผลลัพท์ 30 record
แล้ว loop query ข้อมูล topic ล่าสุดในแต่ละ forums 30 ครั้ง
(query แยก)

กับ query ทีเดียว ออกมาหมดทั้งข้อมูล forums แล้วก็ข้อมูล topic ล่าสุดใน 30 record
ก็แค่ loop แสดงผลทีเดียว



แต่การ join กันต้องออกแบบทั้งโครงสร้างตารางทั้งคำสั่ง query ให้ดีๆ นะครับ
เพราะเคยเจอว่าบางครั้ง query แยกกันดันเร็วกว่า query แบบ join ก็มี
[direct=http://www.thzhost.com/]THZHost[/direct] SSD Hosting ไทย/สิงคโปร์ พร้อม firewall ป้องกันการยิงเว็บ + scan ไวรัสในเว็บ

cpengineer

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

ขอบอกไว้ก่อนครับว่ากรุณา Join เท่าที่จำเป็นครับ

:wanwan017: :wanwan017: :wanwan017:

ttuunn

[direct=http://www.click2studio.com/vip-truemoney/index.php][/direct]
[direct=http://www.thaiseoboard.com/index.php/topic,355732.0.html]ขายสคริปวีดีโอออนไลน์ ตัดบัตรเงินสด Auto ส่ง User Pass ไปยัง sms มือถือท่าน[/direct]
[direct=http://www.click2studio.com]รับทำเว็บรับทำสคริปวาไรตี้,ภาพยนตร์,เว็บบอร์ด,หาเพื่อน,อัลบัม,อื่นๆมากมาย  เว็บเป็นเอกลักษณ์ไม่จำเจ[/direct]

SekRanger

Join ทำไม?

มี Table 2 Table
1.หนังสือ มีคอลัมน์
1.1 ชื่อหนังสือ
1.2 หมวด id
2.หมวด
2.1 หมวด id
2.2 ชื่อหมวด

เวลาเรียก Query เราก็สั่ง Join Table ให้มันทำการ ดึงข้อมูลจาก 2 Tableมาผสมกันตามเงื่อนไขที่เรากำหนด
ในกรณีนี้เราก็ทำการ Join Table หมวดเข้ากับ Table หนังสือโดยมีเงื่อนไขคือ คอลัมน์หมวด id ทั้ง 2 Table จะต้องตรงกัน

ทำไมไม่รวม Table?
มันง่ายต่อการจัดการข้อมูล ข้อมูลใน Table หลักจะมีขนาดเล็ก ทำให้ดึงข้อมูลไวเพราะข้อมูลที่เก็บใน Table หลักส่วนมากจะเป็นตัวเลขที่อ้างอิง(Foreign Key)
มาจาก Table อื่นๆ

ถ้าลองไปขุดๆ CMS อย่าง phpbb, smf ส่วนมากก็จะใช้วิธีแยก Table นี้มาประยุกต์ใช้ นั่นทำใหเข้อมูลจาก CMS เหล่านี้แสดงผลได้ไวมาก

ลองนึกดูถ้าเก็บทุกอย่างไว้ใน Table เดียว

สมมติว่า Table กระทู้มีคอลัมน์ดังนี้
-ชื่อผู้โพสท์
-Password ผู้โพสท์
-วันที่สมัคร
-วันที่เข้ามาล่าสุด
-ข้อความที่โพสท์ในกระทู้นี้
-ข้อความที่โพสท์ล่าสุด
-ข้อความที่โพสท์ไว้ครั้งก่อนๆ
-ชื่อเล่น
-ชื่อจริง
-อีเมล์
-บลาๆ เก้าลอเก้า

แค่ Row เดียวก็น่าจะเกิน 128KB แล้ว
ถ้ามีสัก 100 Row ดังนั้น Table นี้น่าจะมีขนาด 128KB * 100 = 12,800KB หรือ 12MB
ถ้าในอนาคตมีสัก 1000 กระทู้โหลดข้อมูลเป็นปีแน่ๆ

ปล.การแยก Table เราเรียกว่าการ Normalize เป็นการแยกเอาข้อมูลที่มีลักษณะซ้ำๆ ไปเก็บแยกอีก Table
Normalize มี 5 ฟอร์มมั้ง(หรือ 4 หว่า) แต่ส่วนมากจะทำแค่ 4 แต่ในโรงงานจะทำแค่ 3 เพราะบางทีถ้าแยกทุกเม็ดจริงๆจะดูข้อมูลไม่รู้เรื่องเลย
ทั้ง Row มีแต่ตัวเลข จะดูข้อมูลทีต้องเขียน Script Join ยาวเป็นหางว่าว... ไม่สะดวก


ปล 2. ผมตอบตรงคำถามมั้ยอ่ะ :-[ แพล่มซะยาว

ohmohm

ก็ข้อมูลที่ต้องการ มันอยูคนละ tables ( อาจเพราะ normalized ไปแล้ว ) ถ้าใช้ join ก็อาจได้ใช้ประโยชน์จาก index หรือ optimizer ของ SQL นั้นๆ ซึ่งน่าจะเร็วกว่า สะดวกกว่า query มาเอง แล้วกรองเองทั้งหมด

แต่จะว่าไป ตอนนี้มันก็เริ่มมีแนวคิดตรงกันข้ามกัน คือ NoSQL
http://no-sql.blogspot.com/2010/02/nosql-introduction-to-nosql.html
http://www.narisa.com/forums/index.php?showtopic=30503

GillBate

อ้างถึงจาก: ohmohm ใน 16 เมษายน 2010, 18:54:58
ก็ข้อมูลที่ต้องการ มันอยูคนละ tables ( อาจเพราะ normalized ไปแล้ว ) ถ้าใช้ join ก็อาจได้ใช้ประโยชน์จาก index หรือ optimizer ของ SQL นั้นๆ ซึ่งน่าจะเร็วกว่า สะดวกกว่า query มาเอง แล้วกรองเองทั้งหมด

แต่จะว่าไป ตอนนี้มันก็เริ่มมีแนวคิดตรงกันข้ามกัน คือ NoSQL
http://no-sql.blogspot.com/2010/02/nosql-introduction-to-nosql.html
http://www.narisa.com/forums/index.php?showtopic=30503

:wanwan044: อย่างนี้นี่เอง CouchDB ผมมีอีบุ๊คนะครับ สนใจจะอัพให้

ตาราง users ผมมี 45 ฟิลแนะ(เกม) เป็นไรป่าวครับ :P

kitazawa1st

45 ฟิลด์ ลองแยกดูครับ แยกประเภท แยกการเรียกใช้

อันไหนที่นานๆทีเรียกก็แยกไปอีกตารางนึง

ตอนผมทำเกมทีแรกก็ใช้ฟิลด์เยอะครับ

แต่ อ. ให้โจทย์มาว่าแยกเป็นอีกตาราง

ก็เลยลองแยกดู สรุปว่า เร็วกว่าเดิมครับ

เพิ่มเติม ถ้าใช้ Select * มันจะใช้เวลาเยอะอ่ะครับงง

ทั้งนี้ทั้งนั้น คงต้องลองดูตามสถานการณ์นะครับ

:P
เล็กสั้น ขยันซอย

picharnan

อ้างถึงจาก: ohmohm ใน 16 เมษายน 2010, 18:54:58
ก็ข้อมูลที่ต้องการ มันอยูคนละ tables ( อาจเพราะ normalized ไปแล้ว ) ถ้าใช้ join ก็อาจได้ใช้ประโยชน์จาก index หรือ optimizer ของ SQL นั้นๆ ซึ่งน่าจะเร็วกว่า สะดวกกว่า query มาเอง แล้วกรองเองทั้งหมด

แต่จะว่าไป ตอนนี้มันก็เริ่มมีแนวคิดตรงกันข้ามกัน คือ NoSQL
http://no-sql.blogspot.com/2010/02/nosql-introduction-to-nosql.html
http://www.narisa.com/forums/index.php?showtopic=30503

เพิ่งเคยได้ยินครับ  ต้องลองครับ

GillBate

อ้างถึงจาก: kitazawa1st ใน 16 เมษายน 2010, 22:08:55
45 ฟิลด์ ลองแยกดูครับ แยกประเภท แยกการเรียกใช้

อันไหนที่นานๆทีเรียกก็แยกไปอีกตารางนึง

ตอนผมทำเกมทีแรกก็ใช้ฟิลด์เยอะครับ

แต่ อ. ให้โจทย์มาว่าแยกเป็นอีกตาราง

ก็เลยลองแยกดู สรุปว่า เร็วกว่าเดิมครับ

เพิ่มเติม ถ้าใช้ Select * มันจะใช้เวลาเยอะอ่ะครับงง

ทั้งนี้ทั้งนั้น คงต้องลองดูตามสถานการณ์นะครับ

:P

ถ้ามี WHERE ด้วยนี่มันจะเหมือนเดิมรึเปล่าครับ :P

GillBate

 :P ลืมถามไป ในเมื่อผมมี 45 ฟิล ถ้าผมแยกออกเป็น 2 หรือ 3 ตารางแล้วจอยกัน มันจะช้าหรือเร็วกว่าตารางเดียวอ่ะครับ

kitazawa1st

อ้างถึงจาก: GillBate ใน 17 เมษายน 2010, 06:37:50
:P ลืมถามไป ในเมื่อผมมี 45 ฟิล ถ้าผมแยกออกเป็น 2 หรือ 3 ตารางแล้วจอยกัน มันจะช้าหรือเร็วกว่าตารางเดียวอ่ะครับ

join ช้ากว่าครับ แต่ที่ผมหมายถึงก็คือ

เช่น แยกตาราง user status skill (ประมาณนี้)

ถ้าจะจัดการ user ก็ดึงจากตาราง user อย่างเดียว skill ไม่ใช้ก็ไม่ต้องดึง

แล้วถ้าจะเอาข้อมูลจาก status ก็ค่อย select ตาราง status อีกทีนึง

เท่าที่ผมทดสอบจับเวลาดู ผลมันออกมาเร็วกว่าอ่ะครับ

*** ตัวอย่างที่ผมใช้


$user = mysql_query("SELECT * FROM user LIMIT 10");
while($uu = mysql_fetch_array($user)) {
$stat = mysql_fetch_array(mysql_query("SELECT * FROM status WHERE user_id={$uu['user_id'}));
.....
.....
.....
}


ประมาณนี้นะครับ (รอผู้เชี่ยวชาญมาเพิ่มเติม)

:P
เล็กสั้น ขยันซอย

ohmohm

เห็นด้วยครับ ถ้าต้องการทุก fields โดยใช้ join ทุก tables ที่เกี่ยวข้อง ช้ากว่า ถ้าเราออกแบบ table ที่มันมีทุก fields ครบอยู่แล้ว
แต่ถ้าต้องการ select ,update บาง fields บางส่วน แยกออกเป็น tables มา จะเร็วกว่า และลดปัญหาพวก isolation ด้วย เพราะ lock บาง table เท่าันั้น
ถามว่า WHERE จะช่วยลดเวลาไหม ถ้าหลัง where ไปอ้าง field ที่มี index ก็น่าจะเร็วขึ้น ( ถ้าใช้แค่การเปรัยบเทียบ = และไม่มี function อะไีปครอบ field นั้นๆ ) และถ้า select แบบใส่ชื่อ field ( ไม่ select * ) อาจได้ประโยชน์จาก covering index คือ select ค่าที่เก็บจาก index เลย ไม่ใช่ที่ table ( ถ้าเป็น MS SQL Server ตอน CREATE INDEX จะมีให้ INCLUDE คือ ให้เอาข้อมูล column ที่ไม่ได้สั่ง index ไปเก็บใน index ด้วย แต่ MySQLไม่น่าจะมี )

genetic

เรื่องนี้เป็นเรื่องที่ถกเถียงกันมาช้านาน.....

ตั้งแต่สมัยยุคพ่อขุน เลยมั้ง

หุหุ  :-[ :-[
[direct=http://www.signmate.co]Digital Signage[/direct],  [direct=http://www.signmate.co]ป้ายโฆษณาดิจิตอล[/direct],
[direct=https://www.signnex.com]Digital Signage[/direct][direct=http://www.keeate.com]App Creator[/direct],
[direct=http://www.keeate.com]รับทำแอพ[/direct]

GillBate

อ้างถึงจาก: genetic ใน 18 เมษายน 2010, 00:31:44
เรื่องนี้เป็นเรื่องที่ถกเถียงกันมาช้านาน.....

ตั้งแต่สมัยยุคพ่อขุน เลยมั้ง

หุหุ  :-[ :-[

:P ภาษาไทยยังไม่คลอดเลยครับยุคนั้น

ohmohm


planetteam

ถ้าจะถามว่า join ทำไมเหรอครับ  ถ้าคนเด็กคอม ก็ต้องบอกว่า  ฐานข้อมูลมันต้อง Normalize ก่อนถึงจะลดความซ้ำซ้อน อะครับ

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

ก็เลย เป็นเหตุให้ต้อง join table อะครับ หุหุ
ขาย สคริป 25satang 20000.- bath สคริป ประมูล
ขายระบบรับตัดบัตรทรูมันนี่

รับเขียนโปรแกรมตัดบัตรทรู,ไอเทมมอล,เวปส่ง sms ,เวปคลิปวีดีโอ,บอดพิคโพส,ออโต้โพส และอื่นๆ
ภาษาที่เขียน php,vb.net,asp.net,c#.net,delphi
http://www.goto69.com ผลงานของทีมทางด้านโปรแกรมเมอ

เบอร์โทร 0853941973  อีเมล์ [email protected]

Jamjung123

 :wanwan003:


Join Table เป็นการดึงข้อมูลจากหลาย ๆ TB โดยจะมีข้อมูลที่มีความเกี่ยวเนื่องกัน เมื่อเราต้องการจัดการกับ กิจกรรมต่าง ๆ บน tb นั้นแล้วสามารถสั่งได้เลย โดยที่เราไม่ต้องทำกิจกรรมที่ละ tb แต่เราสามารถสั่งได้ในครั้งเดียวเรย

  :wanwan002:
Web Marketing!!

GillBate

 :P ไหนๆ ก็มีคนขุดขึ้นมาแล้วเลยถามต่อเลยแล้วกัน
ถ้า join แล้วจะลดจำนวน query ได้ใช่หรือไม่

goolexgooyom

ถ้าปริมาณขอมูลมี สักล้าน เรคคอร์ด ควรจะ join หรือ แยกกันดีละ
โปรโมทเว็บไซต์อย่างเทพ โปรโมทเว็บด้วย skysubmit.com