Dispersa dados: armazenamento eficiente e recuperação de um RDBMS

votos
4

Eu tenho uma tabela que representa os valores de métricas arquivo de origem em todo revisões de projeto, como o seguinte:

Revision FileA FileB FileC FileD FileE ...
1           45     3    12   123   124
2           45     3    12   123   124
3           45     3    12   123   124
4           48     3    12   123   124
5           48     3    12   123   124
6           48     3    12   123   124
7           48    15    12   123   124

(A visão relacional dos dados acima é diferente Cada linha contém as seguintes colunas:.. Revisão, FileID, Valor Os arquivos e as suas revisões a partir do qual os dados são calculados são armazenados em repositórios Subversion, por isso estamos tentando representar o repositório de estrutura em um esquema relacional).

Não pode ser de até 23750 arquivos em 10000 revisões (este é o caso para o ImageMagick programa de desenho). Como você pode ver, a maioria dos valores são os mesmos entre revisões sucessivas, para que os dados úteis da tabela é bastante escassa. Eu estou procurando uma maneira de armazenar os dados que

  • evita a replicação e utiliza eficientemente o espaço (actualmente a representação não-esparso requer 260 GB (dados índice +) para a menos de 10% dos dados que deseja armazenar)
  • me permite recuperar de forma eficiente os valores para uma revisão específica utilizando uma consulta SQL (sem loop explicitamente através de revisões ou arquivos)
  • me permite recuperar de forma eficiente a revisão para um valor de métrica específica.

Idealmente, a solução não deve depender de um determinado RDBMS e deve ser compatível com hibernação . Se isso não for possível, eu posso viver com o uso de Hibernate, MySQL ou funcionalidades específicas do PostgreSQL.

Publicado 05/01/2009 em 16:04
fonte usuário
Em outras línguas...                            


1 respostas

votos
5

Isto é como eu poderia modelá-lo. Eu deixei a tabela de revisões e mesa de arquivos como aqueles deve ser bastante auto-explicativo.

CREATE TABLE Revision_Files
(
    start_revision_number   INT NOT NULL,
    end_revision_number     INT NOT NULL,
    file_number             INT NOT NULL,
    value                   INT NOT NULL,
    CONSTRAINT PK_Revision_Files PRIMARY KEY CLUSTERED (start_revision_number, file_number),
    CONSTRAINT CHK_Revision_Files_start_before_end CHECK (start_revision_number <= end_revision_number)
)
GO

Para obter todos os valores para os arquivos de uma revisão em particular que você poderia usar a seguinte consulta. Juntando-se à mesa de arquivos com uma associação externa iria deixá-lo começar aqueles que não têm nenhum valor definido para essa revisão.

SELECT
    REV.revision_number,
    RF.file_number,
    RF.value
FROM
    Revisions REV
INNER JOIN Revision_Files RF ON
    RF.start_revision_number <= REV.revision_number AND
    RF.end_revision_number >= REV.revision_number
GO

Supondo que eu entendi o que você quer em seu terceiro ponto, isso lhe permitirá obter todas as revisões para o qual um arquivo particular tem um certo valor:

SELECT
    REV.revision_number
FROM
    Revision_Files RF
INNER JOIN Revisions REV ON
    REV.revision_number BETWEEN RF.start_revision_number AND RF.end_revision_number
WHERE
    RF.file_number = @file_number AND
    RF.value = @value
GO
Respondeu 05/01/2009 em 16:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more