Pergunta

Eu estou trabalhando em um aplicativo que será usado como uma estrutura extensível para outras aplicações.

Uma das classes fundamentais é chamado de nó, e nós temos de conteúdo. As tabelas SQL semelhante a este:

TABLE Node (NodeId int, .... etc)

TABLE NodeContentRelationship (int NodeId, corda ContentType, ContentID int)

Caberá aos desenvolvedores que se estende a aplicação para criar os seus próprios tipos de conteúdo.

É claro que isso é ruim do ponto relação de banco de dados de vista, uma vez que não é possível adicionar uma relação de chave estrangeira para NodeContentRelationship.ContentId, embora é a coluna de chave estrangeira.

No entanto, a solução é bastante simples e poderoso, então eu estou relutante em mudá-lo.

O que você acha - eu estou em um mundo de dor na pista ?

Foi útil?

Solução

Por que é impossível NoteContentRelationship.ContentId conjunto como uma chave estrangeira? Você pode facilmente usar um modelo de herança relacional com um Content tabela representando uma classe base abstrata, e várias tabelas AnimalContent, CarContent, etc. representando classes derivadas.

Outras dicas

Cuidado com o Inner Plataforma Efeito .

Se você está tentando construir uma 'estrutura extensível', que permite aos desenvolvedores para armazenar dados de diferentes 'tipos de conteúdo' e relacioná-los uns aos outros de uma forma genérica, você pode achar que outros já têm resolvido este problema .

Esta me parece uma variação sobre EAV projeto (Entity, Atributo, Value).

As vantagens e desvantagens de design de EAV foram amplamente documentados.

Aqui está uma descrição de EAV a partir de um ponto de vista compreensivo:

http://ycmi.med.yale.edu /nadkarni/Introduction%20to%20EAV%20systems.htm

E aqui está uma de um ponto de vista hostil:

http: // tonyandrews .blogspot.com / 2004/10 / otlt-and-eav-dois-grande-design-mistakes.html

Esteja ciente da desvantagem de EAV antes de se comprometer milhares de horas-homem para despejar dados nela. É enormemente sedutora para programadores, mas pode se tornar o pesadelo de um gerenciador de dados.

Você está em um mundo de dor abaixo da estrada se você quiser realmente informar sobre esses dados. Você só fez isso muito, muito mais difícil escrever junta e tal. A falta de restrições é ruim, mas o trabalho extra necessário em consultas é (IMHO) pior.

No entanto, se você quiser outros desenvolvedores para ser capaz de estender os dados do sistema e armazenar no banco de dados, mas não ser capaz de mudar o esquema de banco de dados, pode não ser uma escolha. Nesse caso, a resposta é minimizar o quanto fica armazenado desta forma. Você também pode acelerá-lo um pouco, substituindo ContentType com um ContentTypeId definido em outra tabela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top