estrutura DB ideal para entidade campos adicionais

votos
6

Eu tenho uma tabela em um DB (Postgres base), que age como uma superclasse na programação orientada a objeto. Ele tem um 'tipo' coluna que determina, que colunas adicionais devem estar presentes na tabela (propriedades sub-classe). Mas eu não quero a tabela para incluir todas as colunas possíveis (todas as propriedades de todos os tipos possíveis).

Então eu decidi fazer uma tabela, containg a 'chave' e colunas 'valor' (ie 'filename' = '/ arquivo', ou 'some_value' = '5'), que contêm qualquer possível propriedade do objeto, não incluído na tabela da superclasse. E também fez uma tabela relacionada para conter os valores disponíveis 'key'.

Mas há um problema com tal arquitetura - a coluna 'valor' deve ser de um tipo de dados, por padrão, para ser capaz de conter qualquer coisa. Mas eu não acho que a conversão de e para cordas é uma boa decisão. Qual é a melhor maneira de contornar essa limitação?

Publicado 08/12/2008 em 23:40
fonte usuário
Em outras línguas...                            


8 respostas

votos
0

A única solução (mantendo o seu strucure) é ter tabelas separadas:

create table IntProps(...);
create table StringProps(...);
create table CurrencyProps(...);

Mas eu não acho que isso é uma boa idéia ...

Respondeu 08/12/2008 em 23:44
fonte usuário

votos
0

Uma abordagem comum é ter a tabela de chave-valor conter várias colunas, uma para cada tipo de dados, ou seja, StringValue, DecimalValue, etc.

Só sei que você está trocando queryability e desempenho para um esquema de banco de dados que você não precisa de mudar. Você também pode considerar mapeamento ORM ou um banco de dados objeto.

Respondeu 08/12/2008 em 23:45
fonte usuário

votos
2

Como sobre isso em vez ... cada sub-tipo tem sua própria mesa DB. E base / Super tabela de só tem uma coluna varchar que contém o nome da tabela DB o sub-tipo. Então você pode ter algo como isto ...

Entity
------
ID
Name
Type
SubTypeName   (value of this column will be 'Dog')


Dog
---
VetName
VetNumber
etc

Se você não quer que seus nomes (sub-) da tabela a ser valores varchar na tabela base, você também pode apenas ter uma mesa SubType cuja chave principal será na tabela de base.

Respondeu 08/12/2008 em 23:45
fonte usuário

votos
0

Você poderia ter uma tabela de chave / valor por tipo. A tabela disponível seria necessário para codificar a disponibilidade de uma chave / tipo par específico para apontar para a tabela de chave / valor digitado corretamente.

Esta parece ser uma arquitetura altamente ineficiente para uma linha baseada bancos de dados relacionais no entanto.

Talvez você deve dar uma olhada em uma coluna orientada banco de dados relacional?

Respondeu 08/12/2008 em 23:47
fonte usuário

votos
10

O projeto que você está experimentando é uma variação do atributo de entidade Valor , e ele vem com um monte de problemas e ineficiências. Não é uma boa solução para o que você está fazendo, exceto como último recurso.

O que poderia ser uma solução melhor é o que fallen888 descreve: criar uma tabela "subtipo" para cada um de seus subtipos. Isso é bom se você tem um número finito de subtipos, que soa como o que você tem. Em seguida, seus atributos específicos do subtipo pode ter tipos de dados, e também uma NOT NULLrestrição se for o caso, o que é impossível se você usar o design EAV.

Uma fraqueza restante do projeto subtipo-mesa é que você não pode impor que existe uma linha na tabela de subtipo só porque a principal linha na tabela de superclasse diz que deveria. Mas isso é uma fraqueza mais suave do que as introduzidas pelo projeto EAV.

edit: Quanto à sua obter informações adicionais sobre os comentários-to-any-entidade, sim, este é um padrão muito comum. Cuidado com uma solução quebrado chamado de "associação polimórfica", que é uma técnica que muitas pessoas usam nesta situação.

Respondeu 09/12/2008 em 00:45
fonte usuário

votos
0

Obrigado pelas respostas. Vou explicar um pouco mais especificamente o que eu preciso. Há uma necessidade de programar um site, blog + fórum, e eu estive olhando a estrutura WordPress DB .

Há uma forte necessidade da capacidade de colocar comentários a qualquer tipo de 'objeto', como uma entrada de blog, ou um anexo de arquivo de vídeo para ele. A estrutura DB acima de ser muito fácil de escalar e cumprir todas as nossas necessidades foi a razão da sua escolha.

Mas isso não é tarde para mudar isso, fazer com que esta está em fase de engenharia cedo. Também o nosso modelo cheira agora como um DB completamente árvore hierarquia baseada. Por agora eu vou aceitar Bill Karwin de e fallen888 respostas , mas talvez eu estou indo em uma direção totalmente errado?

Respondeu 09/12/2008 em 12:07
fonte usuário

votos
0

sobre o usuário ser capaz de adicionar um novo campo à tabela:

Admiro todas essas pessoas fazendo comentários.

Eu costumava estar interessado neste tipo de coisa há alguns anos, mas ter escrito pouco código recentemente (para além de um pouco de PHP e MySQL).

Eu acho que é bom se você quiser manter-se ir - você pode acabar com algo novo.

Desculpe a derramar a água fria sobre o esquema - eu admiro seus esforços. Minha opinião pessoal é que, se você vai suficientemente longe nesta direção, você vai acabar com um sistema que interpreta mais da linguagem natural do SQL faz. (Por volta de 1970, SQL foi na verdade escrita Sequel, e ele realmente ficou para "linguagem de consulta Inglês estruturado", mas depois que eles padronizado que na década de 1970 - Eu acho que alguém disse que a Oracle foi a primeira implementação comercial, 19079, o "Inglês" tem caiu fora, porque eu acho que eles decidiram que era apenas um pequeno subconjunto de Inglês.

Eu tenho que correr fora do vapor nesta área, porque eu não tenho um emprego. Sem um trabalho fácil que paga as contas, onde eu possa experimentar com essas idéias, é um pouco difícil de se concentrar nessa área.

Melhores desejos a todos.

Respondeu 31/01/2009 em 15:34
fonte usuário

votos
0

desculpe, eu escrevi 19079 acima, eu quis dizer o ano de 1979. A Oracle tem o seu primeiro contrato escrevendo um banco de dados para a CIA.

Respondeu 31/01/2009 em 15:35
fonte usuário

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