เพื่อนๆ ช่วยผม จัดการเรื่องฐานข้อมูลหน่อยครับ ตอนนี้มันซ้ำซ้อนมาก

เริ่มโดย untilate, 12 กันยายน 2009, 20:33:38

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

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

untilate

คือผมทำเว็บเพลงอะ แล้วตอนผมใส่ผมก็จะใส่ไปทีละเพลงแล้วข้อมูลจะอยู่ในตารางเดียว ลักษณะนี้

songid   songname   album   artist
1   song1   album1   artist1
2   song2   album2   artist2
3   song3   album1   artist1
4   song4   album3   artist3
5   song5   album2   artist2
6   song6   album3   artist3
6   song7   album4   artist3

พอเข้าใจผมมั๊ย

คือแต่ละเพลง จะไม่ซ้ำกันเลย แต่ album จะซ้ำกันมาก และ artist ก็จะซ้ำกันมากกว่า album เสียอีก

แล้วเราพอมีวิธีไหนบ้างครับ ทีลดความซ้ำซ้อนของข้อมูลนี้

Se7enKeNz


untilate

ก็คือถ้า album artist ซ้ำกัน ก็ให้เหลือเพียงอันเดียวพออะครับ

แล้วใน song ก็ค่อยเพิ่มเป็น album_id กับ artist_id ขึ้นมาใหม่

แต่ผมไม่รู้วิธีการที่จะสร้าง ตารางขึ้นมาใหม่แบบนั้นอะครับ

Se7enKeNz

ใครแวะผ่านมาช่วยขยายความทีนะคับ ผมยัง งงอยู่ครับ
ยังไงลองแอด MSN มาคุยดีกว่ามั้ยครับ ผมชักงงๆ  :P

untilate

มันก็น่างงอยู่ครับ

คือ

เมื่อก่อนเว็บผมมีโครงสร้างฐานข้อมูลเป็น ตารางเดียว ยึด รายชื่อเพลงเป็นหลัก คือ

id 1 - เพลง ก - ศิลปิน a - อัลบั้ม 1
id 2 - เพลง ข - ศิลปิน a - อัลบั้ม 2
id 3 - เพลง ค - ศิลปิน a - อัลบั้ม 2
id 4 - เพลง ง - ศิลปิน b - อัลบั้ม 3
id 5 - เพลง จ - ศิลปิน b - อัลบั้ม 3
id 6 - เพลง ฉ - ศิลปิน b - อัลบั้ม 4

จะเห็นไว้ว่า db ต้องเปลืองพื้นที่กับการเก็บ ชื่อศิลปิน ชื่ออัลบั้ม ซ้ำๆ กันเยอะมาก

ผมเลยอยากให้มันเปลื่ยนใหม่เป็น

ตารางแรก

id เพลง - ชื่อเพลง - id ศิลปิน - id อัลบั้ม

1 - เพลง ก - 1 - 1
2 - เพลง ข - 1 - 2
3 - เพลง ค - 1 - 2
4 - เพลง ง - 2 - 3
5 - เพลง จ - 2 - 3
6 - เพลง ฉ - 2 - 4

ตาราง ที่ 2

ตาราง 2 ก็จะเก็บ ว่า

ศิลปิน id=1 เนี้ย ชื่อศิลปินว่าอะไร

ตาราง 3

ตาราง 3 ก็จะดูอีกทีว่า

อัลบั้ม id=1 เนื้ย มันคืออัลบั้มอะไร

พอเข้าใจไหม

คำถามของผมคือ เราจะแปล ตาราง แบบที่มัน ซ้ำๆ กันมาเป็นแบบใหม่นี้ยังไง

Se7enKeNz

อ่อพอเข้าใจแล้วครับ แล้วต้องการอะไรครับ
โครงสร้างฐานข้อมูล หรือว่า Code PHP ครับ  :P

untilate

ไม่ต้องถึง กับ เขียน code ให้หรอกครับ

ผมอยากทราบแค่วิธีแปลงมาเป็นแบบนั้นอะครับ

เดี๋ยวตัว code เอง หาเอง ครับ


แต่ตอนนี้ผมไม่มีแนวคิดอะไรเลยครับ

zaakikuya

คงต้องเริ่ม design ใหม่ทั้งหมดแล้วค่ะ

อันเก่ามันซ้ำซ้อนจริงด้วยค่ะ

ควรจะ design แยกออกเป็นประเภท

อย่างเช่น ตารางรายชื่อเพลง, ตารางศิลปิน, ตารางประเภทเพลง ประมาณนี้ค่ะ  ::)
[direct=http://ดูดวง-ทายนิสัย.blogspot.com/]ดูดวง ทายนิสัย[/direct] | [direct=http://รักสวยรักงาม.blogspot.com/]รักสวยรักงาม[/direct] | [direct=http://kunoa.blogspot.com/]ขำๆ คลายเครียด แบ่งปันความรู้[/direct]

crazycat

อืม....ผมก็ไม่เคยทำด้วยนะครับตัวนี้ ตอนนี้คิดคราว ๆ ได้ประมาณว่าต้องทำอย่างน้อย 2 tables แล้วก็ต้องมีการทำ index ด้วย

ข้อมูลมี: ชื่อเพลง ชื่ออัลบั้ม ชื่อศิลปิน
เงื่อนไข: ต้องการลดการใช้ อัลบั้มและศิลปิน ที่มีความซ้ำซ้อน
ความเหมือน: อัลบั้มกับศิลปิน จะเหมือนกันทุกครั้ง(หรือเปล่า)

table แรก

songid songname indexid
1        song1       1
2        song2       2
3        song3       1
4        song4       3
5        song5       2
6        song6       3
7        song7       4



table ที่สอง

indexid   album   artist
1           album1   artist1
2           album2   artist2
3           album3   artist3
4           album4   artist4




อันนี้เป็นแค่แนวคิดนะครับ อย่าไปคิดมากกับมันนะครับ  มันขึ้นอยู่กับลักษณะการใช้งานด้วยนะครับ  ลองไปประยุกต์ตามความเหมาะสมนะครับ
[direct=http://www.jobxar.com]แหล่งหางานราชการ งานรัฐวิสาหกิจ[/direct]

Se7enKeNz

ขอยกตัวอย่างเลยนะครับ

ตาราง music







songidsongnamealbumartist
1อยู่บำรุง11
2ระยะปลอดภัย11
3You Are Not Alone22
4Leave Me Alone32

ตาราง album




albumidalbumname
1Acadamy Fantasia
2Micheal Single Vesion

3Micheal Return

ตาราง artist




idartistname
1ว่าน ธนกฤต
2Micheal Jackson


การดึงข้อมูลมาแสดง
ก็ใช้คำสั่งประมาณนี้นะครับ

<?php

$dbhostname = "localhost";
$dbuser = "ชื่อผู้ใช้ฐานข้อมูล";
$dbpassword = "พาสเวิร์ดฐานข้อมูล";
$dbname = "ชื่อฐานข้อมูล";
mysql_connect($dbhostname, $dbuser, $dbpassword) or die("Error Can not Connect To Database Server");
mysql_select_db($dbname) or die("Error Not Selete Database");
?>
<table width="600px">
<?
$music = mysql_query("select * from music order by songid");
while($dbarr = mysql_fetch_array($user)) {
?>
<tr>
   <td width="15%"><?php echo $dbarr['songid'] ; ?></td>
   <td width="35%"><?php echo $dbarr['songname'] ; ?></td>
   <td width="25%"><?php echo $dbarr['album'] ; ?></td>
   <td width="25%"><?php echo $dbarr['artist'] ; ?></td>
</tr>
<?php } ?>
</table>

ตรงส่วนของ <?php echo $dbarr['album'] ; ?> กับ <?php echo $dbarr['artist'] ; ?>
ลองนำไปดัดแปลงเป็นตัวแปรดูครับ
ซึ่งตรงนี้ผมยังคิดมุกมะค่อยออก รอท่านอื่นมาประสานต่อละกันครับ


zaakikuya

อย่าเพิ่งไปสนใจโค้ดเลยค่ะ สำคัญที่ database ต้อง design ให้ถูกดีกว่าค่ะ นอมัลไลซัก 3NF ก็ใช้ได้แล้วค่ะ ::)
[direct=http://ดูดวง-ทายนิสัย.blogspot.com/]ดูดวง ทายนิสัย[/direct] | [direct=http://รักสวยรักงาม.blogspot.com/]รักสวยรักงาม[/direct] | [direct=http://kunoa.blogspot.com/]ขำๆ คลายเครียด แบ่งปันความรู้[/direct]

untilate

อ้างถึงจาก: zaakikuya ใน 12 กันยายน 2009, 21:37:03
อย่าเพิ่งไปสนใจโค้ดเลยค่ะ สำคัญที่ database ต้อง design ให้ถูกดีกว่าค่ะ นอมัลไลซัก 3NF ก็ใช้ได้แล้วค่ะ ::)

พูดภาษาเทคนิคแล้วงง เลยครับ

ขอบคุณคุณ Se7enKeNz  มากนะครับ

อีกอย่าง

ตรงอัลบั้ม ไม่จำเป็นต้องตรงกับ ชื่อศิลปิน อะครับ

ศิลปินคนหนึ่งอาจมีหลายอัลบั้มก็ได้

navico