Bagaimana cara menerapkan database / tabel sebagai tumpukan

11

Saya memiliki mesin negara yang perlu mendorong / pop beberapa nama file untuk pengguna yang berbeda. Secara tradisional saya akan menggunakan tumpukan sebagai pilihan struktur data, tetapi ini perlu dilakukan dengan menggunakan database karena saya tidak memiliki cara untuk mempertahankan struktur data antara permintaan web yang masuk.

Saya bertanya-tanya apa yang akan menjadi cara yang baik untuk mengimplementasikan fungsionalitas stack menggunakan database?

Saya perlu mendukung:

  • push (nama file, pengguna): mendorong nama file untuk pengguna
  • pop (pengguna): Pop nama file paling atas untuk pengguna

EDIT :

Saya membuat prototipe ide, dan jadi saya menggunakan sqlite3 dengan python.

Terima kasih!

brainydexter
sumber
apakah Anda mengharapkan pengguna yang sama untuk memiliki beberapa koneksi bersamaan? volume berapa? apa mesin Db juga tolong?
gbn
@ GBN Akhirnya, pengguna yang sama mungkin memiliki koneksi bersamaan. Tetapi untuk sekarang, saya membuat prototipe ide dan saya menganggap satu koneksi per pengguna
brainydexter
@brainydexter Saya sangat ingin tahu apa yang Anda coba lakukan. Saya merasa bahwa Anda mungkin menciptakan solusi yang salah untuk masalah Anda. Anda mungkin ingin mempertimbangkan untuk memberi tahu kami masalah Anda, dan meminta jalan terbaik untuk menyelesaikannya. Menerapkan tumpukan sebagai tabel basis data terdengar seperti ide yang buruk.
xenoterracide
@ xenoterracide: Maksud keseluruhan dari apa yang saya coba lakukan di SO: stackoverflow.com/questions/5145051/... Stack tidak berfungsi sepenuhnya, jadi saya masih mencari solusi untuk ini.
brainydexter
1
@brainydexter tidak benar-benar terkejut, SQL adalah bahasa yang mengerikan untuk mengimplementasikan stack, karena menurut definisi relasional set tidak terurut, sehingga stack Anda tidak memiliki urutan, dan Anda harus mengurutkannya. Mungkin bagian dari masalah Anda adalah Anda memberi tahu orang-orang tentang jawaban yang Anda inginkan, dan Anda bertanya bagaimana. Alih-alih memberi tahu mereka apa masalahnya, dan bertanya apa. Bahkan pertanyaan SO Anda memimpin jawaban untuk sesuatu yang spesifik. Coba minta solusi yang tidak akan Anda pikirkan.
xenoterracide

Jawaban:

6

Jika Anda bertanya tentang basis data mana yang akan digunakan, itu benar-benar tergantung pada preferensi pribadi dan apa yang Anda inginkan darinya. Karena saya hanya terbiasa dengan MySQL, saya akan menjawab bagian lain dari pertanyaan dengan asumsi MySQL:

Anda akan ingin menggunakan INNODBkarena meja Anda akan menjadi intensif menulis dan untuk tabel besar, penguncian baris INNODB akan menjadi penyelamat MyISAM.

Sejauh desain meja, tampaknya Anda hanya benar-benar membutuhkan satu tabel:

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`;

Aku pergi dengan kolom 'id' sewenang-wenang yang diatur ke AUTO_INCREMENTkarena kunci utama direplikasi di setiap entri setiap indeks. Jadi, melakukan kunci utama (pengguna, nama file) dapat menyebabkan masalah kinerja jika nama file Anda terlalu panjang.

Ukuran kolom 'id' Anda tergantung pada seberapa besar tabel Anda akan tumbuh. Smallint yang tidak ditandatangani akan memberi Anda baris 65 ribu.

Pengguna dan nama file adalah varchar, karena panjangnya akan bervariasi secara drastis.

Ini date_inserthanyalah cara untuk memesan hasil berdasarkan kapan dimasukkan (membantu POP Anda)

Derek Downey
sumber
Saya sedang berpikir untuk membuat kombinasi (id, pengguna) sebagai kunci utama, karena saya ingin mendorong atau pop berdasarkan pengguna. Bagaimana menurut anda ? Juga, untuk operasi POP, bukankah lebih baik untuk menemukan catatan untuk pengguna dengan id maksimum?
brainydexter
@brainydexter dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html memiliki beberapa batasan pada autoincrement (itu akan menggunakan kembali nilai autoincrement 'lebih rendah' ​​dalam kasus tertentu yang jarang terjadi). karena itu kemungkinan saya pergi dengan bidang date_insert. Adapun untuk menggunakan (id, pengguna) sebagai kunci Utama, tidak ada gunanya kecuali mengambil lebih banyak penyimpanan. ID secara unik mengidentifikasi baris. hanya 'pengguna' dengan sendirinya tidak mengidentifikasi baris, jadi Anda bisa saja memiliki indeks non-unik pada 'userID' alih-alih unik (pengguna, nama file) jika Anda mau.
Derek Downey
6

Jika Anda mempertimbangkan database Oracle, Anda harus mempertimbangkan untuk menggunakan Antrian Lanjutan dengan pola dequeue LIFO (last in first out) .

Pada tingkat antrian paling dasar, satu produser memasukkan satu atau lebih pesan ke dalam satu antrian. Setiap pesan dibagikan dan diproses satu kali oleh salah satu konsumen. Sebuah pesan tetap berada dalam antrian sampai konsumen mengeluarkannya atau pesan berakhir. Produser dapat menetapkan penundaan sebelum pesan tersedia untuk dikonsumsi, dan waktu setelah pesan berakhir. Demikian juga, konsumen dapat menunggu ketika mencoba membagikan pesan jika tidak ada pesan yang tersedia. Program atau aplikasi agen dapat bertindak sebagai produsen dan konsumen.

Leigh Riffel
sumber
pengaturan produsen / konsumen klasik. Terima kasih atas informasinya, saya akan mengingatnya.
brainydexter
Semoga MySQL akan mendapatkan beberapa fungsi Antrian Adance sekarang karena Oracle "memiliki" mysql ...
Derek Downey
1
@Dest: tentu saja, ada juga kemungkinan berbeda bahwa mySQL sekarang lebih kecil kemungkinannya untuk mendapatkan fitur-fitur canggih, sehingga Oracle dapat membedakan antara perangkat lunak bebas dan yang harus Anda bayar.
Joe
@Syukur terima kasih telah merusak akhir pekan saya dengan pikiran itu!
Derek Downey