Кто-нибудь написал язык запросов более высокого уровня (чем sql), который генерирует sql для общих задач на ограниченных схемах - PullRequest
2 голосов
/ 12 июля 2009

Sql является стандартом в языках запросов, однако иногда он немного многословен. В настоящее время я пишу ограниченный язык запросов, который сделает мои общие запросы быстрее и с меньшими затратами на ум.

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

Таким образом, запрос может выглядеть следующим образом.

select s.name, region.description from shop s
where monthly_sales.amount > 4000 and s.staff < 10

отношения будут

магазин - много к одному - регион,

магазин - один ко многим - month_sales

sql, к которому будет относиться, будет

select distinct s.name, r.description 
from shop s 
join region r on shop.region_id = region.region_id 
join monthly_sales ms on ms.shop_id = s.shop_id  
where ms.sales.amount > 4000 and s.staff < 10 

(отличное есть, когда вы присоединяетесь к таблице один ко многим (month_sales), и вы не выбираете поля из этой таблицы)

Я понимаю, что оригинальный запрос, приведенный выше, может быть неоднозначным для определенных схем, т. Е. При наличии двух маршрутов связи между двумя таблицами. Однако есть способы (большинство) из них, особенно если вы ограничиваете разрешенную схему. В любом случае, большинство возможных схем не стоит рассматривать.

Мне просто интересно, есть ли попытки сделать что-то подобное? (Я видел большинство решений orm для облегчения некоторых запросов)

РЕДАКТИРОВАТЬ: Мне действительно очень нравится sql. Я использовал решения orm и посмотрел на linq. Лучшее, что я видел до сих пор, это SQLalchemy (для python). Однако, насколько я видел, они не предлагают то, что мне нужно.

Ответы [ 6 ]

2 голосов
/ 12 июля 2009

Я думаю, вам было бы лучше потратить время, просто писать больше SQL и чувствовать себя более комфортно с ним. Большинство разработчиков, которых я знаю, прошли через эту стадию, когда их первоначальное знакомство с SQL вдохновило их полностью обойти его, написав собственный ORM или набор вспомогательных классов, которые автоматически генерируют для них SQL. Обычно они продолжают добавлять и улучшать его, пока он не станет таким же сложным (если не более), чем SQL. Результаты иногда довольно комичны - я унаследовал одно приложение, в котором были классы с именами «And.cs» и «Or.cs», основными функциями которых было добавление слов «AND» и «OR» соответственно в строку. 1001 *

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

2 голосов
/ 12 июля 2009

Hibernate и LinqToSQL делают именно то, что вы хотите

1 голос
/ 12 июля 2009

Entity SQL на немного более высокий уровень (местами), чем Transact SQL. Кроме этого, HQL и т. Д. Для подходов объектной модели LINQ (IQueryable<T>) - это намного более высокий уровень, обеспечивающий простую навигацию:

var qry = from cust in db.Customers
          select cust.Orders.Sum(o => o.OrderValue);

и т.д.

1 голос
/ 12 июля 2009

Я верю, что любая (достойная) ORM будет здесь полезна ..

0 голосов
/ 12 июля 2009

Не уверен, что это соответствует тому, что вы ищете, но я генерировал SQL динамически из определения объектов доступа к данным; Идея состоит в том, чтобы отразить класс и по умолчанию предположить, что его имя является именем таблицы, а все свойства являются столбцами. У меня также есть объекты критериев поиска, чтобы построить часть, где. DAO могут содержать списки других классов DAO, которые управляют объединениями.

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

0 голосов
/ 12 июля 2009

Мартин Фаулер вложил в это весь заряд энергии и создал шаблон Active Record . Я думаю, это то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...