ORM является все еще “Вьетнам Информатики”?

Пожалуйста, не забудьте проверить параметр obj против null при переопределении Equals(). А также сравните тип.

public override bool Equals(object obj)
{
    if (obj == null || GetType() != obj.GetType())
        return false;

    Foo fooItem = obj as Foo;

    return fooItem.FooId == this.FooId;
}

Причиной этого является: Equals должен возвращать false при сравнении с null. См. Также http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

31
задан Jeff Atwood 31 December 2008 в 22:12
поделиться

8 ответов

Это все еще верно.

Еще больше, чем программное обеспечение OO, база данных страдает, если это не рассматривают точно предназначенный путь. И это не было предназначено, что необходимо вставить некоторый уровень абстракции перед ним.

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

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

RoR и шаблон ActiveRecord по достоинству заработали репутацию пожирателей ресурсов DBMS поэтому. Оптимизированный дизайн ActiveRecord является, как правило, субоптимальным дизайном SQL, потому что это поощряет разложение SQL-оператора.

40
ответ дан dkretz 11 October 2019 в 11:07
поделиться

Да.

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

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

Во всем программировании, существует компромисс между гибкость и предположения . Платформы (такие как направляющие) пытаются решить проблему, будучи "самоуверенными". Таким образом, они ограничивают гибкость или реляционного или объектно-ориентированных аспектов проблемы, делая предположения о том, как данные структурированы, и какие операции можно сделать с ним. Естественно, упрощение пространства задач делает решение более простым также.

, Кроме того, печально обнаружить, что платформа ORM является неполной, таким образом, некоторые обычные операции в SQL не имеют никакого решения в данном ORM. Это - также последствие "самоуверенных" платформ.

22
ответ дан Bill Karwin 11 October 2019 в 11:07
поделиться

Это не моя область знаний, но я работал в направляющих приблизительно в течение года, и я думаю, что ActiveRecord решил большую часть проблемы Отображения DB. Я понимаю, что это имеет несколько проблем, но я думаю, что это сделало фантастическое задание.

я не думаю, что его сообщение приняло во внимание возможность самой платформы (в этом случае AcitveRecord/Rails) определение базы данных AND the Object Model, которая - насколько я могу сказать - заставляет проблему уйти.

, Так как это - противоположность первых двух ответов (в основном, что сообщение устарело), я чувствую, что, вероятно, не понимаю что-то; Если это так, исправьте меня вместо того, чтобы просто провалить меня, потому что я думаю, что существует важная суть, которую я упускаю.

1
ответ дан Bill K 11 October 2019 в 11:07
поделиться

Я могу только говорить за свой опыт. Я использую DAL и DTO, и я все еще способен к выполнению довольно сложных запросов (соединения и все), и также я в состоянии обратиться к или пользовательскому SQL SP каждый раз, когда мне нужно. Это сделало мою жизнь легче, мой код последовательный и мои крайние сроки более достижимый.

8
ответ дан Otávio Décio 11 October 2019 в 11:07
поделиться

Я думаю, начиная с предположения, что заключения Jeff корректны, не обязательно хорошо; поддержав код хранимой процедуры, а также основанные на JDBC слои данных, я могу сказать, что эти вызванные проблемы обслуживания в изобилии, главным образом связанный с неспособностью понять, что продолжалось в более высоком уровне.

база данных А является обязательно низким уровнем; это хранит числа и строки по существу. Бизнес-логика является высоким уровнем. Поэтому у нас есть абстракция.

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

Так: не выводите ORM, но не принимайте значение по умолчанию к нему также. Это - инструмент, который решает определенные проблемы. Проигнорировать его было бы не осведомлено, и всегда использовать его будет высокомерно.

5
ответ дан davetron5000 11 October 2019 в 11:07
поделиться

Многие компании Web 2.0 работают над хранилищами ключей. И все эти компании вынуждены проходить один и тот же мучительный процесс, чтобы заставить его работать.

Если ORM - это «вьетнамская компьютерная наука», то создание собственного хранилища значений ключей - это, вероятно, «Ирак компьютерной науки» :-)

10
ответ дан 27 November 2019 в 21:37
поделиться

Я думаю, что это делает.

Я думаю, что последнее предложение является самым интересным из всех: "Я склонен допускать ошибку на стороне лагеря базы данных поскольку модель, потому что я думаю, что объекты переоценены". Java, C++ и C# являются, конечно, доминантными языками, но функциональное программирование делает возвращение с F#, Scala, и т.д.

1
ответ дан duffymo 27 November 2019 в 21:37
поделиться

Раскрытие: я - автор RDO.Net.

Да. Я полагаю, что существующие ORMs входят в неправильное направление - они пытаются отобразить реляционные данные в произвольные объекты, которые, по моему скромному мнению, просто не возможны. В мире OO произвольный объект не является дружественной сериализацией/десериализацией, потому что каждый объект имеет ссылку на объект (адрес), который локален для текущего процесса. Хорошо, когда Вы будете иметь дело с отдельным объектом, Вы попадете в беду при направлении с диаграммой составного объекта.

, Надо надеяться, эта проблема может быть решена с помощью другого подхода, как в RDO.Net: вместо того, чтобы отобразить реляционные данные в произвольные объекты, мы отображаем схему данных как богатые метаданные (Model, который содержит столбцы, основные / внешние ключи, проверки, и т.д.), и представьте бетон Db, DbTable, DbQuery и DataSet для доступа к данным. При выполнении операций базы данных CRUD Вы создаете Абстрактное синтаксическое дерево (AST) SQL явно с помощью языка OO со строгим контролем типов, как продемонстрировано в следующем демонстрационном коде C#, который создает запрос и возвращает DataSet для иерархических данных:

public async Task<DataSet<SalesOrderInfo>> GetSalesOrderInfoAsync(_Int32 salesOrderID, CancellationToken ct = default(CancellationToken))
{
    var result = CreateQuery((DbQueryBuilder builder, SalesOrderInfo _) =>
    {
        builder.From(SalesOrderHeader, out var o)
            .LeftJoin(Customer, o.FK_Customer, out var c)
            .LeftJoin(Address, o.FK_ShipToAddress, out var shipTo)
            .LeftJoin(Address, o.FK_BillToAddress, out var billTo)
            .AutoSelect()
            .AutoSelect(c, _.Customer)
            .AutoSelect(shipTo, _.ShipToAddress)
            .AutoSelect(billTo, _.BillToAddress)
            .Where(o.SalesOrderID == salesOrderID);
    });

    await result.CreateChildAsync(_ => _.SalesOrderDetails, (DbQueryBuilder builder, SalesOrderInfoDetail _) =>
    {
        builder.From(SalesOrderDetail, out var d)
            .LeftJoin(Product, d.FK_Product, out var p)
            .AutoSelect()
            .AutoSelect(p, _.Product)
            .OrderBy(d.SalesOrderDetailID);
    }, ct);

    return await result.ToDataSetAsync(ct);
}
0
ответ дан 27 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: