2010-05-04 13 views
5

Mam kilka wartości danych, które muszę przechowywać na mojej aplikacji szyny i chciałbym wiedzieć, czy istnieją alternatywy do tworzenia tabeli bazy danych tylko po to, aby wykonać to proste zadanie.Przechowywanie danych w Ruby na szynach bez bazy danych

Tło: Piszę niektóre narzędzia analizy i deski rozdzielczej dla mojej aplikacji Ruby on Rails i mam nadzieję na przyspieszenie dashboard poprzez buforowanie wyników, które nigdy nie ulegnie zmianie. Teraz pobieram wszystkich użytkowników przez ostatnie 30 dni i ponownie je ułożę, aby codziennie widzieć liczbę nowych użytkowników. Działa świetnie, ale zajmuje dużo czasu, w rzeczywistości powinienem tylko obliczyć ostatni dzień i po prostu przechowywać resztę tablicy gdzie indziej.

Gdzie jest najlepszy sposób na przechowywanie tej tablicy?

Utworzenie tabeli bazy danych wydaje się nieco przesadzone i nie jestem pewien, czy zmienne globalne są poprawną odpowiedzią. Czy istnieje najlepsza praktyka utrzymywania takich danych?

Jeśli ktoś zrobił coś takiego, daj mi znać, co zrobiłeś i jak się okazało.

Odpowiedz

11

Ruby ma wbudowany magazyn wartości kluczy oparty na haszywie o nazwie PStore. Zapewnia to prostą obsługę transakcyjną i transakcyjną.

+0

Bardzo to lubię, nie wiedziałem, że on istniał, bazując na opisie problemu i doświadczeniu, poleciłbyś tę metodę w stosunku do innych sugestii "po prostu skorzystaj z DB"? – Schneems

+0

Jeśli twój przypadek użycia jest serializacją tablicy, która brzmi tak, jak jest, to dlaczego nie? Jeśli to ci się nie uda, łatwo będzie zmienić inne rozwiązanie. –

1

Używanie lekkiej bazy danych, takiej jak sqlite, nie powinno wydawać się przesadą. Alternatywnie możesz użyć rozwiązań z kluczowymi sklepami, takich jak tokio cabinet, lub nawet przechowywać tablicę w płaskim pliku, ale naprawdę nie widzę przesady w używaniu sqlite.

+0

Chyba przesada czuję będzie pochodzić z pisania schematu, migracji bazy danych do czynienia z dwoma różnymi kartami w moim Rails Project (obecnie używanie MYSQLa do każdego innego), a następnie pisanie zapytań sql (ponieważ te elementy nie są powiązane z modelem) ... gdy na koniec dnia wszystko czego chcę, to [1,2,3,4,5] . Nie mam nic przeciwko temu, jestem ciekawa, jak inni podeszli do tego samego scenariusza. – Schneems

1

Jeśli masz już bazę danych, to naprawdę nie jest wielka sprawa, aby utworzyć oddzielną tabelę do śledzenia tego rodzaju rzeczy. Podczas tworzenia raportów często korzystne jest tworzenie pochodnych tabel podsumowań dokładnie tak, jak opisujesz. Możesz je aktualizować zgodnie z wymaganiami za pomocą prostej instrukcji SQL i nie ma obaw, że Twój tymczasowy sklep w jakiś sposób zniknie.

Mimo to typ raportu, który próbujesz wygenerować, jest w rzeczywistości czymś, co można zrobić w czasie rzeczywistym, z wyjątkiem ekstrawagancko dużych zbiorów danych. Kluczem jest posiadanie indeksów opisujących dokładną operację grupowania, którą próbujesz wykonać. Na przykład, jeśli grupujesz według daty kalendarzowej, możesz utworzyć pole "data" i zsynchronizować je z czasem "created_at". Indeks w tym dniu dziedzinie uczyni robi GROUP BY CREATED_DATE bardzo szybkie:

SELECT created_date AS on_date, COUNT(id) AS new_users FROM users GROUP BY created_date 
+0

Niestety nie robię tego tylko dla użytkowników, ale kilka innych elementów, takich jak liczba wiadomości e-mail wysyłanych dziennie, która jest w tysiącach (dziennie), więc ciągnięcie danych modelu z ostatnich 30 dni trwa wiecznie. Następnie, gdy otrzymam obiekty, muszę wykonać created_at (obiekt data/czas) i ocenić iterację, aby zgrupować obiekty. Może jest lepszy sposób, ale nie udało mi się jeszcze uderzyć w główkę. – Schneems

+1

Dodawanie kolumny z możliwością indeksowania, gdzie jest data, a nie data i godzina, pomoże w wygenerowaniu raportów w pierwszej kolejności. Jednoczesne dodawanie danych o wartości jednego dnia jest również dość wydajne, nawet w przypadku dużych wolumenów, ale czas potrzebny na dodanie wszystkich danych historycznych może być znaczny. Wstawienie pogrupowanej liczby powinno zająć tylko kilka sekund, a to powinno być zrobione najwyżej raz dziennie, co łatwo zrobić jako zadanie w tle lub zadanie cron. Nie ładuj modeli, jeśli chcesz je tylko policzyć. Wystarczy użyć SQL bezpośrednio. – tadman

Powiązane problemy