リレーショナル モデルとデータ モデリングを学んでいます。
そして、サブタイプに関して頭の中に混乱があります。
データ モデリングは反復プロセスであり、モデル化にはさまざまな方法があることを私は知っています。
しかし、さまざまなオプションから選択する方法がわかりません。
例
粒子(分子、原子、陽子、中性子、電子など)をモデル化するとします。
簡単にするために、クォークやその他の粒子は無視しましょう。
同じタイプの粒子はすべて同じように動作するため、個々の粒子をモデル化するつもりはありません。
別の言い方をすれば、すべての水素原子を保存するつもりはありません。
代わりに、水素、酸素、およびその他の原子タイプを保存します。
モデル化しようとしているのは、実際には粒子の種類とそれらの間の関係です。
「タイプ」という言葉をうっかり使っています。
水素原子はインスタンスです。水素はタイプです。水素も原子の一種です。
はい、関連する型の階層があります。そして、最低レベル (個々の粒子) を無視しています。
アプローチ
それらをモデル化するためのいくつかのアプローチを考えることができます。
1. モノのタイプ (粒子タイプ) ごとに 1 つのテーブル (関係、エンティティ)。
1.1 頭に浮かんだ最初のアプローチ。
陽子(陽子)
中性子(中性子)
電子(電子)
Atom (原子)
Atom_Proton (原子、陽子、数量)
Atom_Neutron (原子、中性子、数量)
Atom_Electron (原子、電子、数量)
Molecule (分子)
Molecule_Atom (分子、原子、量)
1.2 陽子/中性子/電子は 1 種類しかないので、簡略化できます。
Atom (原子、陽子量、中性子量、電子量)
Molecule (分子)
Molecule_Atom (分子、原子、量)
この単純化されたモデルでは、プロトンに関する事実は失われています。
2. すべてのものを 1 つのテーブルにまとめ、関連テーブルがそれらの間の関係を表します。
2.1 リレーションシップごとに 1 つの連想テーブル
粒子(粒子)
Atom_Proton (粒子、粒子、陽子量)
Atom_Neutron (粒子、粒子、中性子量)
Atom_Electron (粒子、粒子、電子量)
Molecule_Atom (粒子、粒子、原子量)
2.2 単一連想テーブル
Particle (粒子)
ParticleComposition (粒子、粒子、量)
この単純化によって何も失われることはありません。私はそれが良いと思います。しかし、 Atom_Proton / Atom_Neutron / Atom_Electron
に固有の事実がある場合は、2.1 の方が優れている可能性があります。
2.3 2.1 と 2.2 を組み合わせる
粒子(粒子)
Atom_Proton (粒子、粒子、その他の属性)
Atom_Neutron (粒子、粒子、その他の属性)
Atom_Electron (粒子、粒子、その他の属性)
Molecule_Atom (粒子、粒子、その他の属性)
ParticleComposition (粒子、粒子、量、その他の属性)
このアプローチでは、粒子組成に関する一般的な属性はParticleCompositionに入り、
粒子組成に関する特別な属性は特別なテーブルに入ります。
3. サブタイプ テーブルを使用します。
3.1 基本タイプParticleの表と、サブタイプ ( Atom、Moleculeなど) の追加表。
粒子(粒子)
Proton (粒子、その他の属性)
Neutron (粒子、その他の属性)
Electron (粒子、その他の属性)
Atom (粒子、その他の属性)
Molecule (粒子、その他の属性)
Atom_Proton (粒子、粒子、陽子量)
Atom_Neutron (粒子、粒子、中性子量)
Atom_Electron (粒子、粒子、電子量)
Molecule_Atom (粒子、粒子、原子量)
3.2 Atom のAtom_XXXQuantityテーブルを組み合わせて、 Pronton / Neutron / Electronを削除することもできます。
粒子(粒子)
原子(粒子、陽子量、中性子量、電子量)
分子(粒子、その他の属性)
Molecule_Atom (粒子、粒子、原子量)
より単純ですが、1.2 のように陽子/中性子/電子に関する情報が失われます。
3.3 Molecule_Atomの名前をより一般的なものに変更できます。
粒子(粒子)
原子(粒子、陽子量、中性子量、電子量)
分子(粒子、その他の属性)
ParticleComposition (粒子、粒子、数量)
これは 2.2 のように見えますが、サブタイプ ( Atom、Molecule ) のテーブルが追加されています。
2.2 は 3.3 の特殊なケースのようです。
3.4 上記のすべてのアプローチを組み合わせて、一般的なモデルを取得できます。
粒子(粒子)
Proton (粒子、その他の属性)
Neutron (粒子、その他の属性)
Electron (粒子、その他の属性)
Atom (粒子、その他の属性)
Molecule (粒子、その他の属性)
ParticleComposition (粒子、粒子、量、その他の属性)
Atom_Proton (粒子、粒子、その他の属性)
Atom_Neutron (粒子、粒子、その他の属性)
Atom_Electron (粒子、粒子、その他の属性)
Molecule_Atom (粒子、粒子、その他の属性)
Atom_Proton 、Atom_Neutron、Atom_Electron、Molecule_AtomはParticleCompositionのサブタイプと考えることができるようです。
このアプローチは最も複雑なもので、多くのテーブルが含まれていますが、各テーブルにはそれぞれの役割があります。
質問
- 上記の設計のいずれかがリレーショナル モデルのルールを破っていますか?
- どのアプローチが最適ですか? それは、データに対する考え方に依存しますか? それは要件に依存しますか?
要件に依存する場合は、最初に最も単純な設計を選択し、新しい要件に対応するためにそれをより一般的なものにしますか?
結果として得られるデータ モデルには多くの類似点がありますが、最初の設計がテーブル/列の命名に影響する可能性があり、キーのドメインが異なります。- 物事の種類ごとに 1 つのテーブルを使用することを選択した場合、Atom の原子量と Molecule の分子名など、Atom と Molecule に互換性のないキーを選択する可能性があります。
- 一般的なアプローチを使用する場合は、すべてのパーティクルに共通のキーを選択できます。
キーを変更すると、システムへの影響が大きくなる可能性があるため、単純な設計から一般的な設計に進化させるのは容易ではない可能性があります。
どう思いますか?
PS:これは適切な例ではない可能性があり、解決策には問題がある可能性があり、アプローチにはさらにバリエーションがある可能性がありますが、うまくいけば要点を理解できます。
より良いデザインがあれば、私と共有してください。
更新 1
モデル化するデータは何ですか?
最初は、粒子をモデル化しようとしていました。
- それらの間にサブタイピング関係があると思います。これはまさに私が探しているものです。
- 彼らは人々によく理解されています(?)。
- これは、人々が世界をどのように理解しているかを示す良い例です。
ここに私の心の絵があります。
私が何をモデル化しようとしているのかについてもあまり明確ではなかったので、私はこれを明確に述べませんでした.
最初に、Atom は Proton/Neutron/Electron の親であり、Molecule は Atom の親であると考えました。次に、これはコンポジションに関するものであり、サブタイピングに関するものではなく、 Type Hierarchy
に関するものではないことに気付きました。
種類
しばらくの間、タイプ、およびグループ化と分類について考えてきました。
以下は " SQL and Relational Theory "からの引用です:
では、タイプとは正確には何ですか?本質的に、これは名前付きの有限の値のセットです─ 特定の種類の可能なすべての値: たとえば、可能なすべての整数、可能なすべての文字列、可能なすべてのサプライヤー番号、すべての可能な XML ドキュメント、または可能なすべての関係特定の見出し (など)。
整数値のセットを表すために「整数」という名前が付けられました。
実際、人々は物事を識別するために概念と名前を作り出し、世界を理解/モデル化できるように物事をグループ化しました。
陽子は実際の陽子の集合、水素は水素原子の集合などです。
この意味で、実際のパーティクルは型階層の最下位レベルにとどまります。
最初はすべての粒子をモデル化しようとしていましたが、行き詰まってしまいました。
- それぞれの実際の粒子を識別するための適切なキーを思いつきませんでした。
- それらが多すぎてデータベースに保存できません。
そこで、実際の粒子を無視して、代わりに型をモデル化することにしました。
「分子は原子で構成されている」と言うとき、それは「実際の H2O 分子は 2 つの実際の水素原子と 1 つの酸素原子で構成されている」ことを意味し、「任意の (タイプの) 分子が (いくつかのタイプの) で構成されている」ことも意味します。アトム」。
実際の粒子に関するすべての事実を述べる代わりに、粒子の種類に関する事実を述べることができます。
それが、モノや造語(タイプ)をグループ化することで得られるメリットです。
セットとしての粒子タイプ階層
階層はセット定義に変換できます。
第 2 レベル - 実際の粒子の上のタイプ:
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 のサブタイプです。
Atom 型を次のように定義できると最初に考えました。
S_atom = S_hydrogen union S_oxygen union ...
ただし、セットはリレーションで要素はタプルであるため、リレーション内のタプルに互換性がない場合、結合は機能しません。
サブタイプ テーブルを使用するアプローチは、問題を解決し、サブセットの関係をモデル化します。
しかし、サブタイピング アプローチでは、Atom はまだ2 番目のレベルにあります。
より高いレベルのタイプは、セットのセットとして定義されます。
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, Quantity)
サンプルデータ:
粒子タイプ | | 粒子タイプ | 名前 | |------+----------| | | 粒子 | 粒子 | | | 陽子 | 陽子 | | | 中性子 | 中性子 | | | 電子 | 電子 | 電子 | 電子 | | | アトム | アトム | | | 分子 | 分子 | | | ひ | 水素 | | | お | 酸素 | | | H2O | 水 | 水 | | | O2 | 酸素 | ParticleTypeHierarchy | | 粒子タイプ | 親タイプ | | --------------+------------ | | | 陽子 | 粒子 | | | 中性子 | 粒子 | | | 電子 | 電子 | 粒子 | | | アトム | 粒子 | | | 分子 | 粒子 | | | 水素 | アトム | | | 酸素 | アトム | | | H2O | 分子 | | | O2 | 分子 | 粒子組成 | | 粒子タイプ | サブパーティクル タイプ | 数量 | |-------------+-----------------+----------| | | ひ | 陽子 | 1 | | | ひ | 電子 | 電子 | 1 | | | 彼 | 彼 | 陽子 | 2 | | | 彼 | 彼 | 中性子 | 2 | | | 彼 | 彼 | 電子 | 電子 | 2 | | | H2O | ひ | 2 | | | H2O | ひ | 2 | | | H2O | お | 1 | | | CO2 | シー | 1 | | | CO2 | お | 2 |
比較のために、これはサブタイプ テーブル アプローチのサンプル データです。
粒子 | | パーティクル ID | パーティクル名 | |------------+----------------| | | ひ | 水素 | | | 彼 | 彼 | ヘリウム | | | 李 | リチウム | | | | なる | ベリリウム | | | H2O | 水 | 水 | | | O2 | 酸素 | | | CO2 | 二酸化炭素 | 分子 | | 分子 ID | some_attribute | |------------+----------------| | | H2O | ... | | | O2 | ... | | | CO2 | ... | 原子 | | AtomId | 陽子量 | 中性子量 | 電子量 | |--------+----------------+-----------------+----- -------------| | | ひ | 1 | 0 | 1 | | | 彼 | 彼 | 2 | 2 | 2 | | | 李 | 3 | 4 | 3 | | | | なる | 4 | 5 | 4 | 粒子組成 | | パーティクル ID | コンポーネント ID | 数量 | |------------+-------------+----------| | | H2O | ひ | 2 | | | H2O | お | 1 | | | CO2 | シー | 1 | | | CO2 | お | 2 | | | O2 | お | 2 |
サブアトム
これらの粒子タイプは人々によって定義され、人々は現実の新しい側面をモデル化するために新しい概念を定義し続けています。
「サブアトム」を定義すると、階層は次のようになります。
アプローチ 4 は、この型階層の変更により簡単に対応できます。
更新 2
記録する事実
- 世界には、陽子、中性子、電子、原子、分子など、さまざまな種類の粒子があります。
- 原子は、陽子、中性子、および電子で構成されています。
- 分子は原子で構成されています。
- 原子には、水素、酸素など、さまざまな種類があります。
- 分子には、H2O、O2 など、さまざまな種類があります。
- 水素原子は、1 つの陽子と 1 つの電子で構成されています。...
- H2O 分子は、2 つの水素原子と 1 つの酸素原子で構成されています。...
- 異なるタイプの粒子には特別な特性があります。たとえば、原子には原子の重さがあります。
- ...