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