Есть ли у проекции типа противоположность, или это все еще проекция (или просто отображение)? - PullRequest
6 голосов
/ 02 февраля 2010

Это основано на моем предположении, что мы берем объект типа:

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 Ответ

1 голос
/ 09 декабря 2010

В реляционной алгебре проекция - это операция, которая принимает отношение и подмножество столбцов этого отношения и возвращает новое отношение. Новое отношение совпадает с отношением ввода, за исключением того, что оно содержит только указанные столбцы.

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

чем занимаемся так называемой перевернутой проекцией. Опять же, они концептуально похожи, но вы действительно берете перекрестный продукт со значениями по умолчанию.

...