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

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

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

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

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 回答