Запрос данных из нескольких кластерных таблиц как одна единая

Недавно я начал работу над проектом, который включает создание веб-интерфейса отчетности для довольно старого программного обеспечения, отвечающего за управление некоторыми устройствами контроля доступа, такими как электронные дверные замки, например.
Я выбрал 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 ответа

Вы можете использовать оператор 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

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

Вы, вероятно, хотите разделить представление?

Другие вопросы по тегам