ปัญหาการออกแบบโมเดล PHP (MySQL)

ฉันกำลังมองหาวิธีแก้ปัญหาที่มีประสิทธิภาพที่สุดสำหรับปัญหาที่ฉันพบอยู่ ฉันกำลังออกแบบปฏิทินกะสำหรับพนักงานของเรา นี่คือตารางที่ฉันทำงานด้วย:

CREATE TABLE IF NOT EXISTS `Shift` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`accountId` smallint(6) unsigned NOT NULL,
`grpId` smallint(6) unsigned NOT NULL,
`locationId` smallint(6) unsigned NOT NULL,
`unitId` smallint(6) unsigned NOT NULL,
`shiftTypeId` smallint(6) unsigned NOT NULL,
`startDate` date NOT NULL,
`endDate` date NOT NULL,
`needFlt` bit(1) NOT NULL DEFAULT b'1',
`needBillet` bit(1) NOT NULL DEFAULT b'1',
`fltArr` varchar(10) NOT NULL,
`fltDep` varchar(10) NOT NULL,
`fltArrMade` bit(1) NOT NULL DEFAULT b'0',
`fltDepMade` bit(1) NOT NULL DEFAULT b'0',
`billetArrMade` bit(1) NOT NULL DEFAULT b'0',
`billetDepMade` bit(1) NOT NULL DEFAULT b'0',
`FacilityId` smallint(6) unsigned NOT NULL,
`FacilityWingId` mediumint(9) unsigned NOT NULL,
`FacilityRoomId` int(11) unsigned NOT NULL,
`comment` varchar(255) NOT NULL,
`creation` datetime NOT NULL,
`lastUpdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`lastUpdateBy` mediumint(9) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

ตอนนี้มาถึงปัญหา - ฉันต้องการให้แสดงบนปฏิทิน (ในสีอื่น) ว่าได้รับแผ่นเวลาสำหรับบางวันหรือไม่

ความคิดแรกของฉันคือสร้างตารางแยกกันและแสดงรายการแยกตามวันสำหรับพนักงานแต่ละคน T/F แต่ปริมาณข้อมูลที่ส่งคืนจากการสืบค้นแยกต่างหากสำหรับพนักงานแต่ละคนตลอดทั้งเดือนจะต้องมีจำนวนมากและไม่มีประสิทธิภาพอย่างแน่นอน

ความคิดที่สองคือการใส่ข้อมูลลงในตาราง Shift นี้โดยมีตัวคั่น - จากนั้นจึงระเบิดด้วย PHP ความคิดไร้สาระ... แต่ฉันเดาว่านั่นคือเหตุผลที่ฉันมาที่นี่ มีความคิดอะไรบ้าง?

ขอบคุณสำหรับความช่วยเหลือของคุณ!


person Logan    schedule 29.01.2011    source แหล่งที่มา
comment
คุณสามารถซีเรียลไลซ์ได้ (php.net/manual/en/function.serialize.php) แต่นั่นก็เหมือนกับการสร้างตารางแบบฝังในเซลล์ คุณแน่ใจหรือไม่ว่าต้องการรวมข้อมูลอินสแตนซ์ประเภทนั้นทั้งหมดเข้ากับข้อมูลออบเจ็กต์ของคุณ มีประโยชน์อะไร?   -  person Jared Farrish    schedule 30.01.2011
comment
แล้วปฏิทินจะแสดงต่อพนักงาน 1 คนต่อครั้งเหรอ? และบันทึกในตาราง 'Shift' สามารถขยายได้หลายวันใช่ไหม   -  person Harmen    schedule 30.01.2011
comment
ปฏิทินกะจะแสดงพนักงานทุกคนในแผนกหนึ่งๆ ในแนวตั้งโดยขยายตามแนวนอนตามวันที่ นั่นจะเป็นแถวจำนวนมากที่ส่งคืน (~ 20) สำหรับข้อมูลไทม์ชีทของพนักงานแต่ละคน เพียงเพื่อทำให้ปฏิทินมีสีที่แตกต่างกันสำหรับวันใดวันหนึ่ง   -  person Logan    schedule 30.01.2011


คำตอบ (1)


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

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

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

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

person petercoles    schedule 30.01.2011
comment
วิธีแก้ปัญหาที่ซับซ้อนน้อยกว่าคือการสร้างออบเจ็กต์ในแต่ละวันของเดือนสำหรับพนักงาน แต่นั่นฟังดูไม่ได้มีประสิทธิภาพมากนักเมื่อเราพูดถึงพนักงาน 100 คน... ไม่ต้องพูดถึงความสามารถในการปรับขนาดเพื่อให้บริษัทอื่นนำไปใช้ได้ - person Logan; 30.01.2011