Ter um tipo de dados genérico para uma coluna da tabela de banco de dados é uma prática “boa”?

5

Estou trabalhando em um projeto PHP em que algum objeto (membro de classe) pode conter diferentes tipos de dados. Por exemplo:

class Property {
    private $_id;     // (PK)
    private $_ref_id; // the object reference id (FK)
    private $_name;   // the name of the property
    private $_type;   // 'string', 'int', 'float(n,m)', 'datetime', etc.
    private $_data;   // ...

    // ..snip.. public getters/setters
}

Agora, preciso executar alguma persistência nesses objetos. Algumas propriedades podem ser um tipo de dados de texto, mas nada maior do que a varchar pode conter. Além disso, mais tarde, preciso realizar pesquisas e classificar.

É uma boa prática usar uma única tabela de banco de dados para isso (ou seja, há um impacto de desempenho não desprezível)? Se for "aceitável", qual poderia ser o tipo de dados para a coluna data ?

    
por Yanick Rochon 12.10.2012 / 01:42
fonte

2 respostas

3

Is it a good practice to use a single database table for this

Se você precisa de 1 tabela ou mais, é um fator da dependência das colunas pertencentes à tabela para o PK, conforme a regra de normalização. A amostra que você mostra sugere, embora não muito clara, que esse é o caso.

Você pode decompor uma única tabela lógica em duas tabelas físicas se tiver um número muito grande de colunas ou se seus dados puderem ser particionados logicamente para obter desempenho, no entanto, isso não é mais necessário com novos sistemas de banco de dados, pois você pode usar o banco de dados recursos como Partições para cuidar disso.

Para obter desempenho, você precisa definir índices e decidir quais colunas devem participar de cada índice, bem como a sequência de colunas em cada um. Este é o caso se você tiver dados grandes com acesso freqüente. Os índices são mais lentos para colunas grandes do que para outros tipos de colunas, como int. Além disso, um índice pode ser ignorado se você executar determinadas consultas LIKE.

what could be the data type for the data column?

Não está claro o que a coluna de dados em seu exemplo conterá. No entanto, um tipo de dados VARCHAR ou TEXT pode fazer. Para uma comparação no desempenho entre os dois tipos, você pode querer verificar Texto vs Varchar e < href="https://dba.stackexchange.com/questions/386/what-is-the-difference-between-mysql-varchar-and-text-data-types"> dba.stackexchange-Text vs Varchar .

    
por 12.10.2012 / 02:27
fonte
1

Não, na verdade é a pior prática possível. Eu estou exagerando.

Você deve usar colunas separadas para cada elemento em $ data para maximizar o poder do banco de dados. Escrever consultas de pesquisa, classificar consultas, etc, em uma coluna data seria um pesadelo de complexidade, enquanto esses tipos de consultas são fáceis em uma tabela de banco de dados 'normalizada'.

Se a sua propriedade $ data puder conter potencialmente todos os tipos de pares de valores key = > que você não pode prever, então você deve procurar em uma estrutura de tabela EAV para sua tabela de banco de dados. Se as chaves (as propriedades) em sua variável $ data forem razoavelmente constantes, você poderá usar uma tabela de banco de dados regular e regular.

De qualquer maneira, eu recomendo strongmente que você não coloque $ data em uma única coluna data em um banco de dados. Isso destruiria quase completamente todas as vantagens de usar um banco de dados em primeiro lugar. Você também pode armazenar seus dados em um arquivo de texto.

Em relação ao desempenho ... novamente, você negou tudo o que é útil sobre um banco de dados, então seu desempenho será horrível. E você passará horas escrevendo consultas complicadas que levariam um minuto para escrever se você tivesse um banco de dados normalizado. Espero que você não tenha continuado com sua coluna data . O ponto principal de uma base data é facilitar a localização e a manipulação de dados!

    
por 24.08.2013 / 02:34
fonte

Tags