gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:03:07 24 4
gpt4 key购买 nike

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

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 : 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

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

关于.net - 类型投影有相反的,还是仍然是投影(或只是映射)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2187518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com