Запрос данных из нескольких кластерных таблиц как одна единая - PullRequest
0 голосов
/ 12 апреля 2009

Я недавно начал работу над проектом, который включает создание веб-интерфейса отчетности для довольно старого программного обеспечения, отвечающего за управление некоторыми устройствами контроля доступа, такими как электронные дверные замки, например.
Я выбрал CakePHP для этой задачи, и все, что от него требуется - это запросить базу данных для записей журнала и отобразить их на веб-сайте. Программное обеспечение написано на C ++ и использует MSDE (уменьшенную версию Microsoft SQL Server 7.0 или 2000), и мне удалось настроить CakePHP, чтобы он успешно подключался к БД.

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

tbl_DoorEvent_2008_08_07
tbl_DoorEvent_2008_08_08
tbl_DoorEvent_2008_08_09
tbl_DoorEvent_2008_08_10
...

Я не очень знаком с MSDE, но все еще сомневаюсь, что это приемлемая практика - проектировать и поддерживать базу данных, подобную этой. Я не знаю, как программному обеспечению для настольных компьютеров удается анализировать всю информацию, когда она находится в этом формате, но моему приложению CakePHP очень тяжело разобраться в этом.

Я хочу придерживаться MVC для веб-приложения, но я не знаю, как реализовать DooreventModel в CakePHP, чтобы он получал информацию из всех секционированных таблиц.
Я пытался реализовать некоторые хаки, такие как

UNION ALL SELECT * FROM tbl_DoorEvent_2008_08_07
UNION ALL SELECT * FROM tbl_DoorEvent_2008_08_08
....

и такого рода работы, но когда я хочу выполнить ограничение WHERE для всего запроса или любого другого оператора SQL, это не сработает.

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

Я просто надеюсь, что кто-то придумает функцию SQLServer, которая будет объединять все таблицы в одну для меня каждый раз, когда я выполняю запрос, но я знаю, что это немного оптимистично, поэтому я действительно открыт для всех предложений. И, пожалуйста, помните, что решение должно работать с CakePHP и как отдельная модель в MVC

Ответы [ 2 ]

3 голосов
/ 12 апреля 2009

Вы можете использовать оператор where, если разместите объединения в подзапросе:

SELECT *
FROM (
    SELECT * FROM tbl_DoorEvent_2008_08_07
    UNION ALL 
    SELECT * FROM tbl_DoorEvent_2008_08_08
) sub
where sub.MyKey = MyValue

Или создать вид:

CREATE VIEW vw_MyView
AS
SELECT * FROM tbl_DoorEvent_2008_08_07
UNION ALL 
SELECT * FROM tbl_DoorEvent_2008_08_08

После этого вы можете запросить представление:

SELECT * from vw_MyView where MyKey = MyValue

P.S. Никогда не используйте * в производственных запросах, особенно не просмотры.

1 голос
/ 12 апреля 2009
...