Есть ли у проекции типа противоположность, или это все еще проекция (или просто отображение)?
Это основано на моем предположении, что мы берем объект типа:
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 ответ
В реляционной алгебре проекция - это операция, которая принимает отношение и подмножество столбцов этого отношения и возвращает новое отношение. Новое отношение совпадает с отношением ввода, за исключением того, что оно содержит только указанные столбцы.
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
чем делать так называемую перевернутую проекцию. Опять же, они концептуально похожи, но вы действительно берете перекрестный продукт со значениями по умолчанию.