Всем привет. Sorry I did't know how to write subj in russian.
В общем, мне просто интересно, реализовано ли это хоть у кого-нибудь (LINQ, Nemerle) и как выглядит синтаксис. Потому что на скале в моём (не очень, если честно) любимом squeryl этого похоже нет. Проблема следующая:
Допустим, есть распределённая система на нескольких серверах, при этом приложение побито на модули и при сборке приложения под конкретный сервер можно указывать, какие модули в него линковать. К каждому модулю соответствует своя схема (в терминологии PostgreSQL) внутри базы данных. Т.е. если на сервер S1 попадают модули M1 и M2, то база данных этого сервера должна содержать schema m1, schema m2.
Допустим далее, что при наличии локальной схемы m2, модуль M1 может сильно оптимизировать свои запросы к базе, заджойнив таблицы из этой схемы m2 вместо того, чтобы обращаться к API модуля M2 на каждую запись. Можно, конечно, для каждого варианта компоновки написать полный запрос с нуля, но если запрос сложный, то дофига будет задвоений кода. Поэтому мечтается что-то следующего (сорри, синтаксиса LINQ я не знаю, пишу на squeryl):
case class PostX(post: Post, user: User, rating: Option[Rating])
// Общая часть запроса:
var q = from(T.post, T.user)((p,u) => where(u.id === p.authorId) select(PostX(p, u, None)))
if (модуль рейтингов прилинкован к приложению) {
q = addJoin(q, T.rating)((q,r) => where(r.postId === p.id) select(q.result.copy(rating = Some(r)))
}
В целом, интересуют любые соображения — и непосредственно по сабжу, и по самой архитектурной задумке. (Поэтому и запостил в "архитектуру", а не в "базы".)
Здравствуйте, dimgel, Вы писали:
D>D>case class PostX(post: Post, user: User, rating: Option[Rating])
D>// Общая часть запроса:
D>var q = from(T.post, T.user)((p,u) => where(u.id === p.authorId) select(PostX(p, u, None)))
D>if (модуль рейтингов прилинкован к приложению) {
D> q = addJoin(q, T.rating)((q,r) => where(r.postId === p.id) select(q.result.copy(rating = Some(r)))
D>}
D>
Примерно так:
var q = from p in T.post
from u in T.user
where u.id == p.authorId
select new {p, u, rating = (Rating?)null};
if (модуль рейтингов прилинкован к приложению) {
q = from _q in q
join r in T.rating on _q.p.id equals r.postId
select new {_q.p, _q.u, rating = (Rating?)r};
}