类型投影是相反的,还是仍然投影(或只是映射)?

时间:2010-02-02 20:38:56

标签: .net orm mapping projection

这是基于我假设采用类型的对象:

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; }
}

...被称为“投影”或“类型投影”(该投影不仅适用于匿名类型)。

现在,假设我将一个序列化的BasicFruit从服务器发送到我的客户端应用程序,在那里对这两个字符串执行一些高度复杂的场逻辑,然后将其发送回服务器,其中ORM不知道BasicFruit类型,只知道Fruit实体类型。如果我基于Fruit对象创建一个新的BasicFruit对象(忽略BasicFruit中不存在的属性),那么我的ORM可以保留它,那是相反的投影,因为我从子集到超集,或者它仍然被认为是投影,还是这只是映射?

投影可以被视为一种映射形式吗?

1 个答案:

答案 0 :(得分: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

比做所谓的倒置投影。同样,它们在概念上是相似的,但您实际上正在使用具有默认值的交叉产品。