Estou criando um aplicativo da web que manipula dados bastante complexos: abas de guitarra.
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-|
Seria mais eficiente para o desempenho armazenar esses dados como um bloco grande ou dividi-los e armazená-los "nota por nota"?
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|---
Se eu o armazenar como um bloco, o código para manipular as guias terá que ser muito mais complexo. Se eu guardar nota por nota, o banco de dados terá que ser acessado muito mais. Qual método é mais eficiente? Potencialmente, muitos usuários modificarão os dados. Quero o melhor aplicativo da web. Eu usarei o MySQL se isso afetar a resposta.
database-design
Gabe Willard
fonte
fonte
Respostas:
O número de operações será o mesmo de qualquer maneira. Você faz uma consulta para obter todos os acordes de uma música e faz uma atualização sempre que uma alteração é feita. A diferença está realmente no tamanho das atualizações. Com o método de bloqueio, você deve salvar a música inteira toda vez que alterar um acorde. Com o método individual, suas atualizações serão menores e provavelmente mais eficientes no geral, embora a diferença possa ser insignificante.
Outra coisa a considerar é que o método nota por nota é mais normalizado, o que significa que você terá mais opções de consulta abertas no futuro, se usá-lo. Por exemplo, iniciantes podem filtrar acordes que não conhecem ao pesquisar uma música para aprender, ou você pode permitir a pesquisa com base nos acordes de abertura, se alguém não conhece o título da música. Mesmo que você não planeje esses recursos agora, será muito difícil alterar seu banco de dados se você quiser algo assim mais tarde.
fonte
De um modo geral, mais normalização é boa por vários motivos:
As desvantagens ( descritas bem aqui ) incluem:
Eu sugeriria começar com um design mais normalizado e considerar apenas a desnormalização se você tiver problemas de desempenho.
fonte
Torne seu armazenamento mais fácil de trabalhar e difícil o suficiente para estragar. Vá com um esquema razoavelmente normalizado. Siga um esquema que não exclua outros usos que você não precisará no seu primeiro release, se possível.
Se tudo o que você precisa é mostrar guias para uma música em particular, você pode armazenar muitas 6-tuplas em um banco de dados orientado a documentos (como o MongoDB), buscando-as como um único documento.
Em um RDBMS, eu o armazenaria de maneira semelhante, em uma tabela como esta:
RDBMSes são bons em consultas simples como a necessária para mostrar uma música:
Usando
limit
eoffset
, você pode mostrar partes de uma música.Mais tarde, será fácil vincular
tab_column
a uma tabela que lista acordes nomeados, se você puder reconhecer um acorde.Este é provavelmente o esquema mais simples possível; Eu começaria com isso.
fonte