ฉันจะใช้ฐานข้อมูล / ตารางเป็นกองซ้อนได้อย่างไร


11

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

ฉันสงสัยว่าอะไรจะเป็นวิธีที่ดีในการใช้ฟังก์ชันการทำงานของกองซ้อนโดยใช้ฐานข้อมูล

ฉันต้องการการสนับสนุน:

  • push (fileName, user): push a fileName สำหรับผู้ใช้
  • ป๊อป (ผู้ใช้): แสดงชื่อไฟล์ที่ดีที่สุดสำหรับผู้ใช้

แก้ไข :

ฉันกำลังสร้างต้นแบบของแนวคิดดังนั้นฉันจึงใช้ sqlite3 กับ python

ขอบคุณ!


คุณคาดหวังว่าผู้ใช้รายเดียวกันจะมีการเชื่อมต่อพร้อมกันหลายครั้งหรือไม่ เล่มไหน เครื่องยนต์ Db อะไรโปรดเช่นกัน?
gbn

@gbn ในที่สุดผู้ใช้รายเดียวกันอาจมีการเชื่อมต่อพร้อมกัน แต่ตอนนี้ฉันกำลังสร้างต้นแบบความคิดและฉันถือว่าการเชื่อมต่อเดียวต่อผู้ใช้
brainydexter

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

@xenoterracide: ความตั้งใจโดยรวมของสิ่งที่ฉันพยายามทำที่ SO: stackoverflow.com/questions/5145051/… กองไม่ทำงานอย่างสมบูรณ์ดังนั้นฉันยังคงหาวิธีแก้ปัญหานี้
brainydexter

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

คำตอบ:


6

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

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

เท่าที่ออกแบบตารางดูเหมือนว่าคุณต้องการเพียงหนึ่งตาราง:

CREATE TABLE `wordpress`.`<table_name>` (
`id` smallint(4) NOT NULL AUTO_INCREMENT UNSIGNED,
`user` varchar(30) NOT NULL,
`filename` varchar(255) NOT NULL,
`date_insert` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE `userFile`(user, filename)
) ENGINE=`InnoDB`;

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

ขนาดของคอลัมน์ 'id' ของคุณขึ้นอยู่กับว่าโต๊ะของคุณจะโตขนาดไหน Smallint ที่ไม่ได้ลงนามจะให้แถว 65k แก่คุณ

ผู้ใช้และชื่อไฟล์เป็น varchar เพราะพวกเขาจะเปลี่ยนความยาวอย่างมากฉันถือว่า

นี่date_insertเป็นเพียงวิธีการสั่งซื้อผลลัพธ์ของคุณตามเวลาที่แทรกไว้ (มีประโยชน์สำหรับ POP ของคุณ)


ฉันกำลังคิดที่จะสร้างการรวมกัน (id, ผู้ใช้) เป็นคีย์หลักเนื่องจากฉันต้องการที่จะผลักดันหรือป๊อปอัพขึ้นอยู่กับผู้ใช้ คุณคิดอย่างไร ? นอกจากนี้สำหรับการดำเนินการ POP จะเป็นการดีกว่าหรือถ้าจะหาระเบียนสำหรับผู้ใช้ที่มี id สูงสุด
brainydexter

@brainydexter dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.htmlมีข้อ จำกัด บางประการเกี่ยวกับ autoincrement (มันจะใช้ค่าการแทนที่อัตโนมัติ 'ต่ำกว่า' ในบางกรณีที่หายาก) เพราะเป็นไปได้ที่ฉันจะไปกับเขตข้อมูล date_insert สำหรับการใช้ (id, ผู้ใช้) เป็นคีย์หลักนั้นไม่มีประเด็นใดยกเว้นการเพิ่มพื้นที่เก็บข้อมูล ID ระบุแถวโดยไม่ซ้ำกัน เพียง 'ผู้ใช้' ด้วยตัวเองไม่ได้ระบุแถวดังนั้นคุณสามารถมีดัชนีที่ไม่ซ้ำกันใน 'userID' แทนที่จะเป็นเอกลักษณ์ (ผู้ใช้ชื่อไฟล์) หากคุณต้องการ
Derek Downey

6

หากคุณพิจารณาจากฐานข้อมูล Oracle คุณควรพิจารณาใช้Advanced คิวกับLIFO (สุดท้ายในออกก่อน) รูปแบบ

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


การตั้งค่าผู้ผลิต / ผู้บริโภคแบบคลาสสิก ขอบคุณสำหรับข้อมูลฉันจะเก็บไว้ในใจ
brainydexter

หวังว่า MySQL จะได้รับฟังก์ชั่น Adance Queue ในขณะนี้ที่ Oracle "เป็นเจ้าของ" mysql ...
Derek Downey

1
@DTest: แน่นอนว่ายังมีความเป็นไปได้ที่แตกต่างกันที่ตอนนี้ mySQL มีโอกาสน้อยที่จะได้รับคุณสมบัติขั้นสูงดังนั้น Oracle สามารถแยกความแตกต่างระหว่างซอฟต์แวร์ฟรีและสิ่งที่คุณต้องจ่าย
โจ

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