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.

Exemplo

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).

Abordagens

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)

1.2 Como existe apenas um tipo de próton / nêutron / elétron, podemos simplificá-lo.

Á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 relacionamento

Partí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)


2.2 tabela associativa única

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.

2.3 combinar 2.1 e 2.2

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.

3. Use tabelas de subtipo.3.1 Uma tabela para o tipo basePartículae tabelas adicionais para subtipos (Átomo, Molécula, ...).

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)


3.2 Também podemos combinar oAtom_XXXQuantity tabelas no Atom e removaPronton/Nêutron/Elétron.

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.

3.4 Podemos combinar todas as abordagens acima e obter um modelo genérico.

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.

Se optarmos por usar uma tabela para cada tipo de coisa, poderíamos escolher chaves incompatíveis paraÁtomo eMolécula, tal comopeso do átomo paraÁtomo enome da molécula paraMolécula.Se optarmos por usar a abordagem genérica, poderemos escolher uma chave comum para todas as partículas.
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.

Atualização 1Quais são os dados para modelar?

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.

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

Não consegui pensar em uma chave apropriada para identificar cada partícula real;existem muitos deles para armazenar em um banco de dados.

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).

Hierarquia do tipo de partícula como conjuntos

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 tipos

ParticleType (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....