基本的に、ユーザーが階層モデルを定義できるようにしたいのですが、その場合、ユーザーが定義したモデル内にデータを保存できるようにする必要があります。これは理にかなっていますか?したがって、ユーザーは新しい「ユニット タイプ」を作成して階層的に編成し、これらのタイプのユニットをどのように編成できるかを決定できます。簡単な例: 私の架空のインターフェースでは、ユーザーはトランク、ブランチ、リーフの 3 つのユニット タイプを作成します。次に、ユーザーはそれらの間の関係を定義します。リーフは階層内の任意のポイントに存在でき、ブランチは親としてトランクを持つ必要があります。次に、ユーザーはこれらのユニット タイプのインスタンスを (ユニットとして) 作成し、モデルで定義されたルールに従ってそれらを編成できます...データベースでこれを行う良い方法はありますか?
3 に答える
これは非常に幅広い質問ですが、これは正しい方向を示している可能性があります。データベースにはリレーションシップ ルールしか格納できないことに注意してください。それらを強制するのは、クライアント コード次第です。試着してサイズを確認..
unit:
unit id,
name,
unit relationship:
unit id,
foreign unit id
次に、ユニット関係テーブルを次のように使用できます。
unit id
それが記述している単位に関連しています。
foreign unit id
null 可能である必要があります。
unit
関係レコードのない は、階層のルートにのみ存在できます。aunit
を持つ aは、その親としてnull
foreign unit id
他のものを持つことができます。unit
それ以外の場合、 aはその親としてunit
別のものを持っている必要がありunit
、そのタイプはその関係レコードで定義されているものの 1 つである必要があります。
インスタンス自体の保存に関しては、それは簡単なはずです..
instance:
instance id,
unit id,
parent instance_id
必要なフィールドが他にもあると思いますが (名前など)、ドリフトが発生すると思います。
次の 3 つの概念を実装する必要があります。
- 「ユニットタイプ」とその許可された関連付け
- ヒエラルキー
- 実際のユニット
これらの概念はモデル内で多かれ少なかれ独立して共存できますが、連携して機能します。
create table unittype
(
id int;
name varchar(20);
)
create table unitrelationship
(
id int;
parent_id int;
)
階層を自己参照テーブルとしてモデル化できます。
create table hierarchy
(
id int;
parent_id int;
unit_type_id int;
unit_id int;
)
次に、ユニット インスタンスを 1 つまたは複数のテーブルに配置し、それらを使用して説明したことを行うことができます。
create table unit
{
id int;
....
}
良いニュースは、許可された親の型のみを制約していることです。これは、たとえば、許可された型の既存のすべてのユニットのリストから親を選択することにより、ユーザー インターフェイスで簡単に適用できます。
複数の階層(1セットの子、複数の階層ビュー)をサポートする必要がありますが、同様の問題に取り組んでいます。JoeCelkoの「SQLforSmartiesのツリーと階層」(ISBN:1558609202)が便利だと思いました。私はまだ問題に取り組んでいますが、このトピックについて話し合うときに頻繁に出てくるので、言及するのが適切だと思われました。