Tworzę aplikację internetową, która manipuluje dość złożonymi danymi: tabulatory.
As a reference, guitar tabs look like this:
Eb|-------------------------------------------------------------------------|
Bb|-------------------------------------------------------------------------|
Gb|--5-5-5-5----------------------------------------------------------------|
Db|--5-5-5-5--3-3-3-3--7-7-7-7--5-5-5-5--2-2-2-2--3-3-3-3--2-2-2-2--5-5-5-5-|
Ab|--3-3-3-3--3-3-3-3--7-7-7-7--5-5-5-5--2-2-2-2--3-3-3-3--2-2-2-2--5-5-5-5-|
Eb|-----------1-1-1-1--5-5-5-5--3-3-3-3--0-0-0-0--1-1-1-1--0-0-0-0--3-3-3-3-|
Czy bardziej wydajne byłoby przechowywanie tych danych jako dużego fragmentu, czy też dzielenie ich i przechowywanie „na podstawie notatek”?
As a use case:
User changes first chord from: to:
Eb|--- Eb|---
Bb|--- Bb|---
Gb|--5 Gb|--4
Db|--5 Db|--4
Ab|--3 Ab|--2
Eb|--- Eb|---
Jeśli przechowuję go jako blok, kod do manipulowania kartami musiałby być znacznie bardziej złożony. Jeśli zapiszę to notatka po notatce, dostęp do bazy danych będzie musiał być znacznie większy. Która metoda jest bardziej wydajna? Potencjalnie wielu użytkowników będzie modyfikować dane. Chcę najlepiej działającą aplikację internetową. Będę używać MySQL, jeśli w ogóle wpłynie to na odpowiedź.
database-design
Gabe Willard
źródło
źródło
Odpowiedzi:
Liczba operacji będzie w obu przypadkach taka sama. Wykonujesz jedno zapytanie, aby uzyskać wszystkie akordy utworu, a następnie wykonujesz jedną aktualizację za każdym razem, gdy wprowadzana jest zmiana. Różnica polega na wielkości aktualizacji. Dzięki metodzie blokowania musisz zapisać cały utwór za każdym razem, gdy zmieniasz akord. Dzięki indywidualnej metodzie Twoje aktualizacje będą mniejsze i prawdopodobnie ogólnie bardziej wydajne, choć różnica może być nieznaczna.
Inną rzeczą do rozważenia jest to, że metoda notowania za notatką jest bardziej znormalizowana, co oznacza, że będziesz mieć więcej opcji zapytań dostępnych po drodze, jeśli z niej skorzystasz. Na przykład początkujący mogą odfiltrowywać akordy, których nie znają podczas wyszukiwania utworu do nauki, lub możesz zezwolić na wyszukiwanie na podstawie akordów otwierających, jeśli ktoś nie zna tytułu utworu. Nawet jeśli nie planujesz teraz tych funkcji, zmiana bazy danych będzie bardzo uciążliwa, jeśli chcesz czegoś takiego później.
źródło
Ogólnie rzecz biorąc, większa normalizacja jest dobra z kilku powodów:
Wady ( dobrze opisane tutaj ) obejmują:
Sugerowałbym rozpoczęcie od bardziej znormalizowanego projektu i rozważenie denormalizacji, jeśli napotkasz problemy z wydajnością.
źródło
Spraw, aby Twoje miejsce do przechowywania było najłatwiejsze w obsłudze i wystarczająco twarde, aby je zepsuć. Idź z rozsądnie znormalizowanym schematem. Jeśli to możliwe, zastosuj schemat, który nie wyklucza innych zastosowań niż te, które będą potrzebne w pierwszym wydaniu.
Jeśli wszystko, czego potrzebujesz, to wyświetlić tabulatory dla konkretnego utworu, możesz przechowywać wiele 6-krotek w DB zorientowanej na dokumenty (jak MongoDB), pobierając je jako jeden dokument.
W RDBMS zapisałbym go podobnie, w tabeli takiej jak ta:
RDBMS są dobre w prostych zapytaniach, takich jak te potrzebne do wyświetlenia utworu:
Za pomocą
limit
ioffset
możesz wyświetlać fragmenty utworu.Później łatwo będzie połączyć
tab_column
się z tabelą, która zawiera listę nazwanych akordów, jeśli rozpoznasz akord.Jest to prawdopodobnie najprostszy możliwy schemat; Zacznę od tego.
źródło