Jak zaimplementować bazę danych / tabelę jako stos

11

Mam automat stanów, który musi wypychać / pop niektóre nazwy plików dla różnych użytkowników. Tradycyjnie stosowałbym stosy jako wybór struktury danych, ale należy tego dokonać przy użyciu bazy danych, ponieważ nie mam sposobu na zachowanie struktury danych między przychodzącymi żądaniami internetowymi.

Zastanawiałem się, jaki byłby dobry sposób na wdrożenie funkcjonalności stosu przy użyciu baz danych?

Muszę wesprzeć:

  • push (nazwa_pliku, użytkownik): push nazwa_pliku dla użytkownika
  • pop (użytkownik): Pop najwyższą nazwę pliku dla użytkownika

EDYCJA :

Prototypuję pomysł, więc używam sqlite3 z Pythonem.

Dzięki!

brainydexter
źródło
czy oczekujesz, że ten sam użytkownik będzie miał wiele równoczesnych połączeń? jakie tomy jaki silnik Db też proszę?
gbn
@gbn W końcu ten sam użytkownik może mieć równoległe połączenia. Ale na razie prototypuję pomysł i zakładam pojedyncze połączenie na użytkownika
brainydexter
@brainydexter Bardzo chciałbym wiedzieć, co próbujesz zrobić. Mam wrażenie, że tworzysz niewłaściwe rozwiązanie swojego problemu. Możesz zastanowić się, czy nie powiedzieć nam o swoim problemie i poprosić o najlepszą drogę rozwiązania go. Implementowanie stosu jako tabeli bazy danych wydaje się złym pomysłem.
ksenoterrakid
@xenoterracide: Ogólny zamiar tego, co próbuję zrobić w SO: stackoverflow.com/questions/5145051/… Stos nie działał całkowicie, więc wciąż szukam rozwiązania tego problemu.
brainydexter
1
@brainydexter nie jest naprawdę zaskoczony, SQL jest okropnym językiem do implementacji stosu, ponieważ według definicji relacyjnej zestaw jest nieuporządkowany, więc twój stos nie będzie miał porządku i będziesz musiał go posortować. Być może częścią twojego problemu jest to, że mówisz ludziom, na co chcesz odpowiedzieć, i pytasz, jak to zrobić. Zamiast mówić im, na czym polega problem i pytać o co. Nawet twoje pytanie SO prowadzi do odpowiedzi na coś konkretnego. Spróbuj poprosić o rozwiązanie, o którym nie pomyślisz.
ksenoterrakid

Odpowiedzi:

6

Jeśli pytasz o to, której bazy danych użyć, tak naprawdę zależy to od osobistych preferencji i tego, czego chcesz od niej. Ponieważ znam tylko MySQL, odpowiem na drugą część pytania zakładając MySQL:

będziesz chciał z niego korzystać, INNODBponieważ twoja tabela będzie intensywnie zapisywać, a dla dużych tabel blokowanie wierszy INNODB może uratować życie MyISAM.

Jeśli chodzi o projekt stołu, wydaje się, że naprawdę potrzebujesz tylko jednego stołu:

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

Poszedłem z dowolną kolumną „id” ustawioną na, AUTO_INCREMENTponieważ klucz podstawowy jest replikowany przy każdym wpisie każdego indeksu. Tak więc wykonanie klucza podstawowego (użytkownik, nazwa pliku) może powodować problemy z wydajnością, jeśli nazwy plików są bardzo długie.

Rozmiar kolumny „id” zależy od tego, jak duży będzie Twój stół. Unsigned Smallint da ci 65 tys. Rzędów.

Użytkownik i nazwy plików są zmienne, ponieważ zakładam, że drastycznie różnią się długością.

Jest date_insertto tylko sposób na uporządkowanie wyników na podstawie daty wstawienia (pomocne dla POP)

Derek Downey
źródło
Myślałem o stworzeniu kombinacji (identyfikator, użytkownik) jako klucza podstawowego, ponieważ chciałbym wcisnąć lub pop w zależności od użytkownika. Co myślisz ? Ponadto, czy dla operacji POP nie byłoby lepiej znaleźć rekord dla użytkownika o maksymalnym identyfikatorze?
brainydexter
@brainydexter dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html ma pewne ograniczenia dotyczące autowzrostu (w niektórych rzadkich przypadkach ponownie użyje „niższych” wartości autowzrostu). ponieważ jest to możliwe, że poszedłem z polem date_insert. Jeśli chodzi o używanie (identyfikator, użytkownik) jako klucza podstawowego, nie ma sensu, oprócz zajmowania więcej miejsca. Identyfikator jednoznacznie identyfikuje wiersz. po prostu „użytkownik” sam w sobie nie identyfikuje wiersza, więc możesz mieć po prostu nieunikalny indeks na „ID użytkownika” zamiast unikalnego (użytkownik, nazwa pliku), jeśli chcesz.
Derek Downey
6

Jeśli zastanawiasz się nad bazą danych Oracle, powinieneś rozważyć użycie opcji Advanced Queuing z wzorcem usuwania w kolejce LIFO (ostatnie weszło pierwsze wyszło) .

Na najbardziej podstawowym poziomie kolejkowania jeden producent kolejkuje jeden lub więcej komunikatów w jednej kolejce. Każda wiadomość jest usuwana z kolejki i przetwarzana jeden raz przez jednego z konsumentów. Wiadomość pozostaje w kolejce, dopóki konsument jej nie usunie z kolejki lub komunikat wygaśnie. Producent może określić opóźnienie, zanim wiadomość będzie dostępna do konsumpcji, oraz czas, po którym wiadomość wygaśnie. Podobnie, konsument może poczekać, próbując usunąć kolejkę wiadomości, jeśli wiadomość nie jest dostępna. Program lub aplikacja agenta może działać zarówno jako producent, jak i konsument.

Leigh Riffel
źródło
klasyczna konfiguracja producenta / konsumenta. Dzięki za informacje, będę o tym pamiętać.
brainydexter
Mam nadzieję, że MySQL dostanie funkcjonalność Adance Queue teraz, gdy Oracle „jest właścicielem” mysql ...
Derek Downey
1
@DTest: oczywiście istnieje również wyraźna możliwość, że mySQL ma mniejsze szanse na uzyskanie zaawansowanych funkcji, dzięki czemu Oracle może odróżnić wolne oprogramowanie od oprogramowania, za które trzeba zapłacić.
Joe
@ Joe dziękuję za zrujnowanie mojego weekendu tą myślą!
Derek Downey,