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

Jay*_*Jay 6 .net mapping orm 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; }
}
Run Code Online (Sandbox Code Playgroud)

...并从中创建一个类型的对象:

public class BasicFruit : IBasicFruit
{
    public string name { get; set; }
    public string color { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jak*_*ell 1

在关系代数中,投影是一种采用关系和该关系列的子集并返回新关系的运算。新关系与输入关系相同,只是它仅具有指定的列。

projection : Relation -> Column list -> Relation
Run Code Online (Sandbox Code Playgroud)

输出关系中的行数可能少于输入关系中的行数,因为如果指定列的值相同,则多行将投影到同一行。

现在考虑逆运算:

inverse_projection : Relation -> Column list -> Relation
Run Code Online (Sandbox Code Playgroud)

这里我们有一个输入关系,其列名是输出关系中列的子集。现在我们需要Column list输出关系的列,它现在是输入关系中列的超集。这有点奇怪,因为我们必须为输出关系创建行,其中某些列值未指定。纯粹从关系代数的角度来看,这没有多大意义。毕竟,这些未指定列的数据来自哪里?此外,与投影操作不同,输入和输出关系始终具有相同的行数。

在 SQL 中,我们可以通过仅指定表的某些列来插入数据。未指定的列采用默认值。

INSERT INTO fruit (name, color) VALUES
('apple', 'red'),
('apple', 'green'),
('orange', 'orange');
Run Code Online (Sandbox Code Playgroud)

回到关系代数,这更像是关系的叉积......

NAME, COLOR
apple, red
apple, green
orange, orange
Run Code Online (Sandbox Code Playgroud)

与...的关系

SCIENTIFIC_NAME, OFTEN_MISTAKEN_FOR_A_VEGETABLE, AVERAGE_GRAMS, CENTURY_DOMESTICATED
"", false, null, null
Run Code Online (Sandbox Code Playgroud)

而不是进行所谓的倒置投影。同样,它们在概念上很相似,但您实际上是在使用默认值进行叉积。