リレーショナル トポロジを格納する次の方法を実装しました。
1.一般接合関係表:
表: 関係
列: id 親の型 親の ID 親のプロップ 子の型の子 ID 子供のプロップ
一般に、ほとんどの SQL エンジンで実行できない結合。
2.リレーション固有のジャンクション テーブル
表: Class2Student
列: id parent_id parent_prop child_id child_prop
どのジョインに対して実行できるか。
text
3.両方の双方向オブジェクトのフィールドに、関連するオブジェクトのリスト/文字列マップを格納します。
クラス: クラス
クラス プロパティ: ID 名前 学生
テーブルの列: ID 名 students_keys
行: 1 "履歴" [{type:Basic_student,id:1},{type:Advanced_student,id:3}]
[1,3]
SQL エンジンによる結合を有効にするために、students_keys の内容が単純である場合、つまりリレーションが明示的な型である場合はさらに簡単になるカスタム モジュールを作成することができますStudent
。
質問は、次のコンテキストで次のとおりです。
ジャンクション テーブルの要点がわかりません。たとえば、ジャンクション テーブルの次の引数が緩和すると主張する問題が実際に存在することを確認できません。
- 双方向のリレーションを論理的に正しく保存できない (たとえば、双方向のリレーションや
keys
フィールドとのリレーションにデータの孤立はありません。これは、再帰的に保存し、他の操作 (削除、更新) を非常に簡単に実行できるためです) - 効果的に参加できない
私は、ベスト プラクティスに関するあなたの個人的な意見や、正規化に関するカルトのような声明に対する意見を求めているわけではありません。
明確な質問は次のとおりです。
keys
所有しているオブジェクトのフィールドを照会することによって提供されないジャンクション テーブルを照会したい場合は、どのような場合ですか?- ジャンクションテーブルが望ましいSQLエンジンによって提供される計算のコンテキストにおける論理的な実装の問題は何ですか?
junction table
a フィールドとaフィールドに関する唯一の実装の違いkeys
は次のとおりです。
keys
次の性質のクエリを検索する場合は、カスタム インデックス実装またはその他の適切な実装のいずれかを使用して、フィールドと照合する必要があります。
class_dao.search({生徒:上級_生徒_3,名前:"履歴"});
特定の生徒と名前「history」を持つクラスを検索します
ジャンクション テーブルのインデックス付きの列を検索してから、適切なクラスを選択するのとは対照的です。
文字通り何らかの理由でジャンクションテーブルが論理的に好ましい理由を特定できませんでした。私はこれが事実であると主張しているわけではありません。また、これを達成するために複数の方法を実装したという事実によって証明されるように、何らかの形で宗教的な好みがあると主張しているわけでもありません。私の問題は、それらが何であるかわからないことです。