Digamos que eu tenha uma entidade chamada Software e dois subtipos FreeSoftware e NonFreeSoftware. A entidade NonFreeSoftware possui atributos como data da compra, fornecedor, etc. A entidade FreeSoftware possui atributos como licença, URL do código fonte etc.
Portanto, se eu quiser modelar outra entidade, o OperatingSystem, como devo fazê-lo? Existe uma relação "é uma" com o Software, mas uma relação "com / ou" com o FreeSoftware e o NonFreeSoftware.
Acho que estou perdendo algo na maneira como estou analisando essa hierarquia.
Respostas:
A maneira de gerenciar isso é que seus subtipos devem ser determinados pelo super-tipo (ou seja, a PK do sub-tipo também é uma FK do sub-tipo ao super-tipo.)
O desafio é entender se algo é verdadeiramente mutuamente exclusivo ou não. Os atributos dos subtipos devem aplicar-se apenas a esses subtipos, mas pode ser que alguns subtipos sejam mutuamente exclusivos e outros não.
Se você tiver alguns subtipos mutuamente exclusivos, poderá usar um atributo de particionamento no supertipo para indicar qual dos (dois ou mais) subtipos mutuamente exclusivos se aplica. Esse atributo de particionamento pode ser usado com restrições ou gatilhos para impor a exclusividade mútua.
Se você tiver subtipos que não são mutuamente exclusivos, eles poderão existir sem usar nenhum atributo de particionamento.
Considere este modelo de dados:
Você tem três supertipos, mas os tipos
FREE_SOFTWARE
eNON-FREE_SOFTWARE
são mutuamente exclusivos, com base noSOFTWARE.free_not_free
atributo de particionamento de sinalizador. Qualquer parte do software também é potencialmente umaOPERATING_SYSTEM
, independentemente de ser ou não gratuita.fonte
Por que o OperatingSystem seria uma entidade completamente nova? Ele deve se enquadrar no software, pois é isso que é. E um sistema operacional (se de código fechado) teria uma data de compra, fornecedor etc. O sistema operacional de código aberto teria uma licença, URL do código-fonte etc.
Eu recomendaria um relacionamento para
SoftwareType
algo assim. É quando você pode / deve especificar se o Software é um sistema operacional, aplicativo ou qualquer outro tipo de software suportado.fonte