6

これは、次のタイプのオブジェクトを取得するという私の仮定に基づいています。

public class Fruit : IBasicFruit, IFruitDetails
{
    // IBasicFruit implementation
    public string name { get; set; }
    public string color { get; set; }

    // IFruitDetails implementation
    public string scientific_name { get; set; }
    public bool often_mistaken_for_vegetable { get; set; }
    public float average_grams { get; set; }
    public int century_domesticated { get; set; }
}

...そしてそれからタイプのオブジェクトを作成します:

public class BasicFruit : IBasicFruit
{
    public string name { get; set; }
    public string color { get; set; }
}

...は「射影」または「型射影」として知られています(この射影は匿名型だけに適用されるわけではありません)。

ここで、サーバーからクライアントアプリケーションにシリアル化されたものを送信するとします。ここで、高度なファームロジックがこれらの2つの文字列に対して実行され、ORMがタイプをBasicFruit認識しないサーバーにのみ返送されます。エンティティタイプBasicFruitの。オブジェクトに基づいて(に存在しないプロパティを無視して)Fruit新しいオブジェクトを作成すると、ORMはそれを永続化できます。これは、サブセットからスーパーセットに移行するため、投影の反対です。それとも、投影と見なされますか。 、またはこれは単なるマッピングですか?FruitBasicFruitBasicFruit

投影はマッピングの一形態と見なすことができますか?

4

1 に答える 1

1

関係代数射影は、関係とその関係の列のサブセットを取得し、新しい関係を返す操作です。新しいリレーションは、指定された列しかないことを除いて、入力リレーションと同じです。

projection : Relation -> Column list -> Relation

指定された列の値が同じである場合、複数の行が同じ行に投影されるため、出力リレーションの行は入力リレーションよりも少ない場合があります。

ここで、逆の操作について考えてみましょう。

inverse_projection : Relation -> Column list -> Relation

ここに、列名が出力リレーションの列のサブセットである入力リレーションがあります。ここColumn listで、を出力リレーションの列にする必要があります。これは、入力リレーションの列のスーパーセットになります。一部の列値が指定されていない出力リレーションの行を作成する必要があるため、これは少し特殊です。純粋に関係代数の観点からは、これはあまり意味がありません。結局のところ、これらの不特定の列のデータはどこから来るのでしょうか?また、射影操作とは異なり、入力と出力の関係は常に同じ行数になります。

SQLでは、テーブルの列の一部のみを指定してデータを挿入できます。指定されていない列はデフォルト値になります。

INSERT INTO fruit (name, color) VALUES
('apple', 'red'),
('apple', 'green'),
('orange', 'orange');

関係代数に戻ると、これは関係の外積を取るようなものです...

NAME, COLOR
apple, red
apple, green
orange, orange

関係と..。

SCIENTIFIC_NAME, OFTEN_MISTAKEN_FOR_A_VEGETABLE, AVERAGE_GRAMS, CENTURY_DOMESTICATED
"", false, null, null

いわゆる逆投影を行うよりも。繰り返しになりますが、概念的には似ていますが、実際にはデフォルト値の外積を使用しています。

于 2010-12-09T08:23:22.880 に答える