Modelagem de dados relacionais para subtipos
Estou aprendendo o Modelo Relacional e modelagem de dados.
E tenho alguma confusão em minha mente em relação aos subtipos.
Eu sei que a modelagem de dados é um processo iterativo e existem muitas maneiras diferentes de modelar as coisas.
Mas não sei como escolher entre opções diferentes.
Suponha que desejemos modelar opartículas (molécula, átomo, próton, nêutron, elétron, ...).
Vamos ignorar o Quark e outras partículas para simplificar.
Como todas as partículas do mesmo tipo se comportam da mesma forma, não vamos modelar as partículas individuais.
Em outras palavras, não armazenaremos todos os átomos de hidrogênio.
Em vez disso, armazenaremos hidrogênio, oxigênio e outros tipos de átomos.
O que vamos modelar são, na verdade, tipos de partículas e relacionamentos entre eles.
Eu estou usando a palavra "tipo" descuidadamente.
Um átomo de hidrogênio é uma instância. O hidrogênio é um tipo. O hidrogênio também é um tipo de átomo.
Sim, há uma hierarquia de tipos envolvidos. E estamos ignorando o nível mais baixo (partículas individuais).
Eu posso pensar em várias abordagens para modelá-las.
1. Uma tabela (relação, entidade) para cada tipo de coisa (tipos de partículas).1.1 A primeira abordagem que me vem à cabeça.Proton (Próton)
Nêutron (Nêutron)
Elétron (Elétron)
Átomo (Átomo)
Atom_Proton (Átomo, Próton, Quantidade)
Atom_Neutron (Átomo, nêutron, quantidade)
Atom_Electron (Átomo, elétron, quantidade)
Molécula (Molécula)
Molecule_Atom (Molécula, Átomo, Quantidade)
Átomo (Atom, quantidade de prótons, quantidade de nêutrons, quantidade de elétrons)
Molécula (Molécula)
Molecule_Atom (Molécula, Átomo, Quantidade)
Nesse modelo simplificado, fatos sobreProton estão perdidos.
2. Tudo em uma tabela, com tabelas associativas representando relacionamentos entre elas.2.1 uma tabela associativa para cada relacionamentoPartícula (Partícula)
Atom_Proton(Partícula, partícula, quantidade de prótons)
Atom_Neutron(Partícula, Partícula, Quantidade de Nêutrons)
Atom_Electron(Partícula, partícula, quantidade eletrônica)
Molecule_Atom (Partícula, Partícula, AtomQuantity)
Partícula (Partícula)
ParticleComposition (Partícula, Partícula, Quantidade)
Essa simplificação não perde nada. Eu acho melhor.
Mas se houver fatos específicos paraAtom_Proton/Atom_Neutron/Atom_Electron, 2.1 pode ser melhor.
Partícula (Partícula)
Atom_Proton (Partícula, Partícula, outros atributos)
Atom_Neutron (Partícula, Partícula, outros atributos)
Atom_Electron (Partícula, Partícula, outros atributos)Molecule_Atom (Partícula, Partícula, outros atributos)
ParticleComposition(Partícula, Partícula, Quantidade, outros atributos)
Nesta abordagem, atributos comuns sobre composição de partículas sãoParticleComposition,
enquanto atributos especiais sobre a composição de partículas estão em tabelas especiais.
Partícula (Partícula)
Proton (Partícula, outros atributos)
Nêutron (Partícula, outros atributos)
Elétron (Partícula, outros atributos)
Átomo (Partícula, outros atributos)
Molécula (Partícula, outros atributos)
Atom_Proton (Partícula, partícula, quantidade de prótons)
Atom_Neutron (Partícula, Partícula, Quantidade de Nêutrons)
Atom_Electron (Partícula, partícula, quantidade eletrônica)
Molecule_Atom (Partícula, Partícula, AtomQuantity)
Partícula (Partícula)
Átomo (Partícula, quantidade de prótons, quantidade de nêutrons, quantidade de elétrons)
Molécula (Partícula, outros atributos)
Molecule_Atom (Partícula, Partícula, AtomQuantity)
É mais simples, mas as informações sobreProton/Nêutron/Elétron é perdido como no 1.2.
3.3 Podemos mudar o nome deMolecule_Atom para torná-lo mais genérico.Partícula (Partícula)
Átomo (Partícula, quantidade de prótons, quantidade de nêutrons, quantidade de elétrons)
Molécula (Partícula, outros atributos)
ParticleComposition (Partícula, Partícula, Quantidade)
Parece 2.2, com tabelas adicionais para subtipos (Átomo, Molécula)
Parece 2.2 é um caso especial de 3.3.
Partícula (Partícula)
Proton (Partícula, outros atributos)
Nêutron (Partícula, outros atributos)
Elétron (Partícula, outros atributos)
Átomo (Partícula, outros atributos)
Molécula (Partícula, outros atributos)
ParticleComposition (Partícula, Partícula, Quantidade, outros atributos)
Atom_Proton (Partícula, Partícula, outros atributos)
Atom_Neutron (Partícula, Partícula, outros atributos)
Atom_Electron (Partícula, Partícula, outros atributos)
Molecule_Atom (Partícula, Partícula, outros atributos)
Parece queAtom_Proton, Atom_Neutron, Atom_Electron eMolecule_Atom pode ser pensado comosubtipos doParticleComposition.
Essa abordagem é a mais complexa, contém muitas tabelas, mas cada tabela tem seu papel.
QuestõesAlgum dos projetos acima infringe as regras do Modelo Relacional?Qual abordagem é a melhor? Depende de como pensamos sobre os dados? Depende dos requisitos?Se depender dos requisitos, devemos escolher o design mais simples a princípio e depois torná-lo mais genérico para acomodar novos requisitos?
Embora os modelos de dados resultantes compartilhem muitas semelhanças, o design inicial pode influenciar anomeação das tabelas / colunas e osdomínios das teclas são diferentes.
A alteração de chaves pode ter maior impacto no sistema, portanto, pode não ser fácil evoluir de um design simples para um genérico.
O que você acha?
PS: Esse pode não ser um exemplo apropriado e as soluções podem ser problemáticas, e pode haver mais variações nas abordagens, mas você pode entender o assunto com esperança.
Se você tiver projetos melhores, compartilhe comigo.
Inicialmente, eu estava tentando modelar opartículas Porque
Eu acho que existem relacionamentos de digitação entre eles, que é exatamente o que estou procurando.Eles são bem compreendidos (?) Pelas pessoas.É um bom exemplo de como as pessoas entendem o mundo.Aqui está a foto em minha mente.
Não afirmei isso claramente porque também não estava muito claro sobre o que estava tentando modelar.
Em primeiro lugar, pensei que Atom fosse o pai de Proton / Neutron / Electron, e Molecule seja o pai de Atom.
Então eu percebi que isso é sobre composição, não sobre subtipagem, e não sobreHierarquia de tipos.
Estou pensando em tipos há algum tempo, bem como em agrupamentos e classificações.
Aqui está uma citação de "SQL e teoria relacional":
Então, o que é um tipo, exatamente? Em essência, éum conjunto finito de valores nomeado ─ todos os valores possíveis de algum tipo específico: por exemplo, todos os números inteiros possíveis, todas as cadeias de caracteres possíveis, todos os números possíveis de fornecedores, todos os documentos XML possíveis ou todas as relações possíveis com um determinado cabeçalho (e assim por diante).
As pessoas cunharam o nome "Inteiro" para representar o conjunto de números inteirosvalores.
Na verdade, as pessoas cunharam conceitos e nomes para identificar coisas, agrupando coisas para que possamos entender / modelar o mundo.
O próton é um conjunto de prótons reais, o hidrogênio é um conjunto de átomos de hidrogênio e assim por diante.
Nesse sentido, as partículas reais permanecem nonível mais baixo da hierarquia de tipos.
Eu estava tentando modelar todas as partículas no começo, mas depois fiquei presa porque
Decidi ignorar as partículas reais e modelar os tipos.
Quando dizemos "uma molécula é composta por átomos", significa "uma molécula real de H2O é composta por dois átomos reais de hidrogênio e um átomo de oxigênio", também significa "qualquer (tipo de) molécula é composta por (alguns tipos de) átomos ".
Em vez de declarar todos os fatos sobre as partículas reais, podemos apenas declarar fatos sobre os tipos de partículas.
Esse é o benefício que obtemos ao agrupar coisas e nomes cunhados (tipos).
A hierarquia pode ser traduzida em definições de conjunto.
Segundo nível - tipos acima das partículas reais:
S_proton = { p | p satisfied the definition of a proton }
S_neutron = { n | n satisfied the definition of a neutron }
S_electron = { e | e satisfied the definition of an electron }
S_hydrogen = { h | h satisfied the definition of a hydrogen }
S_oxygen = { o | o satisfied the definition of an oxygen }
S_h2o = { w | w satisfied the definition of a h2o }
S_o2 = { o | o satisfied the definition of a o2 }
Níveis mais altos
Usando a terminologia da teoria dos conjuntos, o tipo A é um subtipo de B se A for um subconjunto de B.
Primeiro pensei que poderíamos definir o tipo Atom como:
S_atom = S_hydrogen union S_oxygen union ...
No entanto, os conjuntos são relações e os elementos são tuplas, portanto, a união não funciona se as tuplas nas relações forem incompatíveis.
As abordagens que usam tabelas de subtipos resolvem o problema e modelam o relacionamento do subconjunto.
Mas, na abordagem de subtipagem, o Atom ainda está nosegundo nível.
Tipos de nível superior são definidos como conjuntos de conjuntos.
S_atom = { S_hydrogen, S_oxygen, ... }
S_molecule = { S_h2o, S_o2, ... }
S_particle = { S_proton, S_neutron, S_electron, S_atom, S_molecule }
o que significa que partícula é o tipo de átomo e átomo é o tipo de hidrogênio.
Dessa forma, os relacionamentos entre as partículas podem ser representados em um nível alto.
O novo modelo de dados4. Trate os tipos como uma hierarquia de tiposParticleType (ParticleType, Nome)
ParticleTypeHierarchy (ParticleType, ParentType)
ParticleComposition (PartileType, SubParticleType, Quantity)
Dados de amostra:
ParticleType | ParticleType | Name | |--------------+----------| | Particle | Particle | | Proton | Proton | | Neutron | Neutron | | Electron | Electron | | Atom | Atom | | Molecule | Molecule | | H | Hydrogen | | O | Oxygen | | H2O | Water | | O2 | Oxygen | ParticleTypeHierarchy | ParticleType | ParentType | |--------------+------------| | Proton | Particle | | Neutron | Particle | | Electron | Particle | | Atom | Particle | | Molecule | Particle | | Hydrogen | Atom | | Oxygen | Atom | | H2O | Molecule | | O2 | Molecule | ParticleComposition | PartileType | SubParticleType | Quantity | |-------------+-----------------+----------| | H | Proton | 1 | | H | Electron | 1 | | He | Proton | 2 | | He | Neutron | 2 | | He | Electron | 2 | | H2O | H | 2 | | H2O | H | 2 | | H2O | O | 1 | | CO2 | C | 1 | | CO2 | O | 2 |
Para comparação, esses são os dados de amostra para uma abordagem de tabela de subtipo.
Particle | ParticleId | ParticleName | |------------+----------------| | H | Hydrogen | | He | Helium | | Li | Lithium | | Be | Beryllium | | H2O | Water | | O2 | Oxygen | | CO2 | Carbon Dioxide | Molecule | MoleculeId | some_attribute | |------------+----------------| | H2O | ... | | O2 | ... | | CO2 | ... | Atom | AtomId | ProtonQuantity | NeutronQuantity | ElectronQuantity | |--------+----------------+-----------------+------------------| | H | 1 | 0 | 1 | | He | 2 | 2 | 2 | | Li | 3 | 4 | 3 | | Be | 4 | 5 | 4 | ParticleComposition | ParticleId | ComponentId | Quantity | |------------+-------------+----------| | H2O | H | 2 | | H2O | O | 1 | | CO2 | C | 1 | | CO2 | O | 2 | | O2 | O | 2 |subátomo
Esses tipos de partículas são definidos por pessoas e as pessoas continuam definindo novos conceitos para modelar novos aspectos da realidade.
Podemos definir "sub-átomo" e a hierarquia será semelhante a:
A abordagem 4 pode acomodar essa alteração na hierarquia de tipos mais facilmente.
Atualização 2Os fatos a registrarExistem diferentes tipos de partículas no mundo: prótons, nêutrons, elétrons, átomos, moléculas.Os átomos são compostos de prótons, nêutrons e elétrons.As moléculas são compostas de átomos.Existem muitos tipos diferentes de átomos: hidrogênio, oxigênio, ....Existem muitos tipos diferentes de moléculas: H2O, O2, ....Um átomo de hidrogênio é composto de um próton e um elétron; ...Uma molécula de H2O é composta por dois átomos de hidrogênio e um átomo de oxigênio; ...Diferentes tipos de partículas podem ter propriedades especiais, p. Um átomo tem peso de átomo, etc....