Relational data modeling for sub types

Я изучаю реляционную модель и моделирование данных.
И у меня есть некоторое замешательство в отношении подтипов.

Я знаю, что моделирование данных - это итеративный процесс, и существует множество различных способов моделирования вещей.
Но я не знаю, как выбирать между разными вариантами.

пример

Предположим, мы хотим смоделироватьчастицы (молекула, атом, протон, нейтрон, электрон, ...).
Давайте проигнорируем Quark и другие частицы для простоты.

Поскольку все частицы одного типа ведут себя одинаково, мы не собираемся моделировать отдельные частицы.
Другими словами, мы не собираемся хранить каждый атом водорода.
Вместо этого мы будем хранить водород, кислород и другие типы атомов.
То, что мы собираемся смоделировать, это на самом деле типы частиц и отношения между ними.

Я использую словотип" беспечно.
Атом водорода является примером. Водород это тип. Водород также является типом атома.
Да, существует иерархия типов. И мы игнорируем самый низкий уровень (отдельные частицы).

подходы

Я могу придумать несколько подходов для их моделирования.

1. Одна таблица (отношение, сущность) для каждого типа вещей (типы частиц).1.1 Первый подход, который приходит мне в голову.

Протон (Протон)
нейтрон (Нейтрон)
электрон (Electron)

Атом (Атом)
Atom_Proton (Атом, Протон, Количество)
Atom_Neutron (Атом, Нейтрон, Количество)
Atom_Electron (Атом, электрон, количество)

молекула (Молекула)
Molecule_Atom (Молекула, атом, количество)

1.2 Поскольку существует только один вид протона / нейтрона / электрона, мы можем упростить его.

Атом (Atom, ProtonQuantity, NeutronQuantity, ElectronQuantity)
молекула (Молекула)
Molecule_Atom (Молекула, атом, количество)

В этой упрощенной модели факты оПротон потеряны

2. Все вещи в одной таблице с ассоциативными таблицами, представляющими отношения между ними.2.1 одна ассоциативная таблица для каждого отношения

частица (Частицы)

Atom_Proton(Частица, частица, количество протонов)
Atom_Neutron(Частица, Частица, Нейтронное количество)
Atom_Electron(Частица, Частица, Электронное количество)
Molecule_Atom (Частица, Частица, AtomQuantity)

2.2 единая ассоциативная таблица

частица (Частицы)
ParticleComposition (Частица, Частица, Количество)

Это упрощение ничего не теряет. Я думаю, что это лучше.
Но если есть факты, которые относятся кAtom_Proton/Atom_Neutron/Atom_Electron2.1 может быть лучше.

2.3 объединить 2.1 и 2.2

частица (Частицы)

Atom_Proton (Частица, Частица, другие атрибуты)
Atom_Neutron (Частица, Частица, другие атрибуты)
Atom_Electron (Частица, Частица, другие атрибуты)Molecule_Atom (Частица, Частица, другие атрибуты)

ParticleComposition(Частица, Частица, Количество, другие атрибуты)

В этом подходе общие признаки о составе частиц входят вParticleComposition,
в то время как специальные атрибуты о составе частиц находятся в специальных таблицах.

3. Используйте таблицы подтипов.3.1 Стол для базового типачастицаи дополнительные таблицы для подтипов (Атом, молекула...).

частица (Частицы)

Протон (Частица, другие атрибуты)
нейтрон (Частица, другие атрибуты)
электрон (Частица, другие атрибуты)
Атом (Частица, другие атрибуты)
молекула (Частица, другие атрибуты)

Atom_Proton (Частица, частица, количество протонов)
Atom_Neutron (Частица, Частица, Нейтронное количество)
Atom_Electron (Частица, Частица, Электронное количество)
Molecule_Atom (Частица, Частица, AtomQuantity)

3.2 Мы также можем объединитьAtom_XXXQuantity таблицы в Atom и удалитьPronton/нейтрон/электрон.

частица (Частицы)

Атом (Частица, Протонное количество, Нейтронное количество, Электронное количество)
молекула (Частица, другие атрибуты)

Molecule_Atom (Частица, Частица, AtomQuantity)

Это проще, но информация оПротон/нейтрон/электрон теряется как в 1.2.

3.3 Мы можем изменить имяMolecule_Atom чтобы сделать его более общим.

частица (Частицы)

Атом (Частица, Протонное количество, Нейтронное количество, Электронное количество)
молекула (Частица, другие атрибуты)

ParticleComposition (Частица, Частица, Количество)

Это выглядит как 2.2, с дополнительными таблицами для подтипов (Атом, молекула).
Кажется, 2.2 является частным случаем 3.3.

3.4. Мы можем объединить все вышеперечисленные подходы и получить общую модель.

частица (Частицы)

Протон (Частица, другие атрибуты)
нейтрон (Частица, другие атрибуты)
электрон (Частица, другие атрибуты)
Атом (Частица, другие атрибуты)
молекула (Частица, другие атрибуты)

ParticleComposition (Частица, Частица, Количество, другие атрибуты)

Atom_Proton (Частица, Частица, другие атрибуты)
Atom_Neutron (Частица, Частица, другие атрибуты)
Atom_Electron (Частица, Частица, другие атрибуты)
Molecule_Atom (Частица, Частица, другие атрибуты)

Кажется, чтоAtom_Proton, Atom_Neutron, Atom_Electron а такжеMolecule_Atom можно рассматривать какподтипы изParticleComposition.

Этот подход является наиболее сложным, он содержит много таблиц, но каждая таблица имеет свою роль.

ВопросыНарушает ли какой-либо из приведенных выше проектов правила реляционной модели?Какой подход является лучшим? Зависит ли это от того, как мы думаем о данных? Зависит ли это от требований?

Если это зависит от требований, будем ли мы сначала выбирать самый простой дизайн, а затем делать его более общим для удовлетворения новых требований?
Хотя полученные в результате модели данных имеют много общего, первоначальный дизайн может влиять наименование таблиц / столбцов идомены из ключей разные.

Если мы решим использовать одну таблицу для каждого типа вещей, мы могли бы выбрать несовместимые ключи дляАтом а такжемолекула, такие каквес атома заАтом а такженазвание молекулы замолекула.Если мы решим использовать общий подход, мы можем выбрать общий ключ для всех частиц.
Изменение ключей может оказать большее влияние на систему, поэтому может быть нелегко перейти от простого проекта к общему.
Как вы думаете?

PS: Это может не быть подходящим примером, и решения могут быть проблематичными, и может быть больше вариантов подходов, но вы можете надеяться на это.
Если у вас есть лучшие проекты, пожалуйста, поделитесь со мной.

Обновление 1Какие данные для моделирования?

Первоначально я пытался смоделироватьчастицы так как

Я думаю, что между ними есть подтиповые отношения, и это именно то, что я ищу.Они хорошо поняты (?) Людьми.Это хороший пример того, как люди понимают мир.

Вот картинка в моей голове.

Я не сказал это ясно, потому что я не очень понимал, что я пытался смоделировать.
Сначала я подумал, что Atom является родителем Proton / Neutron / Electron, а Molecule является родителем Atom.
Тогда я понял, что речь идет о композиции, а не о подтипах и не оТип иерархии.

Типы

Некоторое время я думал о типах, а также о группировке и классификации.

Вот цитата из "SQL и реляционная теория«:

Так что же это за тип? По сути, этоименованный конечный набор значений ─ все возможные значения определенного типа: например, все возможные целые числа, или все возможные строки символов, или все возможные номера поставщиков, или все возможные XML-документы, или все возможные отношения с определенным заголовком (и т. Д.).

Люди придумали имя "Integer", чтобы представить набор целыхценности.
На самом деле, люди придумывали концепции и имена, чтобы идентифицировать вещи, группируя вещи так, чтобы мы могли понять / смоделировать мир.

Протон - это набор реальных протонов, Водород - это набор атомов водорода и так далее.
В этом смысле реальные частицы остаются насамый низкий уровень иерархии типов.
Сначала я пытался смоделировать все частицы, но потом застрял, потому что

Я не мог придумать подходящий ключ для идентификации каждой реальной частицы;их слишком много для хранения в базе данных.

Поэтому я решил игнорировать реальные частицы и моделировать типы вместо этого.

Когда мы говорим «молекула состоит из атомов», это означает, что «настоящая молекула H2O состоит из двух реальных атомов водорода и одного атома кислорода», это также означает, что «любая (тип) молекула состоит из (некоторых типов) атомы».

Вместо того чтобы констатировать каждый факт о реальных частицах, мы можем просто констатировать факты о типах частиц.
Это преимущество, которое мы получаем, группируя вещи и придуманные имена (типы).

Иерархия типов частиц как наборы

Иерархия может быть переведена в набор определений.

Второй уровень - типы над реальными частицами:

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 }

Более высокие уровни

Используя терминологию теории множеств, тип A является подтипом B, если A является подмножеством B.

Сначала я подумал, что мы можем определить тип атома как:

S_atom = S_hydrogen union S_oxygen union ...

Однако наборы являются отношениями, а элементы - кортежами, поэтому объединение не работает, если кортежи в отношениях несовместимы.

Подходы, использующие таблицы подтипов, решают проблему и моделируют отношения подмножеств.

Но в подходе подтипов, Атом все еще ввторой уровень.

Типы более высокого уровня определяются как наборы наборов.

S_atom = { S_hydrogen, S_oxygen, ... }
S_molecule = { S_h2o, S_o2, ... }
S_particle = { S_proton, S_neutron, S_electron, S_atom, S_molecule }

это означает, что Частица - это тип Атома, а Атом - это тип Водорода.

Таким образом, отношения между частицами могут быть представлены на высоком уровне.

Новая модель данных4. Рассматривать типы как иерархию типов.

ParticleType (ParticleType, Name)
ParticleTypeHierarchy (ParticleType, ParentType)
ParticleComposition (PartileType, SubParticleType, количество)

Пример данных:

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 |

Для сравнения это пример данных для таблицы подтипов.

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 |

суб-атом

Эти типы частиц определяются людьми, и люди продолжают определять новые концепции для моделирования новых аспектов реальности.
Мы можем определить «податом», и иерархия будет выглядеть так:

Подход 4 может легче приспособить это изменение иерархии типов.

Обновление 2Факты для записиВ мире существуют разные типы частиц: протоны, нейтроны, электроны, атомы, молекулы.Атомы состоят из протонов, нейтронов и электронов.Молекулы состоят из атомов.Есть много разных типов атомов: водород, кислород, ....Есть много разных типов молекул: H2O, O2, ....Атом водорода состоит из одного протона и одного электрона; ...Молекула H2O состоит из двух атомов водорода и одного атома кислорода; ...Частицы разных типов могут иметь особые свойства, например, Атом имеет вес атома и т. Д....

Ответы на вопрос(3)

Ваш ответ на вопрос