Bir veritabanını / tabloyu yığın olarak nasıl uygularım


11

Ben farklı kullanıcılar için bazı dosya adlarını itmek / pop gerekiyor bir makine var. Geleneksel olarak veri yapısının seçimi olarak yığınları kullanırdım, ancak gelen web istekleri arasında veri yapısını korumak için bir yolum olmadığı için bu bir veritabanı kullanılarak yapılması gerekiyor.

Veritabanlarını kullanarak yığın işlevselliğini uygulamak için iyi bir yol ne olacağını merak ediyordum?

Desteklemem gerekiyor:

  • push (dosyaAdı, kullanıcı): kullanıcı için bir dosyaAdı aktarma
  • pop (kullanıcı): Kullanıcı için en üstteki dosya adını açar

DÜZENLE :

Ben bir fikir prototip ve ben python ile sqlite3 kullanıyorum.

Teşekkürler!


aynı kullanıcının birden fazla eşzamanlı bağlantıya sahip olmasını mı bekliyorsunuz? hangi hacimler? ne Db motoru da lütfen?
gbn

@gbn Sonuçta aynı kullanıcının eşzamanlı bağlantıları olabilir. Ama şimdilik, bir fikri prototiplendiriyorum ve kullanıcı başına tek bir bağlantı olduğunu düşünüyorum
brainydexter

@brainydexter Ne yapmaya çalıştığınızı bilmek istiyorum. Sorununuza yanlış çözüm oluşturuyor olabileceğinizi hissediyorum. Bize sorununuzu anlatmayı ve çözmek için en iyi yolu sormayı düşünebilirsiniz. Yığını veritabanı tablosu olarak uygulamak kötü bir fikir gibi gelebilir.
xenoterracide

@xenoterracide: SO'da ne yapmaya çalıştığımın genel amacı: stackoverflow.com/questions/5145051/… Yığın tam olarak çalışmadı, bu yüzden hala buna bir çözüm arıyorum.
brainydexter

1
@brainydexter gerçekten şaşırmadı, SQL bir yığını uygulamak için korkunç bir dildir, çünkü ilişkisel tanım gereği bir küme sıralanmamıştır, bu nedenle yığınınız hiçbir düzen içermez ve sıralamanız gerekir. Belki de probleminizin bir parçası, insanlara cevabın ne olmasını istediğinizi söylüyorsunuz ve nasıl olduğunu soruyorsunuz. Onlara sorunun ne olduğunu söylemek ve ne olduğunu sormak yerine. SO sorunuz bile cevabı belirli bir şeye yönlendiriyor. Aklınıza gelmeyecek bir çözüm istemeyi deneyin.
Xenoterracide

Yanıtlar:


6

Hangi veritabanının kullanılacağını soruyorsanız, bu gerçekten kişisel tercihe ve bundan ne istediğinize bağlıdır. Sadece MySQL'e aşina olduğum için, sorunun MySQL olduğunu varsayarak diğer kısmına cevap vereceğim:

kullanmak isteyeceksiniz INNODBçünkü masanız yazma yoğun olacak ve büyük tablolar için INNODB'nin satır kilitlenmesi hayat kurtarıcı olacaktır MyISAM.

Masa tasarımına göre, sadece bir masaya ihtiyacınız var gibi görünüyor:

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

AUTO_INCREMENTBirincil anahtar her dizinin her girişinde çoğaltılır çünkü rasgele bir 'id' sütun ayarlanmış gitti . Bu nedenle, dosya adınız çok uzunsa birincil anahtarını (kullanıcı, dosya adı) yapmak performans sorunlarına neden olabilir.

'Kimlik' sütununuzun boyutu, tablonuzun ne kadar büyüyeceğine bağlıdır. İmzasız Smallint size 65 bin satır verecektir.

Kullanıcı ve dosya adları varchar'tır, çünkü uzunluk olarak büyük ölçüde değişeceklerini varsayıyorum.

date_insertO (POP için yararlı) takıldığında dayanarak sonuçlarınızı sipariş için sadece bir yoludur


Kullanıcıya göre itmek veya pop yapmak istiyorum, çünkü birincil anahtar olarak (id, kullanıcı) kombinasyonu yapmayı düşünüyordum. Ne düşünüyorsun ? Ayrıca, POP işlemi için, maksimum kimliğe sahip kullanıcı için kayıt bulmak daha iyi olmaz mıydı?
brainydexter

@brainydexter dev.mysql.com/doc/refman/5.0/tr/innodb-restrictions.html , otomatik azaltma ile ilgili bazı kısıtlamalara sahiptir (bazı nadir durumlarda 'düşük' otomatik azaltma değerlerini yeniden kullanır). çünkü bir date_insert alanı ile gitmiştim. Birincil anahtar olarak (id, user) kullanımına gelince, daha fazla depolama alanı kullanmak dışında bir anlamı yoktur. Kimlik satırı benzersiz bir şekilde tanımlar. yalnızca 'kullanıcı' tek başına satırı tanımlamaz, bu nedenle isterseniz 'kullanıcı kimliği' üzerinde benzersiz (kullanıcı, dosya adı) yerine benzersiz olmayan bir dizine sahip olabilirsiniz.
Derek Downey

6

Bir Oracle veritabanını düşünüyorsanız , bir LIFO (son giren ilk çıkar) atma düzeniyle Gelişmiş Kuyruk kullanmayı düşünmelisiniz .

En temel kuyruk düzeyinde, bir üretici bir veya daha fazla iletiyi bir kuyruğa sırar. Her mesaj bir kez tüketiciden biri tarafından ayıklanır ve işlenir. Bir ileti, tüketici tarafından ayıklanıncaya veya iletinin süresi doluncaya kadar kuyrukta kalır. Bir üretici, mesajın tüketilmesinden önce ve mesajın sona ermesinden bir süre sonra bir gecikme belirleyebilir. Benzer şekilde, bir tüketici, herhangi bir mesaj yoksa, bir mesajı aldatmaya çalışırken bekleyebilir. Bir aracı programı veya uygulaması hem üretici hem de tüketici olarak hareket edebilir.


klasik yapımcı / tüketici kurulumu. Bilgi için teşekkürler, aklımda tutacağım.
brainydexter

Umarım MySQL şimdi Oracle "mysql" sahibi "Adance Queue işlevselliği alacak ...
Derek Downey

1
@DTest: Tabii ki, mySQL'in gelişmiş özelliklere sahip olma olasılığı daha düşüktür, böylece Oracle özgür yazılım ve sizin için ödemeniz gerekenleri ayırt edebilir.
Joe

@ Haftasonumu bu düşünce ile mahvettiğine teşekkürler!
Derek Downey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.