Pergunta

Uma resposta a uma pergunta da mina no design DB sugeriu algo chamado herança única tabela. Eu fiz um pouco de pesquisa sobre isso, mas eu não consigo encontrar essa informação muito clara sobre isso.

Basicamente o que eu parecem entender com isso é que você tem uma grande mesa com todos os campos na mesma e também um campo de tipo - e, em seguida, sua camada ORM usa o campo Tipo para lhe dar diferentes visões de objeto. Isso está correto?

Mais importante ainda, é única tabela herança uma técnica de design 'aprovado' banco de dados? Por isso quero dizer que é 'sensível' para usá-lo? É também seguro para usá-lo, ou não causar problemas?

A outra questão é como isso funciona bem em trilhos? Eu encontrei algumas referências a ele a partir de trilhos - mas não causa problemas, fazendo as coisas da maneira não convencional

Qualquer ajuda muito apreciado.

Foi útil?

Solução

É uma boa idéia? Depende. Ele quebra Normalização em que uma tabela não tem um único propósito. O que acontece quando você estender a classe base para a enésima vez? Você terá que adicionar colunas para a tabela. A maioria dos bancos de dados modernos não têm um problema com isso, como você pode modificar a tabela, mas o que dizer de refatoração e remoção de uma classe. Agora você tem colunas que não têm um propósito.

Uma regra de ouro - se a maioria de projeto foi elaborado, é provavelmente seguro de usar. Se o projeto está mudando com freqüência - você tem outras questões e você precisa bloquear seus casos de uso / necessidades dos utilizadores. (Sim, não realmente XP amigável)

Eu não sei sobre os efeitos Rails.

Outras dicas

STI é uma maneira de lidar com uma incompatibilidade entre o pensamento a objetos e orientada para o banco de dados. Ele permite que uma representação razoável da informação dentro da base de dados e uma representação diferente dentro do modelo de objeto.

Por exemplo, eu tenho uma aplicação onde cada um dos meus produtos contém um ou mais taxas, cada calculada de forma ligeiramente diferente. Dentro do meu modelo de objeto Quero ter subclasses de uma classe Fee, cada um dos quais sabe como calcular si. Eu realmente não quero ter uma tabela por tipo de taxa que: assim que eu criar Fee como a classe base e taxas como a tabela, que contém a união de todos os campos necessários em todos os sub-tipos, além de um "tipo" coluna cujo valor corresponde ao nome da sub-classe relevante. ActiveRecord lida com o encanamento depois.

Em suma, Herança de Tabela Única (STI) é um padrão de design que permite um mapeamento das relações de herança OOP para o banco de dados. Se você definir quaisquer subclasses de seus objetos de modelo ActiveRecord, então você deve considerar STI.

STI é (originalmente?) Documentado em 'Padrões de Enterprise Application Architecture' livro de Martin Fowler, e também é descrito no canônica Rails livro de DHH 'Agile Web Development with Rails' (seção 18.4, eu acho.) I encaminhá-lo para esses livros porque eles fornecem uma explicação muito melhor do que eu poderia esperar fazer neste espaço.

Eu discordo fortemente com o sentimento expresso pelo www.matthewpaulmoore.com (ligados por robintw neste segmento), que STI é intrinsecamente uma coisa má. Esta parece ser uma visão um pouco ingênuo que desconta o uso de herança OOP. Eu tenho usado STI para criar algumas soluções elegantes em Rails, mas você pode abusar de qualquer padrão de design, suponho.

referência. Ele permite que uma única tabela para armazenar vários objetos que têm uma classe base comum.

Ruby on Rails utiliza uma biblioteca chamada Active Record . Este é um quadro comum Ruby que suporta STI.

I apenas pode falar do (novo) perspectiva ADO estrutura de entidades, que inclui a funcionalidade de mesa-per-tipo (TPT).

Aqui é um boas série de posts que introduzem os conceitos fundamentais (usando o Entity Framework) e há um papel MSDN sobre ele também aqui .

Há também parece ser alguma orientação ao usar nHibernate para TPT, ele está localizado aqui .

Há este link que explica table-per-tipo no SQL Server . Isto parece ter um resumo boa bonita e introdução ao conceito.

Eu não tenho certeza qual o impacto que isso teria sobre Rails.

Eu vi http: //www.matthewpaulmoore.com/articles/1276-ruby-on-rails-code-quality-checklist#sti que sugere é uma má idéia.

Geralmente eu achar que é útil, mas eu encontrei alguns bugs

O exemplo nesse link pode fornecer uma imagem útil de como você pode usá-lo.

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