Seguir composição sobre herança como composição se presta bem a bancos de dados relacionais .
Digamos que você queira receber todas as mensagens curtas:
SELECT * FROM Message INNER JOIN ShortMessage ON ShortMessage.message = Message.id
Digamos que você queira receber todas as mensagens curtas e e-mails:
SELECT * FROM Message
LEFT OUTER JOIN ShortMessage ON ShortMessage.message = Message.id
LEFT OUTER JOIN Email ON Email.message = Message.id
Isso efetivamente criará um conjunto de resultados muito parecido com a sua primeira opção, com muitos campos nulos.
Portanto, a ideia básica aqui é que uma mensagem potencialmente tem um e-mail . Dependendo de você definir ou não Email.message
como UNIQUE
, você pode verificar se há no máximo um e-mail correspondente a uma mensagem. Esta configuração (como todas as alternativas que você propôs) permite que uma única mensagem tenha múltiplos transportes diferentes, o que é realmente concebível no mundo real.
Vantagens dessa abordagem:
- (acima de 1 e 2) Seu banco de dados está normalizado, o que geralmente fornece coisas de graça
- se você quiser adicionar novos tipos de transporte sem alterar as tabelas existentes (não é algo que você deseja fazer em um banco de dados enorme)
- Você não precisa armazenar cargas de nulos
-
(mais de 3) Você pode consultar todas as mensagens em uma consulta, assim você pode obter todas as mensagens para um destinatário específico, assim:
SELECT IFNULL(Email.body, ShortMessage.body) as text FROM Message LEFT OUTER JOIN ShortMessage ON ShortMessage.message = Message.id LEFT OUTER JOIN Email ON Email.message = Message.id WHERE Email.recepient = "[email protected]" OR ShortMessage.recipient = "01189998819991197253"
E voilà, você tem uma lista de todos os textos enviados para john doe.
No entanto, se você estiver usando um ORM, poderá usar o poder para realizar consultas como essa. Eu não tenho nenhuma experiência prática com c #, mas do meu entendimento como um estranho, Linq se presta bem a acessando bancos de dados relacionais para o que eles são , em vez de tentar encaixar a semântica de objetos em registros (o que sempre faz você atingir uma parede muito espessa em algum ponto da estrada).